阻塞与线程

来源:互联网 发布:企业网站源码免费下载 编辑:程序博客网 时间: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对比表

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