异步
概念:异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停的,以不可预知的速度向前推进,这就是进程的异步性。
例子:一号的指令1:老渣陪我吃饭,一号的指令2:老渣把心给我;二号的指令1:老渣把心给我,二号的指令2:老渣陪我吃饭;
与一、二号的约会 = 两道并发执行的程序
老渣的心 = 有限的系统资源
由于并发运行的程序会争抢着使用系统资源,而系统中的资源有限,因此进程的执行不是一贯到底的,而是走走停停的,以不可预知的速度向前推进如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
上面介绍了操作系统的四个特征,并发,共享,虚拟,异步。
并发和共享互为存在条件
没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本的特征
发展与分类
手工操作阶段
程序员把程序写到纸带上,有孔的地方代表二进制的1,没有孔的地方代表二进制的0,然后把写好的程序放到纸带机上,由计算机读取计算,把结果再写到纸带机上打印出,最后由程序员读取。
主要缺点:用户独占全机,人机速度矛盾导致资源利用率极低。
批处理阶段
单道批处理系统
引入脱机输入/输出技术(用外围机+磁带完成),并由监督程序负责控制作业的输入,输出。
这里体现出了操作系统的雏形。
主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待I/O完成。资源利用率依然很低。
多道批处理系统
每次往内存中读入多道程序,这时候操作系统正式诞生,用于支持多道程序并发运行。
主要优点:多道程序 并发 执行, 共享 计算机资源。 资源利用率大幅提升 , CPU 和其他资源更能保持“忙碌”状态,系统吞吐量增大。
主要缺点:用户响应时间长, 没有人机交互功能 (用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。eg :无法调试程序 / 无法在程序运行过程中输入一些参数)
分时操作系统
分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性。
实时操作系统
实时操作系统:
主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性。
运行机制
在开始之前,我问下大家,程序是如何运行的?
C语言代码通过编译器"翻译"成机器指令也就是二进制,一条高级语言的代码翻译过来可能对应多条机器指令,如下所示:
程序运行的过程其实就是CPU执行一条一条机器指令的过程。
"指令"就是处理器(CPU)能识别,执行的最基本命令
注意:很多人习惯把Linux,Windows,MacOS的"小黑框"中使用的命令也称为"指令",其实这是"交互式命令接口",注意与本文的"指令"区别开。
内核程序VS应用程序
我们普通程序员写的程序就是“应用程序”
微软、苹果有一帮人负责实现操作系统,他们写的是“内核程序”
由很多内核程序组成了“ 操作系统内核 ”,或简称“ 内核( Kernel ) ” 内核 是操作系统最重要最核心的部分,也是 最接近硬件的部分 甚至可以说,一个操作系统只要有内核就够了(eg : Docker—> 仅需 Linux 内核)操作系统的功能未必都在内核中,如图形化用户界面 GUI。
特权指令VS非特权指令
应用程序只能使用"非特权指令",如:加法指令,减法指令等等。
内核程序作为"管理者",有时会让CPU执行一些"特权指令",如:内存清零指令,这些指令影响重大,只允许"管理者"--即操作系统内核来使用。
在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判读初其类型。
内核态VS用户态
CPU能判断出指令类型,但是它怎么区分此时正在运行的是内核程序or应用程序?
CPU 有两种状态,“内核态”和“用户态”
处于 内核态时 ,说明此时正在 运行的是内核程序, 此时 可以执行特权指令
处于 用户态时 ,说明此时正在 运行的是应用程序, 此时 只能执行非特权指令
拓展: CPU 中有一个寄存器叫 程序状态字寄存器( PSW ) ,其中有个二进制位, 1 表示 “内核态”,0 表示“用户态”
别名 :内核态 = 核心态 = 管态 ;用户态 = 目态
内核态和用户态的切换
内核态-> 用户态: 执行一条 特权指令 —— 修改 PSW 的标志位为“用户态”,这个动作意味着操作系统
将主动让出 CPU 使用权
用户态-> 内核态: 由 “中断” 引发, 硬件自动完成变态过程 ,触发中断信号意味着操作系统将强行夺
回 CPU 的使用权
举个例子:
1.刚开机时,CPU 为“内核态”,操作系统内核程序先上CPU运行
2.开机完成后,用户可以启动某个应用程序
3.操作系统内核程序在合适的时候主动让出 CPU,让该应用程序上CPU运行
操作系统内核在让出CPU之前,会用一条特权指令把PSW的标志位设置为"用户态"
4.应用程序运行在“用户态"
5.此时,一位猥琐黑客在应用程序中植入了一条特权指令,企图破坏系统…
6.CPU发现接下来要执行的这条指令是特权指令,但是自己又处于“用户态”
7.这个非法事件会引发一个中断信号
CPU检测到中断信号后,会立即变为"核心态",并停止运行当前的应用程序,转而运行处理中断信号的内核程序。
8.“中断”使操作系统再次夺回CPU的控制权
9.操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序
操作系统内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。
大内核:将操作系统的主要功能都作为系统内核,运行在核心态;优点:高性能;缺点:内核代码庞大,结构混乱,难以维护
微内核:只把最基本的功能保留在内核;优点:内核功能少,结构清晰,方便维护;缺点:需要频繁在核心态和用户态之间切换,性能低。
类比:
操作系统的体系结构问题与企业的管理问题很相似。
内核 就是企业的 管理层 ,负责一些重要的工作。只有管理层才能执行 特权指令 ,普通员工只能
执行 非特权指令 。 用户态 、 核心态 之间的 切换 相当于普通员工和管理层之间的 工作交接
大内核:企业初创时体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织
结构混乱,难以维护。
微内核:随着企业体量越来越大,管理层只负责最核心的一些工作。优点是组织结构清晰,方
便维护;缺点是效率低。
中断和异常
中断的作用
“中断"会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权。
CPU 上会运行两种程序,一种是操作系统内核程序,一种是应用程序。
在合适的情况下,操作系统内核会把 CPU 的使用权主动让给应用程序(第二章进程管理相关内容)
“中断”是 让操作系统内核夺回 CPU 使用权 的唯一途径
如果没有“中断”机制,那么一旦应用程序上 CPU 运行, CPU 就会一直运行这个应用程序
既然如此,如果没有中断技术,那何来的"并发"?
内核态-> 用户态: 执行一条 特权指令 —— 修改 PSW 的标志位为“用户态”,这个动作意味着操作系统
将主动让出 CPU 使用权
用户态-> 内核态: 由 “中断” 引发, 硬件自动完成变态过程 ,触发中断信号意味着操作系统将强行夺
回 CPU 的使用权
中断的类型
内中断(异常,例外)
与当前执行的指令有关,中断信号来源于CPU内部。
例子1:试图在用户态下执行特权指令
例子2:执行除法指令时发现除数为0
若当前执行的指令是非法的,则会引发一个中断信号。
例子3:有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内部中断信号
指令"陷入指令",意味着应用程序主动地将CPU控制权还给操作系统内核。"系统调用"就是通过陷入指令完成的。
外中断(中断)
与当前执行的指令无关,中断信号来源于CPU外部。
每一条指令执行结束时,CPU都会例行检查是否有外中断信号
例子 1:时钟中断——由时钟部件发来的中断信号
通过这个就可以实现两个进程并发运行。
总结:
中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号
的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。
总结: