阻塞与线程

阻塞与线程

阻塞(block)

线程在执行中如果遇到磁盘读写或者网络通信,也就是I/O操作,通常会耗费较多时间,这时候操作系统就会剥夺掉这个线程的CPU控制权,使其暂停执行,同时将资源让给其他工作的线程,这种调度方式称之为阻塞(block)。

阻塞式I/O(Blocking I/O)

当I/O操作完成时,操作系统将这个线程的阻塞状态解除,回复其对CPU的使用权,使其继续执行,这种I/O模式就是阻塞式I/O。

异步式I/O(Asynchronous I/O)

异步式I/O针对所有I/O操作不采用阻塞的策略。当县城遇到I/O操作时,不会以阻塞的方式等待I/O的完成或者是数据的返回,而是将I/O请求发送给操作系统,继续执行下一条语句。当操作系统完成I/o操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O,线程必须有时间循环,不断检查是不是有等着处理的事件,依次予以处理。

阻塞模式和非阻塞模式区别

阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU使用率永远是100%,I/O以事件的方式通知。在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞时往往还有其他线程在工作,多线程可以让CPU资源不被阻塞中的线程浪费。而在非阻塞模式下,线程不会被I/O阻塞,永远在利用CPU。多线程的好处仅仅是在多核CPU的情况下利用更多的核,而Node.js的单线程也能带来同样的好处。
异步式I/O少了多线程的开销。对于操作系统来说,创建一个线程是十分昂贵的,需要给它分配内存、列入调度,同时在县城切换的时候还要执行内存换页,CPU的缓存被清空,切换回来的时候还要重新从内存中读取数据,破坏了数据的局部性。
异步式编程的缺点是不符合人们一般的程序设计思维,容易让控制流变的晦涩难懂,给代码的编写和调试带来很多困难。

同步式I/O和异步式I/O对比表

同步式异步式
利用多线程提高吞吐量单线程即可实现提高吞吐量
通过事件片分割和线程调度利用多核CPU通过功能划分利用多核CPU
需要操作系统调度多线程使用多核CPU可以将单线程绑定到单核CPU
难以充分利用CPU资源可以充分利用CPU资源
内存轨迹大,数据局部性弱内存轨迹小,数据局部性强
符合现行的编程思维不符合传统的编程思维
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值