Uinx系统下的I/O模型

5种I/O模型的基本区别:

  • 阻塞式I/O
  • 非阻塞式I/O
  • I/O复用(select,poll,epoll)
  • 信号驱动式I/O(SIGIO)
  • 异步I/O(POSIX的aio_系列函数)

1阻塞式I/O模型

1.png

recvfrom函数视为系统调用,因为要区分应用进程和内核.
进程调用recvfrom,其系统调用知道数据报到达且被应用进程的缓冲区中或者发生错误时才返回.最常见的错误是系统调用与信号中断,进程在从调用recvfrom开始到它返回的整段时间内都是阻塞的,recvfrom成功返回后,,应用进程开始处理数据报.

2非阻塞式I/O

进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把本进程投入睡眠,而是返回一个错误.所以应用程序轮询(polling)内核已查看操作是就绪.这个过程超级浪费CPU时间.

一看就懂得图...真的好用
2.png

非阻塞套接字在控制建立的多个连接,在数据的收发量不均,时间不定时,明显具有优势。这种套接字在使用上存在一定难度,但只要排除了这些困难,它在功能上还是非常强大的。

I/O复用模型

简介:主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;

I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数


3.png

4信号驱动式I/O模型

POSIX信号处理

4.png

5异步I/O模型

异步I/O由POSIX规范定义.
一版来说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们.
信息驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成


5.png

5种I/O模型的比较

6.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容