1、IO分类
阻塞IO:在进行IO操作的时候,如果资源没有准备就绪,会阻塞等待资源,如果资源准备就绪,获取资源。 常用、简单、效率很低 非阻塞IO:在进行IO操作的时候,如果资源没有准备就绪,返回错误信息,如果资源就绪,获取资源。 任务不会阻塞、轮询访问,CPU的消耗较大。 IO多路复用:将所有操作的IO放到一个集合中,检测集合中准备就绪的IO,然后进行IO操作。 允许同时对多个IO进行操作。 信号驱动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) 先创建一个文件描述符集合

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

被折叠的 条评论
为什么被折叠?



