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

zz/2024/4/19 22:44:04

多线程同步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/)


http://www.ngui.cc/zz/2700292.html

相关文章

nodejs 调试技巧

1, 命令行调试 run 执行脚本,在第一行暂停 restart 重新执行脚本 cont, c 继续执行,直到遇到下一个断点 next, n 单步执行 step, s 单步执行并进入函数 out, o 从函数中步出 setBreakpoint(), sb() 在当前行设置断点 setBreakpoint(‘f()’), sb(...) 在函数f的第一…

Zookeeper实战之单机集群模式

Zookeeper的单机模式的安装及应用,但是Zookeeper是为了解决分布式应用场景的,所以通常都会运行在集群模式下。由于手头机器不足,所以打算在一台机器上部署三个Zookeeper服务来组成一个Zookeeper集群。这里解压Zookeeper的安装包到/opt目录下&…

ubuntu系统查找命令

ubuntu系统查找命令 一.以文件名查找: 1. find 命令 find / -name "filename" 目的:在根目录“/”开始搜被称为filename的文件,“filename”文件名可以包含通配符(*,?)&#xff0…

kudu 文件描述符 更改

kudu 文件描述符超过阀值 kudu 文件描述符缺省打开文件数为32768 在/etc/security/limits.d/下找到了cloudera的limit配置文件,里面限制为32768 /etc/security/limits.d/cloudera-scm.conf 修改: 32768会覆盖系统配置,cm启动的进程最大打…

同一局域网内的数据库的连接

1、连接他人的数据库 1)保证两台机器存在同一局域网内,即192.168.后的两个字节是相同的。 例如:教师机的IP4地址是192.168.88.100,你应该将自己的IP4地址设置成192.168.88.53. 2)保证教师机的子网掩码与本机相同。 …

杭电acm2020C语言合法标识符

C语言合法标识符想来大家都知道:该字符串只能由下划线、字母和数字组成,其中首字母不能是数字。 此题的难点是输入字符串个数后会多一个回车,我们得用getchar()把它去掉。此外还有getline(cin,s)和gets(s)能输入带空格的字符串。不过用gets(…

杭电acm2014hide handkerchief

虽然看出来是围着丢手娟了,可是这Haha后面的操作我是一点也没看懂啊。。。看讨论区的大神说是判断两个数是否互为质数。。好吧这个我还是会的。 互质数是两个数只有一个公约数,那就是1。这就好办了,辗转相除法求两个数的公约数,如…

ccf201712-1最小差值(100分)

​​​​​​问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。 输入格式 输入第一行包含一个整数n。   第二行包含n个正整数,相邻整数之间使用一个空格分隔。 输出格式 输出一…

用python打ACM的日子

输入输出 我们都知道打ACM在输入输出都很有特定的要求,比如循环输入样例。 我们用c和c是这样写的。 //C语言 while(~scanf("%d",&n)) { } //或者 while(scanf("%d",&n)!EOF) { }//c while(cin>>n) { }但是呢,本狗…

【面试题】网易互娱(游戏)2020校招在线笔试-游戏研发第一批[水平线]

伞屉国是一个以太阳能为主要发电手段的国家,因此他们国家中有着非常多的太阳能基站,链接着的基站会组合成一个发电集群。但是不幸的是伞屉国不时会遭遇滔天的洪水,当洪水淹没基站时,基站只能停止发电,同时被迫断开与相…