计算机原理-Linux 网络I/O模型

微信一面:一致性哈希是什么,使用场景,解决了什么问题? 在逛牛客网的面经的时候,发现有位同学在面微信的时候,被问到这个问题: 第一个问题就是:一致性哈希是什么,使用场景,解决了什么问题? 这个问题还挺有意思的,所以今天就来聊聊这个。 发车! 如何分配请求? 大多数网站背后肯定不是只有一台服务器提供服务,因为单机的并发量和数据量都是有限的,所以都会用多台服务器构成集群来对外提供服务。 但是问题来了,现在有那么多个节点(后面统称服务器为节点,因为少一个字),要如何分配客户端的请求呢? 其实这个问题就是「负载均衡问题」。解决负载均 阅读详情

在开始讲网络IO模式之前,我们先来熟悉一下几个概念:

  • 用户空间和内核空间

  • 进程切换

  • 文件描述符

  • buffer IO

 

用户空间和内核空间

在Linux中不管是内核空间还是用户空间都是使用虚拟地址,在32位平台而言,它的寻址范围是4GB,如下图所示:

所以从较低3GB(0x00000000到0xBFFFFFFF)称之为用户空间,较高1GB(0xC0000000到0xFFFFFFFF)称之为内核空间。在我的《Linux内存管理》文章有更加详细的说明,可自行前往参考。

 

进程切换

在Linux中存在多线程的情况下,肯定需要进程的切换,也就是说需要挂起正在运行的进程,然后运行正在就绪状态的进程。这种行为我们称之为进程切换。进程切换有哪些变化呢?

  1. 首先需要保存寄存器现场,保存处理机上下文

  2. 更新PCB信息

  3. 把进程的PCB加入到某些队列中(例如就绪队列)

  4. 选择需要运行的进程,并且执行,然后更新其PCB

  5. 更新内存管理的结构

  6. 恢复处理机上下文

虽然从这六个步骤中,无法感觉,但是真的挺繁琐的,非常消耗CPU资源。

 

文件描述符

文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

 

buffer IO

buffer IO也就是标准IO,是默认的IO模式。在用户态write或者read等IO操作时,内核中数据是存储在文件系统的页缓存中。它有个缺点:许多多次拷贝的消耗,带来CPU和内存的消耗。在本人之前的《Linux直接IO原理》中有详细比较两种IO的优缺点。

 

IO模型

先直接给出五种网络模型:

  1. 阻塞I/O

  2. 非阻塞I/O

  3. I/O多路复用

  4. 信号驱动I/O

  5. 异步I/O

 

在Linux中,socket的I/O默认都是阻塞的,流程图,如下:

当应用程序调用recvfrom系统调用,内核进入第一个阶段:等待数据。所以在用户态这边整个进程都会阻塞。当内核准备数据之后,还需要将数据拷贝到用户态内存,然后才会return,之后用户进程才会接触阻塞状态。

 

非阻塞I/O

设置I/O属性可以修改socket为非阻塞模式,当进行读操作时候,流程图如下图:

当用户进程read操作时候,如果内核还没数据,就会返回无数据状态。在用户进程的角度上,如果是无数据,继续recvfrom等待。直到内核数据准备好,拷贝到用户空间内存中。所以非阻塞I/O需要用户进程一直轮询IO。

 

I/O多路复用(I/O multiplexing)

IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select,poll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。epoll的方式有所不一样,这里不展开。

从图中我们可以看出,当调用select,整个进程都会阻塞,select可以同时监听多个socket,一旦其中任意一个socket准备就绪状态,select就会立即返回,用户进程就可以read操作了。

上图和阻塞IO的图其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而阻塞 IO只调用了一个系统调用(recvfrom)。但是,select的真正优势在于它可以同时处理多个connection。

所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。)

在IO multiplexing 模型中,实际中,对于所有的socket,一般都设置成为非阻塞的。但是,如上图所示,整个用户进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞的,而不是被socket IO给阻塞。

异步I/O

Linux中异步I/O其实用的很少。下图流程:

用户进程发起read操作之后,这个时候就可以去干其他事情了。而从kernel的角度,当它受到一个异步 read之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,内核会给用户进程发送一个信号,告诉它read操作完成了。

 

总结

