阻塞、非阻塞、同步、异步

1.阻塞、非阻塞、同步、异步的概念

首先要了解用户态和内核态。

输入操作分两个阶段:

 

  1. 等待数据准备好
  2. 从内核向进程复制数据

 

对于套接字的输入操作:

 

  1. 等待数据从网络中到达,当分组到达时被复制到内核的某个缓冲区
  2. 数据从内核缓冲区复制到应用进程缓冲区

 

同步、异步的区别在于进程是否需要等待真正的内核IO操作的完成(数据从内核态到用户态的复制),而阻塞、非阻塞的区别在于进程是否等待内核完成数据准备,即阻塞、非阻塞式IO模型在输入操作的第一阶段不同,但是第二阶段都是阻塞的。

阻塞式IO在等待数据准备完成,非阻塞式IO会不断检查数据是否准备完成,进程不会进入睡眠。阻塞、非阻塞式IO都在真正的IO操作中阻塞进程!

异步IO在整个操作也就是两个阶段都完成后会产生某个信号。

 

参考:

《深入理解计算机系统》第3版 8.2节

《Unix网络编程 卷1》第6章

 

个人总结:

 

  1. 阻塞、非阻塞都是对单个线程来说
  2. 同步、异步针对多个任务来说,单线程下应该没有同步、异步的概念
  3. 在socket编程中,IO多路复用(也就是信号里的时分复用)也可以写成阻塞式(虽然这样写没效率)

 另外一些网上评论说IO只有阻塞、非阻塞一说没有同步、异步一说,觉得对,但是unix网络编程一书中用的词是“同步IO”,“异步IO”

非阻塞没有返回消息而异步会有返回消息会有回调

下面的“真正的IO操作”都是表达从内核的缓冲区拷贝数据到用户进程的意思。

unix网络编程第16章介绍了“非阻塞IO”,这里的“非阻塞IO”并不是说真正的IO操作不会阻塞进程或线程,实际上应该还是会阻塞进程,只是这里的“非阻塞IO”其实是多次调用了真正的阻塞的IO,如果是“阻塞IO”(这里不是说真正的IO操作非阻塞)那么只有等多次调用真正的IO操作结束后线程或进程才会继续执行,但是非阻塞在调用一次真正的IO操作后线程就能够继续执行,而不需要等待所有的“真正的IO操作”都执行完。如果要完成unix网络编程书中的“异步IO”只能调用系统特定的库函数,也不是所有系统都实现unix网络编程书中的“异步IO”。书中提到的异步IO的定义其实就是真正的IO操作非阻塞,而后面第16章提到的非阻塞IO并不是真正的IO操作是非阻塞的!!!

以前写的文章,红色部分写错了,非阻塞不会阻塞进程的了。

同步、异步联想同步、异步通信即可。

阻塞、非阻塞只是在于线程或进程时候会不会要等待某件事情处理完。

2.Java:bio、nio、aio

bio:同步阻塞

nio:同步非阻塞

aio:异步

给java占坑,最近去使用这几种方式比较比较

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步非阻塞异步非阻塞是两种不同的函数调用方式。 同步非阻塞是指在发起函数调用后,调用方不会等待函数的结果返回,而是立即继续执行后续的代码。这意味着调用方无需等待函数的执行结果,可以继续处理其他任务。当函数执行完毕后,调用方可以通过轮询或者回调等方式来获取函数的结果。同步非阻塞的优点是能够提高系统的并发性和响应性。 异步非阻塞是指在发起函数调用后,调用方也不会等待函数的结果返回,但是与同步非阻塞不同的是,异步非阻塞会通过回调、事件通知等方式来通知调用方函数的执行结果。调用方可以继续执行其他任务,并在合适的时机处理函数的返回结果。异步非阻塞的优点是能够提高系统的并发性和性能,减少资源的浪费。 总结来说,同步非阻塞异步非阻塞都是在函数调用时不会发生线程阻塞的情况下继续执行后续代码,但区别在于同步非阻塞需要主动轮询或回调来获取函数的结果,而异步非阻塞则通过回调或事件通知等方式传递函数的执行结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深入理解同步阻塞同步非阻塞异步阻塞异步非阻塞](https://blog.csdn.net/wangpaiblog/article/details/117236684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值