`
ldb19890624
  • 浏览: 243431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

同步、异步、多线程与事件型综述

 
阅读更多

同步、异步、多线程与事件型综述

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

首先要了解什么是阻塞和阻塞式IO。
线程在执行中如果遇到磁盘读写或网络通信(统称IO操作),通常要耗费较长的时间,这时操作系统会剥夺此线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞。当IO操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种IO模式就是同步式IO或阻塞式IO。

其次是了解什么是异步IO。
相应地,异步IO即非阻塞式IO则针对所有IO操作不采用阻塞的策略。当线程遇到IO操作时,不会以阻塞的方式等待IO操作的完成或数据的返回,而只是将IO请求发送给操作系统,继续执行下一条语句。当操作系统完成IO操作时,以事件的形式通知执行IO操作的线程,线程会在特定时候处理这个事件。为了处理异步IO,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理。

阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%,IO以事件的方式通知。在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞时还有其他线程在工作,多线程可以让CPU资源不被阻塞中的线程浪费。而在非阻塞模式下,线程不会被IO阻塞,永远在利用CPU。多线程带来的好处仅仅是在多核CPU的情况下利用更多的核,而Node.js的单线程也能带来同样的好处。这就是为什么Node.js使用了单线程、非阻塞的事件编程模式。

单线程事件驱动的异步式IO比传统的多线程阻塞式IO究竟好在哪里呢?简而言之,异步式IO就是少了多线程的开销。对操作系统来说,创建一个线程的代价比较昂贵,需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。

当然,异步式编程的缺点在于不符合人们一般的程序设计思维,容易让控制流变得晦涩难懂,给编码和调试都带来不小的困难。习惯传统编程模式的开发者在刚刚接触到大规模的异步式应用时往往会无所适从,但慢慢习惯以后会好很多。尽管如此,异步式编程还是较为困难,不过可喜的是现在已经有了不少专门解决异步式编程问题的库(如async)。

同步IO与异步IO的比较
——————————————————————————————————————————————————————————————————
同步IO 异步IO
——————————————————————————————————————————————————————————————————
利用多线程提高吞吐量 单线程即可实现高吞吐量
通过时间片分割和线程调度利用多核CPU 通过功能划分利用多核CPU
需要由OS调度多线程使用多核CPU 可以将单进程绑定到单核CPU
难以充分利用CPU资源 可以充分利用CPU资源
内存轨迹大,数据局部性弱 内存轨迹小,数据局部性强
符合线性的编程思维 不符合传统编程思维

——————————————————————————————————————————————————————————————————

基于多线程的模型也有相应的解决方案,如轻量级线程等。事件驱动的单线程异步模型与多线程同步模型到底谁更好是一件非常有争议的事情,因为尽管消耗资源,后者的吞吐率并不比前者低。

分享到:
评论

相关推荐

    大型网站性能优化实战从前端网络CDN到后端大促的全链路性能优化 带书签完整版

    - **4.3.5 题外话:ConcurrentHashMap中的Hash**:ConcurrentHashMap是一种支持多线程访问的HashMap实现。 - **4.3.6 HashMap综述**:总结HashMap的特点及其在不同场景下的应用。 - **4.3.7 均摊**:通过对数据的...

    高性能网络爬虫研究综述

    康柏系统研究中心的Alan Heydon和Marc Najork设计的Mercator爬虫采用Java的多线程同步方式实现并行处理,引入多种优化策略,如深度优先和广度优先的混合策略(Depth and Breadth First Hybrid Strategy, DBFS),...

    基于Nodejs的小型框架设计与实现毕业论文.doc

    对于需要大量计算的任务,Node.js可能不如多线程的语言如Python或Java。 **1.4 开发框架的原因** Node.js虽然强大,但其原生API较为底层,对开发者要求较高。开发框架可以提供更高级别的抽象,简化开发流程,提高...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    2.2.4 多线程与预取间的权衡 2.3 并行计算平台剖析 2.3.1 并行平台的控制结构 2.3.2 并行平台的通信模型 2.4 并行平台的物理组织 2.4.1 理想并行计算机的体系结构 2.4.2 并行计算机互连网络 2.4.3 网络拓扑...

    操作系统原理总结.doc

    进程同步和通信机制确保了不同进程间的协同工作,调度则决定了进程、线程和作业的执行顺序。 2. **存储管理**:内存的分配和回收确保内存的有效利用,存储保护防止进程非法访问其他进程的内存,内存扩充技术如虚拟...

    impinjSDK工作手册

    开发者在使用手册时,应该从了解Impinj产品和RFID技术基础开始,然后通过具体的操作步骤,如安装开发环境、解压SDK包、配置设置等,逐步深入到具体的标签读取、写入、事件订阅、GPIO操作以及WPF多线程等高级功能开发...

    深度强化学习必读文献

    3. **异步优势Actor-Critic算法(Asynchronous Advantage Actor-Critic, A3C)/同步版本A2C**:A3C和A2C都是Actor-Critic框架的变种,但A3C采用多线程异步更新,提高了学习速度,而A2C则是其同步版本。这两种方法都...

    ktv点歌系统开题报告

    - **多线程技术**:利用多线程提高系统响应速度,改善用户体验。 - **异步数据加载**:实现歌曲数据的异步加载,避免长时间等待,提升系统效率。 - **智能推荐算法**:根据用户的点歌历史和喜好推荐相似歌曲,增强...

    Python的处理速度怎样做可以加快.docx-综合文档

    同时,由于只有一个线程,不存在冲突问题,不需要依赖锁(加锁与释放锁存在很多资源消耗)。 使用场景 协程主要的使用场景在于处理IO密集型程序,解决效率问题,不适用于CPU密集型程序的处理。然而实际场景中这两...

    《深入理解 Rust 并发编程》

    - **`Arc<T>`**: 支持多线程共享数据。 - **原子性操作**: 保证数据一致性。 #### 六、总结 本书深入探讨了 Rust 语言中的并发特性,从基本的线程管理到高级的异步编程,涵盖了并发编程的各个方面。通过学习本书,...

    java面试问题汇总(非常全面)

    Java里有哪些多线程的类 - `Thread` 类:Java 提供的基础线程类。 - `Runnable` 接口:实现该接口可以创建线程任务。 - `Callable` 接口:与 `Runnable` 类似,但可以返回结果并抛出异常。 - `Future` 和 `...

    Is Parallel Programming Hard And If So What Can You Do About It

    3. 利用硬件特性:充分利用现代硬件的特性,例如多级缓存系统、多线程指令集和异步I/O,可以帮助编写出更为高效的并行程序。 文档也强调了对知识产权的尊重,提到文档中非源代码文本和图片是根据Creative Commons ...

    UNIX环境高级编程_第二版中文

    11.6 线程同步  11.7 小结  习题  第12章 线程控制  12.1 引言  12.2 线程限制  12.3 线程属性  12.4 同步属性  12.5 重入  12.6 线程私有数据  12.7 取消选项  12.8 线程和信号  12.9 ...

    seL4操作系统编程.pdf

    系统调用可以是同步的,也可以是异步的。 2.3 内核对象 seL4 操作系统中的内核对象包括进程、线程、虚拟地址空间、设备驱动等。这些对象是 seL4 操作系统的基本组成部分,用于描述系统中的资源和行为。 2.4 内核...

    UNIX环境高级编程(第二版中文)

    11.6 线程同步 297 11.7 小结 311 习题 311 第12章 线程控制 313 12.1 引言 313 12.2 线程限制 313 12.3 线程属性 314 12.4 同步属性 318 12.5 重入 324 12.6 线程私有数据 328 12.7 取消选项 ...

    unix环境编程电子书

    285 第11章 线程 287 11.1 引言 287 11.2 线程概念 287 11.3 线程标识 288 11.4 线程的创建 288 11.5 线程终止 291 11.6 线程同步 297 11.7 小结 311 习题 311 第12章 线程控制 313 12.1 引言 ...

    FreeBSD操作系统设计与实现

    第一部分 综述 第1章 BSD系统的历史和目标 1.1 UNIX系统的历史 1.1.1 UNIX系统的起源 1.1.2 Research小组的UNIX系统 1.1.3 AT&T UNIX System III和System V 1.1.4 伯克利软件发布(BSD) 1.1.5 UNIX无处不在 1.2 ...

    清华大学ARM培训教材

    - **并发控制:互斥与同步**:解决多进程或线程间共享资源的问题。 - **并发控制:死锁处理**:防止或解决多个进程间相互等待资源的现象。 - **中断及中断处理**:中断机制的原理及其实现方法。 - **Linux的进程...

    UNIX环境高级编程_第2版.part1

     此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附  录中给出了函数原型和部分习题的答案。  本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX/Linux程序员...

Global site tag (gtag.js) - Google Analytics