看下图各I/O模型比较图:

从图中我们可以发现,非阻塞和异步的区别还是很明显的,在非阻塞中进程大部分不会阻塞的,但是需要主动check I/O。而异步I/O就不需要,内核将数据拷贝完成后,发送信号通知进程就行了。

 

 

觉得不错,记得关注,转发,点赞!

禾迈电力电子嵌入式面经和参考答案 双向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含三个部分:数据域、前驱指针和后继指针。数据域用于存储数据元素,前驱指针指向前一个节点,后继指针指向后一个节点。双向链表的优点众多。从遍历角度来看,它既可以正向遍历,即从链表的头节点开始,通过后继指针依次访问每个节点;也可以反向遍历,从链表的尾节点开始,利用前驱指针逐个访问节点,这为数据的操作提供了很大的灵活性。在插入和删除操作方面,双向链表比单向链表更具优势。 阅读详情

相关推荐

【NAS系统】DSM7.2部署SVN服务

早期的群晖版本可以在套件中心找到SVN Server直接安装,然后配置仓库和用户。但‌2提到DSM7.0之后套件中心没有SVN了,得用Docker。

qq_38350004的博客 4849

linux select read阻塞_图解Linux的IO模型和相关技术

阻塞IO模型(Blocking I/O)Linux 内核一开始提供了 read 与 write 阻塞式操作。当客户端连接时,会在对应进程的文件描述符目录(/proc/进程号/fd)生成对应的文件描述符(0 标准输入;1 标准输出;2 标准错误输出;),比如 fd 8 , fd 9;应用程序需要读取的时候,通过系统调用 read (fd8)读取,如果数据还没到来,此应用程序的进程或线程会阻塞等待。m...

weixin_39801714的博客 955

Oracle 19c RAC安装踩坑实录:OpenSSH 8.x版本与OUI的“兼容性战争”及一劳永逸的解决思路

本文深入解析Oracle 19c RAC在Linux8环境中部署时遇到的OpenSSH 8.x版本兼容性问题,特别是[INS-06006]错误的根源与解决方案。从协议层分析冲突本质,提供SCP包装器技术、官方补丁应用指南及现代化部署体系构建三种解决方案,帮助企业高效完成RAC安装并规避类似问题。

weixin_42648844的博客 457

linux select read阻塞_一文带你区分阻塞、非阻塞、同步、异步IO

前言:在之前的Redis面试套路拆解的文章[Redis面试套路拆解(一)]中有提到过IO模型,并且IO模型本身也是一个比较容易混淆的高频面试考点,小黑板将在本篇文章帮你理清思路,区分各种IO模型~其实网络上已经有很多博客讲了这个问题,但是总是觉得看完之后还是迷迷糊糊的,感觉大家有点太执着于把这个问题讲的通俗易懂了,经常会举各种各样的例子,比如烧水、去银行办理业务之类的,然而看完之后反倒会产生更多的...

weixin_39946364的博客 601

【同花顺公式编辑教程】第3章 获取数据

学习同花顺公式编辑器,其提供的数据有量价数据以及财务数据。在本章中,我们讲解了编辑器执行代码的原理,并给出了可调用数据的汇总表。

LiaoYi2016218的博客 1万+

【技术实践指南】Python解析FactSet Revere供应链数据:构建企业级断裂与重构监测指标

本文提供了一份企业级Python实践指南,详细解析如何利用FactSet Revere供应链数据库,构建供应链断裂与重构监测指标。内容涵盖数据清洗、关系对筛选、时间序列处理及核心指标(断裂、恢复、转移)的工程化实现,旨在帮助数据工程师与分析师搭建自动化、可解释的供应链风险监控系统。

weixin_29051811的博客 931

Linux select入门

select用来等待信号发生,如果有信号发生,就会给用户机会处理信号。 下面的程序等待用户从键盘输入,如果没有输入,就一直等待: #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { fd_set read_fd_set; FD_ZERO(&

C++ 爱好者 make_it_simple888 920

Petalinux 2021.2 下 Qt组件编译报错?手把手教你修改bb文件搞定qt3d/qtquickcontrols2

