同步异步,阻塞非阻塞,多线程,线程池的理解

本文探讨了同步和异步、阻塞和非阻塞的概念,并通过举例说明了它们的区别。同步是根据API调用来区分,异步I/O在数据准备好时会通知用户。阻塞和非阻塞是针对调用者的行为,如select和signal I/O是同步但非阻塞。最后,讨论了多线程和线程池在I/O操作中的应用,以提高效率并解决资源浪费问题。
摘要由CSDN通过智能技术生成

网上关于这些的说法太多,这里记录一下个人的理解。结合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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值