学习linux的 5种io模型

首先我们需要明确一些东西:

电脑的虚拟存储空间(运行内存)一般是4个G,它有被分为用户空间(3G存放各种进程)和系统内核空间(1G拥有最高的执行权限)。

进程的切换:为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。即从用户态(较低的3G字节)切换到内核态(最高的1G字节),非常消耗系统资源。

2.进程的阻塞:

正在执行的进程,由于期待的某些事件未发生,由运行状态变为阻塞状态。(主要是指内核完成i/o的调用)

  • 只有处于运行状态的进程(获得CPU)才能被阻塞
  • 阻塞是主动行为
  • 不占用CPU资源

3.并发与并行

 4。

1.BIO(blocking IO):同步阻塞 I/O 

扫描二维码关注公众号,回复: 6605918 查看本文章

分析:当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行

2.NIO(nonblocking IO):同步非阻塞 I/O 

系统调用后,无论内核怎么准备,它都不会等待,他会不断的轮循去查看,返回信号没得。

  • 并发:同时进行的任务数

  • 并行:同时工作的物理资源数量(如CPU核数)

  • IO的本质是socket的读取,数据先拷贝到内核的缓冲区中,然后拷贝到应用程序的地址空间(进程)
  •  

3.多路复用IO( IO multiplexing)

如果循环查询多个任务的完成状态,只要有任何一个任务完成,就去处理它。轮询不是进程的用户态。这时 “IO 多路复用”就出现了。即UNIX/Linux 的 select、poll、epoll,

一次返回很多轮循结果,可以监听很多个内核进程,任意一个准备完成就会直接执行不用等到全部完成。

例如:我要去饭堂吃饭,这时饭堂的人很多,点完饭后,我会拿到一个号码,以前我不得不频繁的询问我的饭做好了没,但是最近饭堂安装了一块电子显示屏,你的饭好了就会在屏上显示出来,这时候我就不用频繁的去问了,直接看电子显示屏就醒了,然后我就可以利用这个时间去超市买个牙膏了。

4.信号驱动I/O( signal driven IO)

分析:从上图可以看出,只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。

实例

信号驱动I/O执行的第一阶段不阻塞,而第二阶段是阻塞的。

例如:我要去饭堂吃饭,这时饭堂的人很多,点完饭后,我会拿到一个号码,虽然说饭堂安装了一块电子显示屏,但我在玩手机时还不得不抬头看一下显示屏上有我的号码没,最近饭堂买了一个大喇叭,哪个号码好了,卖饭的阿姨就会用喊,虽说饭堂有点吵,但这个声音还是可以听到的,这样我就可以专心的低头玩手机了。
 

5.异步 I/O(asynchronous IO)

分析:从上图可以看出,在该模型中,当用户进程发起系统调用后,立刻就可以开始去做其它的事情,然后直到I/O执行的两个阶段都完成之后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。

(2)实例

异步 I/O执行的两个阶段都不会阻塞。

例如:我要去饭堂吃饭,估计这会饭堂的人很多,但最近我们饭堂可以叫外卖了,这样就省事多了,我直接打个电话,订份饭送到我们宿舍,而我现在就可以利用原来去饭堂路上和等饭的时间写博客了。

这就是同步和异步的区别,原来我得亲自去饭堂买饭,而现在我可以在宿舍叫外卖。

(3)特点

读写操作由内核完成,完成后内核将数据放到指定的缓冲区,通知应用程序来取。
 

猜你喜欢

转载自blog.csdn.net/qq_36485859/article/details/89524748