I/O模型

一、同步阻塞I/O

     这里的阻塞指的是当前发起I/O操作的进程被阻塞,并不是CPU被阻塞。

     同步阻塞I/O是指当进程调用某些涉及I/O操作的系统调用或库函数时,比如accept()、send(),进程便暂停下来,等待I/O操作完成后再继续运行。

这是一种简单有效的I/O模型,代价是多进程的大量内存开销。

二、同步非阻塞I/O

    该I/O的调用不会等待数据的就绪。相比于阻塞I/O,这种非阻塞I/O结合反复轮询来尝试数据是否就绪,防止进程被阻塞。

最大的好处是可以在一个进程里同时处理多个I/O操作。这种方式一般只针对网络I/O,只需要在socket的选项设置中使用O_NONBLOCK即可。

三、多路I/O就绪通知

它运行进程通过一种方法来同时监视所有文件描述符(文件是否就绪)。

1、select

优点:良好的跨平台支持。

缺点:单个进程能够监视的文件描述符的数量存在最大限制,在Linux一般为1024。

调用select()会对所有socket进行一次线性扫描。

2、poll

本质与select一样,但是poll没有最大文件描述符数量的限制。

与select同样存在的缺点是,包含大量文件描述符(就绪的和未就绪的)的数组被整体复制于用户态和内核的地址空间之间。

3、/dev/poll   Linux内核不直接支持

水平触发:下次调用select()或poll()时,会再次报告这些文件描述符,所以它们一般不会丢失就绪的消息。

边缘触发:告诉我们哪些文件描述符刚刚变为就绪状态,它只说一遍。

4、/dev /epoll    Linux内核不直接支持

5、epoll

epoll同时支持水平触发和边缘触发;epoll只告知哪些就绪的文件描述符;

epoll采用基于事件的就绪通知方式,epoll事先通过epoll_ctl()来注册每一个文件描述符,一旦某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知。

6、经典比喻:买面条需要等待,有了电子屏幕(多路通知),select / poll 每次返回所有监视的文件描述符(不支持水平或者边缘触发),一旦走得比较远,可以到管理处注册,便可以在餐点就绪时及时收到短信通知,类似与epoll。


四、内存映射

    将内存中的某块地址空间和我们指定的磁盘文件相关联,从而把对这块内存的访问转换为对磁盘文件的访问,它对应Linux的mmap()方法。

五、直接I/O

   用户态内存空间与磁盘之间有一个操作系统的内核缓冲区,直接I/O就是绕过这个缓冲区。在Linux中,在open()系统调用中增加参数选项O_DIRECT,用它打开的文件便可以绕过内核缓冲区的直接访问。

六、sendfile

   Linux的sendfile()系统调用,它可以将磁盘文件的特定部分直接传送到代表客户端的socket描述符。

七、异步I/O

   阻塞和非阻塞考虑的是进程访问的数据是否就绪问题,而同步与异步是数据访问的机制。





    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值