异步编程

4.1 CPU 与存储器
目标 : 了解程序运行过程中 CPU 和存储器起到了什么作用或者说扮演了什么角色 .
1. CPU
中央处理器,计算机核心部件,负责运算和指令调用。
开发者编写的 JavaScript 代码在被编译为机器码以后就是通过 CPU 执行的。
2. 存储器
内存:用于临时存储数据,断电后数据丢失。由于数据读写速度快,计算机中的应用都是在内存中
运行的。
磁盘:用于持久存储数据,断电后数据不丢失。内部有磁头依靠马达转动在盘片上读写数据 , 速度
比内存慢。

 

] 计算机应用程序在没有运行时是存储在磁盘中的,当我们启动应用程序后,应用程序会被加载到内存中
运行,应用程序中的指令会被中央处理器 CPU 来执行。
4.2 什么是 I/O
I 就是 Input 表示输入, O 就是 Output 表示输出, I/O 操作就是输入输出操作。什么样的操作属于 I/O
操作呢 ?
比如数据库的读写操作就是 I/O 操作,因为数据库文件是存储在磁盘中的,而我们编写的程序是运行在
内存中的,将内存中的数据写入数据库对于内存来说就是输出,查询数据库中的数据就是将磁盘中的数
据读取到内存中,对于内存来说就是输入。
4.3 I/O 模型
从数据库中查询数据 ( 将磁盘中的文件内容读取到内存中 ) ,由于磁盘的读写速度比较慢,查询内容越多花费时间越多。无论 I/O 操作需要花费多少时间,在 I/O 操作执行完成后, CPU 都是需要获取到操作结果 的,那么问题就来了, CPU 在发出 I/O 操作指令后是否要等待 I/O 操作执行完成呢 ? 这就涉及到 I/O 作模型了, I/O 操作的模型有两种。
第一种是 CPU 等待 I/O 操作执行完成获取到操作结果后再去执行其他指令,这是同步 I/O 操作 ( 阻塞I/O)
第二种是 CPU 不等待 I/O 操作执行完成, CPU 在发出 I/O 指令后,内存和磁盘开始工作, CPU 继续执行其他指令。当 I/O 操作完成后再通知 CPU I/O 操作的结果是什么。这是异步 I/O 操作 ( 非阻塞 I/O) 同步 I/O 在代码中的表现就是代码暂停执行等待 I/O 操作, I/O 操作执行完成后再执行后续代码。 异步 I/O 在代码中的表现就是代码不暂停执行, I/O 操作后面的代码可以继续执行,当 I/O 操作执行完成 后通过回调函数的方式通知 CPU ,说 I/O 操作已经完成了,基于 I/O 操作结果的其他操作可以执行了
( 通知 CPU 调用回调函数 )
同步 I/O 和 异步 I/O 区别就是是否等待 I/O 结果。
Node 采用的就是异步非阻塞 I/O 模型。
const fs = require ( "fs" )
fs . readFile ( "./x.txt" , "utf-8" , function ( error , data ) { console . log ( data ) })
console . log ( "Hello" )
const fs = require ( "fs" )
const data = fs . readFileSync ( "./y.txt" , { encoding : "utf-8" })
console . log ( data )
4.4 进程与线程
每当我们运行应用程序时,操作系统都会创建该应用程序的实例对象,该实例对象就是应用程序的进程,操作系统会按照进程为单位为应用程序分配资源,比如内存,这样程序才能够在计算机的操作系统 中运行起来。
线程被包裹在进程之中,是进程中的实际运作单位,一条线程指的就是进程中的一个单一顺序的控制流。也就是说,应用程序要做的事情都存储在线程之中。可以这样认为,一条线程就是一个待办列表, CPU 执行。
4.5 JS 单线程 OR 多线程 ?
Node.js 代码运行环境中,它为 JavaScript 代码的执行提供了一个主线程,通常我们所说的单线程指的就是这个主线程,主线程用来执行所有的同步代码。但是 Node.js 代码运行环境本身是由 C++ 开发 的,在 Node.js 内部它依赖了一个叫做 libuv c++ 库,在这个库中它维护了一个线程池,默认情况下 在这个线程池中存储了 4 个线程, JavaScript 中的异步代码就是在这些线程中执行的,所以说 JavaScript 代码的运行依靠了不止一个线程,所以 JavaScript 本质上还是多线程的。
const crypto = require ( 'crypto' )
const NUM_REQUESTS = 2 ;
for ( let i = 0 ; i < NUM_REQUESTS ; i ++ ) {
crypto . pbkdf2Sync ( 'srcret' , 'salt' , 10000 , 512 , 'sha512' )
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值