阻塞与线程
来源:互联网 发布:企业网站源码免费下载 编辑:程序博客网 时间:2024/05/30 05:09
阻塞与线程
阻塞(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对比表
- 阻塞线程与非阻塞线程
- 阻塞与线程
- 线程阻塞与唤醒
- 线程阻塞与唤醒
- 阻塞线程与守护线程
- performSelectorOnMainThread线程的阻塞与非阻塞
- Java线程唤醒与阻塞
- Java线程唤醒与阻塞
- java线程阻塞与唤醒
- Java线程唤醒与阻塞
- Java线程唤醒与阻塞
- Java线程阻塞与中断
- Java线程唤醒与阻塞
- Java线程阻塞与恢复
- “单线程/多线程”与“同步/异步”还有“阻塞/非阻塞”
- C#线程阻塞、中断与终止
- C#线程中的等待与阻塞
- 线程的中断阻塞与控制
- Nginx 下 WordPress rewrite 规则
- 回顾
- 【Codeforces 549G】【贪心】Happy Line
- Make管理器
- 利用JavaScript生成二维码并且中间有logo
- 阻塞与线程
- 315_AS编译错误
- J-Osu! Master(2015-ICPC-北京站)
- java设计模式与策略模式
- 高级的暴力(一)——分块
- codevs 1183 泥泞的道路(二分答案+spfa验证)
- 关于vcenter server显示与各主机连接已断开问题
- 316_getColor方法过时
- JNDI