0%

JS同步异步

李龙海老师在移动互联网的课上讲了比较重要,比较吃内功的概念:

同步与异步,阻塞与非阻塞。

再加上选课网站的各种奇葩操作,毕竟泥电的网站也不是一次两次被吐槽了,所以这堂课的效果比任何一次都好,下面系统理解记录一下同步与异步的知识。

这个故事很有利于理解:

老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞) 老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀嘀嘀的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞) 老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞) 老张觉得自己聪明了。

所谓同步异步,只是对于水壶而言。 普通水壶,同步;响水壶,异步。 虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。 同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张而言。 立等的老张,阻塞;看电视的老张,非阻塞。 情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

前置概念理解

①用户空间和内核空间

②进程切换

​ ·系统调用(system call)

​ ·中断(interrupt)

③进程阻塞

1.用户空间&内核空间

首先认清一个事实:用户空间与内核空间都是针对内存而言的。

CPU执行的所有指令中,有一些指令是非常危险的,会对系统造成不可逆的伤害,比如使系统崩溃、重置时钟等。linux是一个多任务系统,在支持多个任务同时执行的同时也要保证不同进程之间相互独立。它执行的所有任务中如果都能执行不小心就G掉系统的指令,那就一眼丁真,鉴定为:大概率要G。

👇是从整体结构来讲解linux系统构成

所以,操作系统要有高于普通用户的权限,以此来管理任务。于是,CPU将所有的指令分为两类:特权指令非特权指令,与之相对:内存被分为内核空间用户空间。比如Intel的CPU将特权等级分为:Ring0~Ring3,这4个等级。linux和Windows都只使用了两个等级:Ring0和Ring3。

Ring3:进程运行在用户空间,处于用户态

Ring0:进程运行在内核空间,处于内核态

内核态下,进程运行在内核地址空间,此时CPU可以执行任何指令,运行代码不受任何限制,可以自由访问任何有效地址

✍补充:所有的系统资源管理都是在内核空间中完成的,比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。

用户态下,进程运行在用户地址空间,被执行的指令要受到CPU的严格检查,只能访问地址空间页表中规定的可访问页面的虚拟地址

内核空间存储的内容有更高级别的权限,内存访问的相关硬件在程序执行期间会进行访问控制,使得用户空间的程序不能直接读写内核空间的内存

👋区分内核空间和用户空间本质:提高操作系统的稳定性及可用性。

2.进程切换

进程切换主要是讲用户态与内核态的转换,打个比方:应用程序把资源管理这些事情外包给内核,中间的过程就叫进程切换。

(1)系统调用

操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务。本质就是函数调用,只不过调用的是系统函数,处于内核态而已。

(2)中断

中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。

3.进程阻塞

进程在发起了一个系统调用 后, 由于该系统调用的操作不能立即完成,需要等待一段时间,于是内核将进程挂起为等待 (waiting)状态, 以确保它不会被调度执行, 确保不会占用 CPU 资源。

  • 单核CPU在同一时间只能处理一个进程
  • 多核CPU可以同时执行多个进程,进程个数不大于核数

阻塞这个词和系统调用牢牢地套在一起,不可分开,因为系统调用涉及到了I/O操作,不能立即完成。

进程发生阻塞有2种方式:

①自己把自己用sleep()或wait()挂起来

②系统调用把它挂起来

同步与异步

同步:一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为

异步:一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。然而异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作

同步还得你自己多去几趟,看是否完成,异步就啥都不用管,它做完了就直接通知你了。

阻塞与非阻塞

是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态,解决了等待数据返回时的状态问题。

被挂起无法执行其他操作的则是阻塞型的;

可以被立即抽调去完成其他任务的则是非阻塞型的。

-------------本文结束感谢您的阅读-------------
请作者喝一杯蜜雪冰城吧!