网上关于这些的说法太多,这里记录一下个人的理解。结合unix I/O 模型图和windows的一些API。
1.何为同步,异步?
同步,异步是针对I/O而言的,其实理解就是不同的API,用了同步API的调用,就是同步,用了异步的API调用,就是异步。
举例:
windows:
_ACRTIMP int __cdecl read(
_In_ int _FileHandle,
_Out_writes_bytes_(_MaxCharCount) void* _DstBuf,
_In_ unsigned int _MaxCharCount
);
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
BOOL ReadFileEx(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
unix:
ssize_t read(int fd, void *buf, size_t size) ;
int aio_read(struct aiocb *aiocb);
1)如果使用了windows的read和unix的read,则一定是同步调用
2)ReadFile如果设置了lpOverlapped,则是异步I/O,否则蜕化为同步I/O。
ReadFileEx 如果设置了lpCompletionRoutine 或者 lpOverlapped ,则为异步I/O,否则蜕化为同步I/O。
3)aio_read是异步I/O
不同的调用,有一个很大的不同在于:
同步I/O一定是需要同步的函数自己从内核复制到用户空间。
而异步I/O则回调或者通知时,数据已经在用户定义的缓冲区填好了。
手头么图,图片来自于(https://blog.csdn.net/lihao21/article/details/51620374),这个是unix的I/O模型&#x