五种I/O模型

I/O模型

Unix可用的五个I/O模型的基本区别:

  • 阻塞I/O
  • 非阻塞I/O
  • I/O复用
  • 信号驱动I/O
  • 异步I/O

一个输入操作通常包括两个阶段:

  • 等待数据准备好
  • 从内核向进程复制数据

        对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。

阻塞I/O模型

        进程调用recvfrom,此系统调用直到数据报达到且拷贝到应用缓冲区或是出错才返回。

        进程阻塞的整段时间是指从调用recvfrom开始到它返回的这段时间。

        recvfrom() 用于接收 Socket 传来的数据,并复制到应用进程的缓冲区 buf 中。这里把 recvfrom() 当成系统调用。

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

e54cfc16531d6913cbcbd47eb7b7d152601.jpg

非阻塞I/O模型

应用程序执行系统调用后,内核返回一个错误。应用程序可以继续执行,不断执行系统调用来询问I/O是否完成的过程称为轮询。CPU利用效率低。

afd2f6df35147617739b55b44052f5afb25.jpg

I/O复用模型

使用 select 或者 poll 等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后再使用 recvfrom 把数据从内核复制到进程中。

它可以让单个进程具有处理多个 I/O 事件的能力。又被称为 Event Driven I/O,即事件驱动 I/O。

如果一个 Web 服务器没有 I/O 复用,那么每一个 Socket 连接都需要创建一个线程去处理。如果同时有几万个连接,那么就需要创建相同数量的线程。相比于多进程和多线程技术,I/O 复用不需要进程线程创建和切换的开销,系统开销更小。

045aeb0900e58e0b4cea35ebe91827f5610.jpg

信号驱动I/O模型

        应用程序使用系统调用sigaction,内核立即返回,应用进程继续工作,这个是非阻塞的。内核在数据到达时向应用进程发送 SIGIO 信号,应用进程在信号处理程序中调用recvfrom把数据报拷贝到应用进程中。

        相比于非阻塞式 I/O 的轮询方式,信号驱动 I/O 的 CPU 利用率更高。

42922804507b5f43ec7856af3f120a22417.jpg

异步I/O模型

        应用进程执行 aio_read 系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。

        异步I/O是由内核通知我们I/O操作何时完成。信号驱动I/O是由内核通知我们何时可以启动一个I/O操作。

b2a6c97033130f91b5d5ef89ed45e9c9674.jpg

  • 同步 I/O:将数据从内核缓冲区复制到应用进程缓冲区的阶段(第二阶段),应用进程会阻塞。
  • 异步 I/O:第二阶段应用进程不会阻塞。

非阻塞式 I/O 、信号驱动 I/O 和异步 I/O 在第一阶段不会阻塞。

同步 I/O 包括阻塞式 I/O、非阻塞式 I/OI/O 复用和信号驱动 I/O ,它们的主要区别在第一个阶段。

ce3c190c6324f0b318e85bd63fc08caedf4.jpg

 

转载于:https://my.oschina.net/u/4045381/blog/3097592

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值