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'
)
}