linux下socket编程:I/O模型
2014-01-20 10:24
246 查看
阻塞IO
缺省状态下,一个套接字建立以后所处的模式就是阻塞IO模式。这种模式比较好理解,直到有数据到达本地系统调用才返回。如下图所示:
非阻塞IO
和阻塞IO相对应,不管有没有数据到达系统调用都立即返回。当应用程序采用非阻塞IO模式时,需要使用一个循环操作来不停地测试文件描述符是否可读,这是一个极度浪费CPU资源的操作。如下图所示:
IO多路复用
IO多路复用是通过调用select或poll函数来实现。和阻塞IO模式相比,把阻塞操作提前,即在调用select或poll时阻塞,后面的真正数据操作并不阻塞。多数复用的高明之处在于它能同时等待多个文件描述符,当文件描述符集中有一个进入就绪状态时,select函数就可以返回。如下图所示:
信号驱动IO
当文件描述符就绪时,内核使用SIGIO信号通知, 这种模式就是信号驱动模式。在这种模式下,系统调用会立即返回,当数据就绪时,系统会发送SIGIO信号。 实现信号驱动IO需要三步:
1、一个信号处理函数来进行IO操作(必须先于2和3操作)
2、设定套接字的拥有者,通过fcntl函数的F_SETOWN参数来实现即fcntl(fd,F_SETOWN,getpid())
3、套接字允许使用异步IO,通过fcntl函数的F_SETFL命令,O_ASYNC为参数来实现即fcntl(fd,F_SETFL,O_ASYNC)
异步IO
在AIO下,只需要告诉内核要进行IO操作,内核会立刻返回,具体的IO操作全部由内核来完成,程序会继续往下执行,当IO操作结束后内核会通知程序。与信号驱动IO相比,内核通知的时间点不同,信号驱动IO是在数据就绪时通知,而AIO是IO操作结束时通知。如下图所示:
缺省状态下,一个套接字建立以后所处的模式就是阻塞IO模式。这种模式比较好理解,直到有数据到达本地系统调用才返回。如下图所示:
非阻塞IO
和阻塞IO相对应,不管有没有数据到达系统调用都立即返回。当应用程序采用非阻塞IO模式时,需要使用一个循环操作来不停地测试文件描述符是否可读,这是一个极度浪费CPU资源的操作。如下图所示:
IO多路复用
IO多路复用是通过调用select或poll函数来实现。和阻塞IO模式相比,把阻塞操作提前,即在调用select或poll时阻塞,后面的真正数据操作并不阻塞。多数复用的高明之处在于它能同时等待多个文件描述符,当文件描述符集中有一个进入就绪状态时,select函数就可以返回。如下图所示:
信号驱动IO
当文件描述符就绪时,内核使用SIGIO信号通知, 这种模式就是信号驱动模式。在这种模式下,系统调用会立即返回,当数据就绪时,系统会发送SIGIO信号。 实现信号驱动IO需要三步:
1、一个信号处理函数来进行IO操作(必须先于2和3操作)
2、设定套接字的拥有者,通过fcntl函数的F_SETOWN参数来实现即fcntl(fd,F_SETOWN,getpid())
3、套接字允许使用异步IO,通过fcntl函数的F_SETFL命令,O_ASYNC为参数来实现即fcntl(fd,F_SETFL,O_ASYNC)
异步IO
在AIO下,只需要告诉内核要进行IO操作,内核会立刻返回,具体的IO操作全部由内核来完成,程序会继续往下执行,当IO操作结束后内核会通知程序。与信号驱动IO相比,内核通知的时间点不同,信号驱动IO是在数据就绪时通知,而AIO是IO操作结束时通知。如下图所示:
相关文章推荐
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量
- Linux下修改MySQL编码的方法
- Linux串口通信
- 从Windows系统下访问Linux分区相关软件