本文详细解析了Petalinux 2021.2环境下Qt组件(如qt3d、qtquickcontrols2)编译报错的解决方案。通过修改bb文件或使用bbappend文件覆盖,有效解决`petalinux-build --sdk`命令执行时的源码获取失败或哈希校验不匹配问题,并提供验证与调试技巧,帮助开发者快速修复构建流程中断问题。

weixin_29188997的博客 216

select检测到可读,调用read的情况

1、当是接收缓冲区的数据大于低潮阀值时,调用read返回实际读出的字节数 2、收到FIN,调用read返回的是0 3、收到RST,调用read返回-1

多看多听多总结 3880

利用baostock获取上市公司财务指标

利用baostock获取上市公司的财务指标 1、导入模块,登录baostock import baostock as bs import pandas as pd import time # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) 2、查询股票代码、行业板块 # 查询股票代码 rs=.

firefox_yau的博客 2098

沁恒CH32V208GBU6读写芯片内部FLASH:代码空间;使用OTA时候的代码空间;保存结构体到FLASH

沁恒CH32V208GBU6读写芯片内部FLASH:代码空间;使用OTA时候的代码空间;保存结构体到FLASH

cheng___yi的博客 555

网络/Network - 网络I/O模型 - 学习/实践

主要用于学习计算机网络中的网络I/O的各种模型,以及各自的优缺点,使用场景。

"代码"的日常搬运 1084

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

网络编程中的BIO,NIO和AIO及Java实现

在处理 IO 的时候,阻塞和非阻塞都是同步 IO。 BIO,blocking IO:同步阻塞 , sychronized , block NIO,new IO:同步非阻塞 ,Non-block I/O AIO:异步非阻塞 , Asychronized 阻塞/非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。即等待I/O完成的方式 阻塞要求用户程序等待,线程被挂起,直到IO完成,调用线程只有在得到结果之后才会返回; 而非阻塞程序继续执行,调用不会阻塞当前线程。 同步/异步 同步和异

www.yiye.tech 316

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

netty真正从入门到精通

一、Java网络编程基础 1、计算机网络体系结构 2、OSI七层模型各层的作用 层名 作用 应用层 网络服务与最终用户的一个接口 表示层 把应用层提供的信息变换为能够共同理解的形式 会话层 建立、管理、终止会话。 传输层 定义传输数据的协议端口号,以及流控和差错校验。 网络层 .

qq_32861259的博客 928

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux网络基础知识----网络编程

TCP向应用层提供可靠的面向连接的数据流传输服务,应用程序通过向TCP提交数据发送/接收端的地址和端口号而实现应用层程序的数据通信。Linux命令sudo netstat -tpna | grep 端口号可查看连接的服务端和客户端的地址、端口和状态信息独立于具体协议的网络编程接口在OSI模型中,主要位于会话层和传输层之间。在Linux 下,套接字是一种特殊的I/O接口,也是一种文件描述符。操作selectpollepoll初始化每次重建fd_set初始化pollfd数组通过epoll_ctl。

2502_90801893的博客 328

把扫描PDF变成可搜索文档:开源OCR工具完整指南

你手里有一份200页的扫描论文,想找个关键词,Ctrl+F 搜了半天,一个字都匹配不上。不是你没搜对,而是这份 PDF 里根本没有文字——每一页其实只是一张"看起来像文字"的图片。 OCRmyPDF 就是为这件事做的开源工具:它给扫描 PDF 做一遍光学字符识别(OCR),在原始图像下面垫一层真正的文本层,让文档变得可搜索、可复制、可粘贴。图像一个字都不会改,只是多了一个"影子"文本层。 ##

gitblog_01062的博客 945

秋招C++开发学习之路day24

day28(阻塞与非阻塞、IO模型、同步与阻塞、异步与非阻塞、atoi、assert、字符拼接等) 阻塞与非阻塞 阻塞:阻塞的系统是指,当进行系统调用的时候,除非出错(被信号打断也视为出错),进程将会一直陷入内核态直到调用完成。 非阻塞:非阻塞的系统调用是指无论I/O操作成功与否,调用都会立即返回。 在linux环境下,所有的I/O系统调用都是阻塞的,我们可以给socket系统调用的第二个参数S...

weixin_42925054的博客 312

网络编程之 Socket的模式(二) --- “Linux网络I/O模型”

