首页 > 其他分享 >常见I/O模型

常见I/O模型

时间:2023-03-27 15:45:37浏览次数:28  
标签:调用 模型 常见 阻塞 内核 IO 进程 select

文章引用自 https://blog.csdn.net/qq_35642036/article/details/82798722

1. 同步:发出一个功能调用后,没有得到结果之前,该调用就不返回。此时线程还是激活的

2. 异步: 发出一个调用后,不需要知道改功能结果,该功能有结果后通知调用者(回调通知)

同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)

同步和异步最大的区别就是被调用方的执行方式和返回时机。

3. 阻塞: 阻塞调用就是调用结果返回之前,当前线程会被挂起。

4. 非阻塞:指不能得到结果之前,该函数不会阻塞当前线程,而会立即但会。通过select通知调用者。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

 

同步、异步说的是被调用者会不会通知,阻塞、非阻塞说的是调用者会不会卡住不动。

 

操作系统5种IO模型

1. Socket编程

 

 

 

 1. 阻塞IO

        应用程序的进程发起 IO 调用,但是如果内核的数据还没准备好的话,那应用程序进程就一直在阻塞等待,一直等到内核数据准备好了,从内核拷贝到用户空间,才返回成功提示,此次 IO 操作,称之为阻塞 IO。

 

 2. 非阻塞模型

当所请求的IO操作无法完成是,返回一个错误,而不是将进程挂起。此时IO操作函数就会一直测试数据是否已经准备好,知道数据准备好为止。但是在不断测试中会大量占用CPU的时间。

 

 3. 多路复用模型

应用进程通过调用 select 函数,可以同时监控多个 fd,在 select 函数监控的 fd 中,只要有任何一个数据状态准备就绪了,select 函数就会返回可读状态,这时应用进程再发起 recvfrom 请求去读取数据。

 

 select函数的缺点:

1. select 调用需要传入 fd 数组,需要拷贝一份到内核,高并发场景下这样的拷贝消耗的资源是惊人的。(可优化为不复制)
2. select 在内核层仍然是通过遍历的方式检查文件描述符的就绪状态,是个同步过程,只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)
3. select 仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历。(可优化为只返回给用户就绪的文件描述符,无需用户做无效的遍历)
最大连接数有限,在 Linux 系统上一般为 1024(poll可解决)。

 

 4. IO模型之信号驱动模型

        信号驱动 IO 不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用 sigaction 的时候建立一个 SIGIO 的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过 SIGIO 信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用 recvfrom,去读取数据。

 

 5. IO模型之异步IO(AIO)

AIO 实现了 IO 全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程 IO 操作执行完毕。

 

标签:调用,模型,常见,阻塞,内核,IO,进程,select
From: https://www.cnblogs.com/return-study-wa/p/16291898.html

相关文章