您的位置:首页 > 运维架构 > Linux

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操作结束时通知。如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux socket IO模型