异步io

时间:2024-07-09 02:42:10编辑:分享君

信号驱动和异步驱动的区别

信号驱动和异步驱动的区别
信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程。
异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程。IO操作即内核当中的服务例程。
异步I/O和信号驱动I/O的区别很容易被混淆。前者与后者的区别在于启用异步I/O意味着通知内核启动某个I/O操作,并让内核在整个操作(包括数据从内核复制到用户缓冲区)完成时通知我们。也就是说,异步I/O是由内核通知我们I/O操作何时完成,即实际的I/O操作也是异步的;而 信号驱动I/O是由内核通知我们何时可以启动一个I/O。
I/O究竟什么时候能用这个信息实际上只有内核才能 事先知道,因为是内核在最终处理系统中的所有打开的描述符。
信号驱动I/O模型
内核:I/O能用了。
进程:接受到I/O能用的消息并执行接下来的操作。
异步I/O模型
内核:等待这个I/O有消息了,接受到数据。
进程:从缓存中得到数据。

信号驱动的作用在于在等待I/O可用的过程中可以执行其它的指令,这种方法从理论上看 倒是不错。由于进程已经休眠,就不会再占用CPU,仅当I/O可用时它才恢复执行。但是这种方法的问题在于信号处理的开销有点大。若只是少数的请求还没有问题,若是每分钟收到100个请求,那就几乎一直都在捕获信号。每秒钟捕获上百个信号的开销是相当大的,不单是进程,对于内核发送信号的开销而言也是一样的。
因此,在高性能的服务器编程中,用异步I/O来处理多个I/O更为高效。当然,也可以用I/O复用模型来实现(epoll是一个相当高效的方法),但是对于Regular File来说,是不能使用epoll的,因为不能设置非阻塞模式(O_NOBLOCK 方式对于传统文件句柄是无效的),这个时候,异步I/O是一个很不错的选择。


如何确认Linux系统的异步IO是否启用,DBA需要关注异步IO是否启用

lsof 是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。常用的参数列表lsof filename 显示打开指定文件的所有进程lsof -a 表示两个参数都必须满足时才显示结果lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件lsof -u username 显示所属user进程打开的文件lsof -g gid 显示归属gid的进程情况lsof +d /DIR/ 显示目录下被进程打开的文件lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长lsof -d FD 显示指定文件描述符的进程lsof -n 不将IP转换为hostname,缺省是不加上-n参数lsof -i 用以显示符合条件的进程情况lsof -i[46] [protocol][@hostname|hostaddr][:service|port]46 --> IPv4 or IPv6protocol --> TCP or U


上一篇:电缆保护接地箱

下一篇:yotaphone官网