先说一句,这篇博文是瞎讨论哲学用的(
什么是异步
来自Wikipedia的解释(异步IO)
[原文链接]
异步IO是计算机操作系统对输入输出的一种处理方式:发起IO请求的线程不等IO操作完成,就继续执行随后的代码,IO结果用其他方式通知发起IO请求的程序。与异步IO相对的是更为常见的“同步(阻塞)IO”:发起IO请求的线程不从正在调用的IO操作函数返回(即被阻塞),直至IO操作完成。
类Unix操作系统与POSIX[编辑]
POSIX提供下述API函数:
阻塞 | 非阻塞 | |
---|---|---|
同步 | write, read | write, read + poll / select |
异步 | - | aio_write, aio_read |
Windows操作系统的异步IO[编辑]
设备内核对象[编辑]
IO设备在操作系统内核中表示为内核对象,因此具有可等待(waitable)内核对象状态。例如:文件句柄,线程句柄等等。对于文件内核对象,当一个异步IO完成后,该文件句柄被置为触发态。使用这种方式获取异步IO完成的通知,缺点是如果在一个文件内核对象上同时有多个异步IO操作,只通过文件句柄的触发无法辨识哪个异步IO操作完成了。
例子:
1 | HANDLE hFile = CreateFileW(L"d:\\a.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, 0); //设置异步IO的标志FILE_FLAG_OVERLAPPED |
GetOverlappedResult函数[编辑]
也可以使用Windows API函数GetOverlappedResult直接阻塞/非阻塞等待指定的异步IO操作是否完成。[2]该函数检查OVERLAPPED结构中的Internal成员的值是否为STATUS_PENDING来判断异步IO是否完成。
异步IO操作的完成通知用事件内核对象[编辑]
在异步IO操作的read/write函数调用中给出的OVERLAPPED类型的参数中,可以指定一个内核事件对象。这个异步IO操作完成时,这个内核事件对象会被触发。从而,等待在这个事件对象上的程序就会知道这个异步IO操作完成。
例子:
1 | HANDLE hFile = CreateFileW(L"d:\\a.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, 0); //设置异步IO的标志FILE_FLAG_OVERLAPPED |
可唤醒I/O[编辑]
异步可唤醒I/O操作通过ReadFileEx/WriteFileEx函数指出完成过程回调函数。回调函数在该线程的可唤醒等待(alertable wait)中被执行。
完成端口[编辑]
使用CreateIoCompletionPort函数创建一个完成端口。然后把文件句柄绑定到这个完成端口(通过CreateIoCompletionPort函数)。这个文件句柄上的异步IO操作完成时,会自动向这个完成完成端口发通知。线程通过GetQueuedCompletionStatus函数等待这个完成端口上的完成通知,然后从GetQueuedCompletionStatus的调用返回处恢复线程执行。
线程池I/O完成对象[编辑]
使用CreateThreadpoolIo函数创建一个I/O完成对象,绑定了要执行异步I/O操作的文件句柄与待执行的回调函数。通过StartThreadpoolIo函数开始I/O完成对象的工作。每当绑定的文件句柄上的异步I/O操作完成,自动调用线程池上的线程执行指定的回调函数。
例子:
1 | VOID CALLBACK OverlappedCompletionRoutine(PTP_CALLBACK_INSTANCE pInstance, |
参见[编辑]
参考文献[编辑]
外部链接[编辑]
- The C10K Problem; a survey of asynchronous I/O methods with emphasis on scaling – by Dan Kegel
- Article “Boost application performance using asynchronous I/O“ by M. Tim Jones
- Article “Lazy Asynchronous I/O For Event-Driven Servers“ by Willy Zwaenepoel, Khaled Elmeleegy, Anupam Chanda and Alan L. Cox
- Perform I/O Operations in Parallel
- Description from POSIX standard
- Inside I/O Completion Ports by Mark Russinovich
- Asynchronous I/O and The Asynchronous Disk I/O Explorer
- IO::AIO is a Perl module offering an asynchronous interface for most I/O operations
- ACE Proactor
解释
从上面文献可以看出,异步IO大概就是发起IO的程序一直发起IO,不需要等待IO做出相应。
有什么用
从爬虫说起
异步IO是我学习Python爬虫时候接触到的,所以先从爬虫说起。
随着计算机性能的不断提升,程序运行速度不断提高,而限制程序运行速度的不再是计算机性能,而是IO速度,比如一个爬虫处理数据要20ms,而网络延迟60ms(这也是比较理想的速度了),这段时间Python闲的没事干,只能等待IO响应,计算机的性能没法发挥到极致。而异步IO只需程序一直发起IO,等响应来了再处理响应,大大提升了爬虫速度
作用
促进了爬虫事业发展,发挥了计算机应有性能
什么哲学
老电脑/手机卡顿表现在哪里
大多数老旧设备卡顿是性能不够,CPU无法处理大量程序造成的
怎么解决
解决方法就是让老旧设备的性能发挥到极致,发挥到极致的方法除了超频以外还有一个妙法,这就是我要说的内容,这个方法就是充分利用老旧设备的IO等待时间,让老旧设备一直保持高频运转
怎么操作
这要说你是怎么判断你的设备卡顿了,你判断的依据一定是看到设备IO的output反应迟缓,但你没看到的是input正闲的没事干,此时你可以用脑子预测你将会需要按什么键,或者什么输入操作,给设备input,此时设备卡顿,所以你的input处于已接收未处理状态,因为CPU累的要死所以暂时不会处理input。而等待CPU处理完卡顿后刚准备歇会,就发现了你的input,于是就开始处理input,发挥到CPU的性能极致。
这个实际上并不是CPU的异步,而是你脑子的异步,因为设备卡顿你并没有接收到设备给你的output,但你不等待output,直接进行下一个input,省去设备output然后你脑子处理再input给设备的时间,大大提升设备运行效率。
最后
提升老旧设备效率只是一个简单的异步哲学应用,生活中有很多异步哲学的应用,只要你能“运用自如”,工作效率提升的不是一点半点。