多线程同步I/O和单线程异步I/O

多线程同步I/O和单线程异步I/O

同步I/O与异步I/O

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

 
 
  1. var fs = require("fs");
  2. var data = fs.readFileSync("test.txt", "utf-8");
  3. console.log(data);
  4. console.log("over");

这种执行方式很好理解,传统服务器的处理方式是为每个请求开启一个线程,在遇到I/O请求的时候阻塞处理。但每个CPU能承受的线程数是有限制的,于是达到限制的时候就必须添加新的CPU,而且开启线程是非常消耗资源的。

异步I/O诞生就解决了上述问题,在异步I/O模型中,线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而是将I/O请求发送给操作系统,继续执行下一条语句。当操作系统完成/IO操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理,典型的异步编程模型有Node.js

 
 
  1. var fs = require("fs");
  2. fs.readFile("test.txt", "utf-8", function(err, data) {
  3. if (err) {
  4. console.log(err);
  5. } else {
  6. console.log(data);
  7. }
  8. });
  9. console.log("over");

node函数默认是异步处理,上述程序执行会先打印出"over",待I/O处理完成,再继续执行读文件操作。

可以看到阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程;而非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%, I/O 以事件的方式通知。

同步I/O和异步I/O图解

Node的异步I/O

多线程带来的好处是在多核CPU的情况下利用更多的核,而Node.js的单线程也能带来同样的好处,Node.js使用了单线程、非阻塞的事件编程模式。

单线程事件编程模式的异步I/O与多线程阻塞式I/O相比,异步I/O少了多线程的开销。对OS来说,创建一个线程的代价比较昂贵,需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。

单线程事件驱动的异步I/O有个缺点就是异步程序不是很好理解,编写异步程序比较困难。


http://linzhi.co.in/multithread-io-singlethread-io/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多线程异步I/O适用于需要处理大量并发请求和I/O操作的场景。例如: 1. Web服务器:Web服务器需要同时处理多个请求,而这些请求通常是I/O密集型的,例如读取文件、查询据库等,因此采用多线程异步I/O可以提高服务器的性能和吞吐量。 2. 据库:据库需要处理大量的读写请求,而这些请求通常是I/O密集型的,因此采用多线程异步I/O可以提高据库的性能和响应速度。 3. 大据处理:对于大规模的据处理任务,采用多线程异步I/O可以提高处理速度和效率。 4. GUI应用程序:图形用户界面(GUI)应用程序需要及时响应用户的操作,而这些操作通常是I/O密集型的,例如读取文件、下载据等,因此采用多线程异步I/O可以提高应用程序的响应速度和用户体验。 总之,多线程异步I/O都是提高系统性能和效率的重要手段,但在使用时需要注意线程安全和并发控制等问题。 ### 回答2: 在某些场景下,采用多线程异步I/O可以有效提升程序的性能和响应速度,以下是几个常见的场景: 1. Web服务器:当有大量请求同时到达服务器时,可利用多线程处理这些请求,每个线程负责一个请求的处理,提高并发处理能力。同时,采用异步I/O可以在等待文件读写或网络通信的时候,切换到其他任务,充分利用CPU资源,让服务器能同时处理更多的请求。 2. 大据处理:大据处理往往需要处理海量的据,使用多线程可以将任务划分成多个子任务,在多个线程上并行执行,从而提高处理速度。此外,采用异步I/O可以在读取或写入大量据时,不需要等待单个文件或网络操作完成,而是在这个过程中可并行执行其他计算任务,提高整体处理效率。 3. 游戏开发:游戏往往需要同时处理多个任务,如渲染画面、处理用户输入、AI计算等。通过使用多线程,不同的任务可以并行执行,确保游戏的流畅性和响应速度。异步I/O还可以用于游戏资源的加载和保存,避免阻塞主线程,提高游戏性能。 4. 聊天程序/消息推送:在聊天程序或消息推送中,需要实时地接收和发送消息。使用多线程可以在同时接收和处理多个消息,提高程序的并发性。而异步I/O可以在发送和接收消息时,不需要等待消息的同步处理,而是允许并行处理其他消息,提高实时性。 总之,多线程异步I/O适用于需要处理大量并发任务、大据量读写或网络通信的场景,能够提高程序的并发性、效率和响应速度。 ### 回答3: 多线程异步I/O在以下场景中比较适用: 1. 高并发的网络应用:当有大量的并发连接需处理时,采用多线程异步I/O能够提高应用程序的处理能力和效率。多线程可以同时处理多个连接,而异步I/O可以在等待据的同时处理其他任务,提高了系统的并发能力。 2. 高性能的据库访问:在进行据库访问时,往往需要等待据库的响应。采用异步I/O可以在等待据库响应的同时处理其他任务,避免了线程的阻塞。同时,据库操作往往需要消耗大量的时间,采用多线程可以并发地执行多个据库查询,提高了系统的响应速度。 3. 大规模据处理:在进行大规模的据处理时,采用多线程异步I/O可以将据的处理和存储并行进行,提高了处理速度和效率。多线程可以同时处理多个据片段,而异步I/O可以在等待据读取或写入的同时执行其他任务。 4. 响应式用户界面:在用户界面的开发中,往往需要同时处理多个用户的输入和输出。采用多线程异步I/O可以将用户界面的响应和据的处理分离开来,提高了用户界面的流畅性和响应速度。多线程可以实现并发处理用户的输入事件,而异步I/O可以在等待据加载或保存的同时处理其他任务。 综上所述,多线程异步I/O在高并发的网络应用、高性能的据库访问、大规模据处理和响应式用户界面等场景中能够提高系统的并发能力、响应速度和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值