IO模型(阻塞,非阻塞,多路复用......)

本文介绍了IO操作的四种主要类型:阻塞IO、非阻塞IO、IO多路复用和信号驱动IO。阻塞IO在资源未准备就绪时会等待,非阻塞IO则返回错误信息并避免阻塞,IO多路复用通过一个集合监控多个IO,而信号驱动IO则由内核在资源就绪时发送信号通知任务。重点探讨了阻塞IO、非阻塞IO和IO多路复用的工作原理及示例。

1、IO分类

  1. 阻塞IO:
    在进行IO操作的时候,如果资源没有准备就绪,会阻塞等待资源,如果资源准备就绪,获取资源。 常用、简单、效率很低
  2. 非阻塞IO:
    在进行IO操作的时候,如果资源没有准备就绪,返回错误信息,如果资源就绪,获取资源。 任务不会阻塞、轮询访问,CPU的消耗较大。
  3. IO多路复用:
    将所有操作的IO放到一个集合中,检测集合中准备就绪的IO,然后进行IO操作。 允许同时对多个IO进行操作。
  4. 信号驱动IO:
    资源准备就绪的时候,由内核向任务发送SIGIO信号,任务接收到信号后,去进行IO操作。

2、阻塞IO

资源没有准备就绪,会一直等待
常用的有fgets、read、write、accept......

3、非阻塞IO

应用程序在执行的时候告诉系统,如果资源准备就绪,返回资源,如果没有准备就绪,返回错误信息。 实现方式更多采用轮询(polling)
具体实现步骤:
1) 需要将IO设置为非阻塞模式;
    a, 打开的时候以非阻塞方式去得到;
        open(pathname, O_NONBLOCK | O_RDWR);
    b,在得到IO的文件描述符后,可以去设置。
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
参数:
参数1:fd表示文件描述符
参数2:int cmd, ... /* arg */ 是可变参数,
返回值:
成功:
F_GETFL Value of file status flags.
F_SETFL 0;
失败返回-1,且修改errno的值。

4、IO多路复用

如果现在我来同时操作多个IO:
    1) 采用阻塞模式,IO的操作顺序由代码决定,多个IO是依次执行; 只要前面的IO没有执行,后面的IO即使资源准备就绪,也不会执行。达不到预期效果(谁准备就绪就执行谁);
    2) 非阻塞IO模式,多个IO需要进行轮询访问,导致CPU的消耗很大。不利于执行其它任务。
    3) 采用多任务的方式: 多进程,每一个任务创建一个进程,这个进程会有独立4g内存空间,通信比较麻烦。 多线程,资源共享,需要解决资源互斥和线程的同步。
IO多路复用的思路:
    1) 先创建一个文件描述符集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值