为啥要引入信号量机制,关于实现进程互斥我们有四种软件实现方法,三种硬件实现方法,但是要么就是不能让上锁和检查一气呵成出现问题,要么就是上述所有方法都有的一个通病:不能实现让权等待。那么,就是信号量机制诞生的意义啦。
系统调用
什么是系统调用
我们知道操作系统要向上提供两种接口,一种是命令接口,一种是程序接口,而程序接口就是由一组系统调用组成,我们可以把系统调用简单的理解为,可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
系统调用功能
需要注意的是,有的功能是需要特权指令的,因此要在系统调用的相关处理要在核心态下进行
系统调用与库函数的区别
图中黑色箭头表示,我们本该用汇编语言调用系统调用,但现在我们一般都通过调用高级语言的库函数来实现调用系统调用,因为库函数封装好了系统调用。
传递系统调用参数->执行陷入指令(用户态)->执行系统调用响应服务程序(核心态)->返回用户程序
这里需要注意,陷入指令是唯一一个只能在用户态执行而不能在核心态执行的指令
发出用户系统调用请求是在用户态,对系统调用的处理在核心态中断和异常
中断机制的诞生
早期的计算机程序只能串行执行,什么意思呢,就是计算机只能处理一个程序,这个程序处理完了,下一个程序才能拿到计算机里来运行,这样就大大降低了资源利用率。为了解决这个问题,人们就发明了操作系统,从而引入了中断机制,实现了多道程序并发执行。事实上,我们只要知道,发生中断就意味着需要操作系统介入,开展管理工作.
中断的概念及作用
下面我们大概来看看过程
如图所示,因为中断的引入,我们可以实现多道程序并发执行。我们来模拟一下中断过程,
进程1时间片用完了,计时器向CPU发出中断信号,CPU就会切换为核心态,这个时候就是将管理权交到了操作系统的手上,操作系统的内核就会对中断信号做处理,也就是停止进程1,让进程2运行,处理完之后会用指令再转换成用户态,这个时候进程2就开始运行了;当进程2运行一段时间后,他想输出,但I/O这是特权指令,他就得申请,他就发出系统调用(内中断信号),这是CPU转到核心态,交给操作系统处理,操作系统会根据进程2的请求,让打印机打印,进程2停止运行去等待打印机,换进程3运行,再转回用户态,这时当打印机完成了,他会向CPU发出中断信号,告诉他自己完成了,CPU又转换为核心态交给操作系统,操作系统就让进程2恢复,完成后续工作。再转成用户态,进程2继续执行。
通过上面的栗子,我们不难看出,只要CPU一收到中断信号,他就要转成核心态,用户程序停止运行,操作系统内核对中断处理完之后,转回用户态,用户程序按操作系统的安排继续运作。
最最最重要的:用户态转核心态,有且仅有中断这一种方法,核心态转用户态是通过执行一个特权指令,将程序状态字的标志位设置为用户态中断分类
内中断和外中断区别的根本在于中断信号的来源,内中断是来自CPU内部,与当前执行的指令有关,比如说时间片用完了,计时器向CPU发中断信号;外中断来自于CPU外部,与当前执行的指令无关,比如说刚刚的打印机发给CPU它打印结束了。
词法作用域
作用域有两种模型,一种是词法作用域,一种是动态作用域,而js用的就是词法作用域。词法作用域就是在词法化时的作用域,变量及代码块写在哪就是在哪,当词法分析器处理代码时不会改变作用域。
什么是作用域
一·编译原理
javascript是一种“解释执行”语言。它跟传统的编译语言编译时间不一样但编译的步骤基本相似且javascript的要更为复杂。因为与其他编译语言不同,他不需要提前进行编译,就导致了他没有太多时间进行优化,他只是在代码执行前进行几毫秒的编译。所以,他就想各种方法来进行性能优化,比如JIT(延迟编译)甚至实施重编译。