1. Linux下网络I/O模型          对于Linux系统,Richard Stevens在中提到了5种网络I/O模型(下面的图也来自于这本书),分别是:          1. 阻塞式I/O模型          2. 非阻塞I/O模型          3. I/O复用模型          4. 信号驱动I/O模型          5. 异步I/O模型

zhiweiyang的专栏 529

Unix 中的五种网络 I/O 模型

看了这几篇文章,大概也就懂了 网络 I/O 模型 https://blog.youkuaiyun.com/phunxm/article/details/73008713 简明网络I/O模型—同步异步阻塞非阻塞之惑 https://www.jianshu.com/p/55eb83d60ab1 Linux 网络 I/O 模型简介(图文) https://blog.youkuaiyun.com/anxpp/arti...

HeatDeath的博客 1795

Linux下的I/O模型

Linux下的I/O模型1、Linux下的I/O模型2、多路复用模型 1、Linux下的I/O模型 Linux下5种IO模型的小结 2、多路复用模型 select、poll、epoll之间的区别

qq_24001803的博客 250

linux DMA机制实现(e1000资源分配)

目录 1 计算机组成原理中的DMA 1.1 外设(I/O)和内存之间的数据传送控制3种方式 1.2I/O设备与主存信息传送的控制方式(图解) 1.3三种方式的CPU工作效率比较 2 Linux网络子系统中DMA机制的实现 2.1 DMA机制在TCP/IP协议模型中的位置 2.2数据链路层上网卡对数据包的处理 2.3 源码分析具体网卡(4.19内核) 1 计算机组成原理中的DMA 1.1 外设(I/O)和内存之间的数据传送控制3种方式 以往的I/O设备和主存交换信息都要经过CP...

2573

转:五种I/O模型和select函数简介

源地址:http://blog.youkuaiyun.com/jnu_simba/article/details/9070955 一、五种I/O模型 1、阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的buf),然后recv返回,进行数据处理。 ...

weixin_30527143的博客 201

图解系统-小林coding笔记

CPU 的硬件参数都会有 GHz 这个参数,比如⼀个 1 GHz 的 CPU,指的是时钟频率是 1 G,代表着 1 秒会产⽣ 1G 次数的脉冲信号,每⼀次脉冲信号⾼低电平的转换就是⼀个周期,称为时钟周期。不同的 CPU 有不同的指令集,也就是对应着不同的汇编语⾔和不同的机器码,接下来选⽤最简单的 MIPS指集,来看看机器码是如何⽣成的,这样也能明⽩⼆进制的机器码的具体含义。对于 CPU 来说,在⼀个时钟周期内, CPU 仅能完成⼀个最基本的动作,时钟频率越⾼,时钟周期就越短,⼯作速度也就越快。

小小博客 869

2015阿里基础平台研发笔试复盘:操作系统与网络核心考点解析

操作系统与计算机网络是计算机科学的两大基石,也是研发岗位面试中最能检验候选人对底层机制理解深度的领域。从进程线程模型、虚拟内存与页面置换,到TCP状态机、I/O多路复用,每一个核心原理都在真实的高并发分布式系统中发挥着关键作用。本文从这些基础概念出发,结合分布式系统设计与一致性哈希等进阶主题,系统梳理2015年阿里巴巴基础平台研发实习生笔试的考点与答题策略,并给出跨越笔试与面试的实战建议。无论你是在准备校招笔试,还是想夯实后端研发基本功,本篇复盘都能帮助你从原理层面建立更完整的知识框架,从容应对高难度的技术

weixin_32698563的博客 315

HCIA

HCNA 一.网络:终端&服务器用传输介质–信息共享 1)终端-操作系统:windows vista/98/XP/7/8/10,MAC OS 2)服务器-操作系统:UNIX,Linux,windows server2008/12 3)传输介质:网线,光纤,同轴电缆,串线 二.冯·诺依曼体系 1)CPU(中央处理器):控制器,运算器 2)存储器:内存,硬盘 3)I/O:显卡,鼠标,音响···...

eldester的博客 620
上一篇: 计算机原理-Linux进程调度:完全公平调度器CFS
下一篇: 计算机原理-Linux内核体系结构
shankusu2017
博客等级 码龄15年 155粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值