文章目录
知识框架
操作系统的概念
-
计算机体系结构
裸机(硬件)、操作系统、应用程序(软件)、用户
硬件、内核空间、用户空间
-
操作系统的定义
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。
操作系统的功能与目标
- 管理系统资源:文件管理、存储器管理、处理机管理、设备管理
- 提供用户接口:命令接口、程序接口、图形接口
- 扩充硬件机器:扩充裸机以提供功能更强大的扩充机器
操作系统的特征
- 并发:多个事件在同一时间间隔内发生。宏观上同时发生,微观上交替发生。
- 共享:系统中的资源可供内存中多个并发执行的进程共同使用。
- 虚拟:把物理上的实体变为逻辑上的对应物。物理实体是实际存在的,而逻辑上对应物是用户感受到的。
- 异步:多个进程并发执行时,内存中的每个进程何时执行,何时暂停,以怎样的速度向前推进,都是不可预知的。
操作系统的体系结构
- 操作系统内核
- 时钟管理:实现计时的功能
- 中断处理:实现中断机制
- 原语:是一种特殊的程序,处于操作系统最底层,是最接近硬件的部分。这种程序的运行具有原子性,运行时间较短、调用频繁
- 进程管理、存储器管理、设备管理等功能
- 操作系统非内核部分
细节理解
操作系统在计算机系统中的地位
-
计算机体系结构
裸机(硬件)、操作系统、应用程序(软件)、用户
用户可以与操作系统上安装的应用程序进行交互,也可以与操作系统进行直接交互
比如我要组装一台电脑,首先需要一台裸机(也就是纯硬件),然后在裸机上装Windows操作系统,此时我就可以使用操作系统的相关功能,与操作系统进行直接交互,接着还可以在操作系统上装一些应用软件进行交互。
-
操作系统在计算机系统中的地位
操作系统向上面向应用程序和用户,向下面向底层的硬件,它是两者的中介,是沟通两者的桥梁。
操作系统是一个管理者、组织者、协调者的角色。
系统资源
-
计算机资源包括文件、硬件、软件
- 文件:存储在外存中的所有数据
- 硬件:看得见、摸得着的物理部件或设备。
- 软件:一种逻辑的产品,以程序和文档的形式存在,通过在计算机上运行来体现他的作用。
- 系统软件:操作系统、数据库管理系统、语言处理程序、服务性程序、标准库程序等。
- 应用软件:QQ、浏览器、游戏等等
-
管理系统资源
包括文件管理、存储器管理、处理机管理、设备管理
打开QQ进行视频聊天:首先在文件路径中找到qq的可执行程序(文件管理),运行程序,需要将该程序放入内存中(存储器管理),对应的进程被处理机进行处理(处理机管理),使qq正常运行。进行视频聊天,需要将摄像头设备分配给进程(设备管理)
-
文件管理
操作系统管理文件,是指操作系统关心计算机中的文件的逻辑结构、物理结构、文件内部结构、多文件之间如何组织的问题,而不是关心文件的具体内容。
这就好比你是操作系统,有十个水杯让你管理,你负责的是将这些水杯放在何处比较合适,保护好水杯不被人乱动,而不关心水杯中的是水还是饮料。
-
存储器管理、处理机管理、设备管理
操作系统对内存、CPU和I/O设备的管理既是对硬件资源的管理,也是对软件资源的管理(涉及到硬件资源的分配,以及处理机调度的问题)
-
接口
-
命令接口
操作系统面向用户的接口为命令接口
用户与操作系统进行直接交互
- 联机命令接口:交互式,cmd(说一句,做一句),分时或实时系统
- 脱机命令接口:文件式,bat(说一堆,做一堆),批处理系统
-
程序接口
操作系统面向应用程序的接口为程序接口,程序接口由一组系统调用组成
程序接口=一组系统调用,系统调用=广义指令
提供了应用程序使用操作系统内核功能的接口,用户通过在应用程序中使用系统调用来请求操作系统的服务,与操作系统进行间接交互
-
图形接口
图形接口=图形用户界面(GUI)
用户可以使用形象的图形界面进行操作,而不再需要记忆复杂的命令、参数。
比如双击打开程序、拖拽移动程序、点击某个按钮实现功能等等
本质上还是系统调用
-
命令接口和程序接口都是操作系统提供给用户的请求操作系统服务的接口,但并不是所有服务都提供接口,比如操作系统不提供管理系统缓存的接口,系统缓存全部由操作系统管理,对用户是透明的
库文件、库函数、系统调用
-
库文件
提供给开发者者一些开箱即用的变量、函数或类。包括静态库和动态库
- 静态库:在链接过程中使用,使用静态库编译的的可执行程序包含静态库的内容,所以可执行文件的执行不依赖静态库
- 动态库:在执行过程中使用,在执行中需要动态库的支持,将动态库动态加载到内存中,所以可执行文件的执行依赖动态库
Windows系统中,*.lib文件为静态库,*.dll文件为动态库
Linux系统中,*.a文件为静态库,*.so文件为动态库
-
库函数
存放在库文件中的函数,具有明确的功能、入口调用参数和返回值。
-
系统调用
系统调用可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
凡是涉及到系统资源的操作,都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作
系统调用相关处理涉及到对系统资源的管理、对进程的控制,这些功能需要执行一些特权指令才能完成,因此系统调用的相关处理需要在核心态下进行
-
库函数与系统调用的区别
编程语言向上提供库函数,一些库函数会将系统调用进行封装,以隐藏系统调用的一些细节,使编程更加方便。操作系统向上提供系统调用,使得上层程序能请求内核的服务。
库函数是应用程序的一部分,工作在用户空间中,而系统调用是操作系统的一部分,工作在内核空间中。
许多库函数都会使用系统调用来实现功能,当然并不是所有库函数都使用了系统调用。未使用系统调用的库函数运行速度往往比使用了的速度快,因为系统调用需要上下文的切换和状态的转换。
-
系统调用的执行过程
进程在用户态下执行陷入指令/访管指令,发出内中断信号,当前进程阻塞,CPU进入核心态,操作系统介入执行系统调用相应的特权指令。
如下图,我们所执行的库函数write()指令实际上封装了从传参、陷入、系统调用一系列的底层操作
-
传参的三种方式
- 在寄存器中传递参数。(寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果)
- 将参数存储在内存中的表中,表地址作为参数传递到寄存器中。
- 由程序将参数压入(存储)堆栈,由操作系统弹出堆栈。
-
发出系统调用请求是在用户态下进行,而对系统调用的相应处理是在核心态下进行
-
陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令
-
-
系统调用的必要性
如果不存在系统调用,用户进程可以随意访问系统资源,这是一件很危险的事情
比如有多个用户进程都想要使用打印机这种共享资源,如果不存在系统调用,用户进程可以随意地、并发地共享打印机资源,就会导致需要打印的文件在一起。
只能通过系统调用向操作系统内核发出请求,内核会对各个请求进行协调处理,否则两个进程
比如一些共享资源需要由操作系统内核进行统一的管理,并向上提供系统调用 。
-
扩充机器
没有任何软件的计算机为裸机,覆盖了软件的计算机为扩充机器,又称为虚拟机
硬件是最底层的,操作系统可以把最底层的硬件组织起来,封装成一个个功能、程序。普通用户可以直接使用封装好的这功能和程序,无需明白底层的实现逻辑
操作系统扩充裸机以提供功能更强大的扩充机器
四大特征
-
并发
-
并发与并行
- 并发:多个事件在同一时间间隔内发生。宏观上同时发生,但微观上交替发生。
- 并行:多个事件在同一时刻同时发生。宏观上同时发生,微观上也同时发生。
-
一个单核处理机同一时刻只能执行一个程序,因此操作系统会负责协调多个程序交替执行(微观上是交替执行的,但宏观上给用户的感觉就像在同时执行)
即使现在是有多核处理机,操作系统的并发性依然是必不可少的
-
-
共享
-
互斥共享与同时共享
-
互斥共享:某些资源虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
qq视频和微信天不可以同时进行,因为同一时间段内,摄像头这个设备只能分配给一个进程使用。
-
同时共享:某些资源一个时间段内允许多个进程“同时”对它们进行访问,这里的“同时”可以是并发,也可以是并行。
qq和微信可以同时传文件,这两个进程是并发执行的。
打游戏的时候听歌,游戏音效和歌曲同时播放,这两个进程是并行执行的
-
-
并发性和共享性是互为存在条件的。
如果没有并发性,qq和微信传文件的进程不能在宏观上同时进行,那么共享性也就失去了存在意义
如果没有共享性,qq和微信不能同时访问硬盘资源,那么就无法实现同时传文件,也就无法并发
-
-
虚拟
-
空分复用技术与时分复用技术
- 空分复用技术:空间,物理实体上只有4GB的内存,但用户感受到的内存却是超过4GB的
- 时分复用技术:时间,单核处理器也可以同时处理多个进程
-
如果失去了并发性,则一个时间段内系统中只需运行一道程序,那么就失去了实现虚拟性的意义了。因此,没有并发性就没有虚拟性。
-
-
异步
-
同步与异步
-
同步:发送方发出请求后,需要等接收方响应才进行下一步动作。
A叫B去吃饭,如果B没反应,A就继续叫,直到B给出回应后A才决定离开或跟B一起去吃饭
-
异步:发送方发出请求后,不等接收方响应,接着进行下一步动作。
A叫B去吃饭,不管B有没有回应,A就先去吃饭,B可能马上做出回应跟A一起去吃饭,也可能等到A吃完了才去吃饭
-
-
如果失去了并发性,则系统只能串行地处理各个进程,每个进程的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
-
指令、内核
-
指令概念辨析
代码是高级语言,指令是机器语言。指令是处理器能识别、执行的最基本命令
-
指令分为特权指令和非特权指令。
特权指令通常涉及到系统资源,比如对文件进行篡改、对存储器进行操作、调用设备输入输出等等,是比较危险的。
非特权指令往往是“人畜无害”的,比如加减乘除运算指令
-
由此引出CPU的两种状态,即用户态(目态)和核心态(管态)
-
处于用户态(目态)时,只能执行非特权指令
-
处于核心态(管态)时,可以执行特权指令和非特权指令
用程序状态字寄存器(PSW)中的某标志位来标识当前处理器处于什么状态。如0为用户态,1为核心态。
-
-
由此将程序分为内核程序和普通应用程序
-
内核程序:内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
-
普通应用程序:为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态
-
-
由此引出操作系统的内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
实现操作系统内核功能的程序就是内核程序。
-
引出操作系统的体系结构
根据内核是否包括对系统资源进行管理的功能分为大内核和微内核
- 大内核:将操作系统的主要功能模块都作为系统内核
- 微内核:只把最基本的功能保留在内核(时钟管理、中断处理、原语)
类比:操作系统的体系结构问题与企业的管理问题很相似。
内核就是企业的管理层,负责一些重要的工作。只有管理层才能执行特权指令,普通员工只能执行非特权指令。用户态、核心态之间的切换相当于普通员工和管理层之间的工作交接
大内核:企业初创时体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织结构混乱,难以维护。
微内核:随着企业体量越来越大,管理层只负责最核心的一些工作。优点是组织结构清晰,方便维护;缺点是效率低。
时钟管理
时钟又称为定时器,负责维护时间,防止进程垄断CPU。
任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。
时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳,中断之间的时间间隔取决于不同的应用,一般是1ms–100ms,时钟节拍率越快,系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间。
中断机制
-
中断机制的实现过程
中断信号发出时,当前运行的进程被阻塞,CPU从用户态切换为核心态,操作系统接管CPU,由操作系统内核对中断进行处理。对于不同的中断信号,会进行不同的处理
- CPU从用户态到核心态的切换是通过中断机制实现的,且中断是唯一途径
- CPU从核心态到用户态的切换是通过执行特权指令,将程序状态字(PSW)的标志位设置为用户态而实现的
例子:三道程序并发执行。
进程1运行一段时间后,计时部件发出中断信号,CPU切换为核心态,将使用权限交给操作系统,操作系统内核对中断信号进行处理。操作系统发现中断信号是进程1的时间片已到,现在需要换进程2运行。此时操作系统将CPU的使用权限交还给用户进程,进程2就开始在用户态下运行。
进程2运行一段时间后,发出了系统调用(内中断信号),请求输出,CPU切换为核心态,操作系统内核接管进程2发出的调用请求,要求打印机设备开始工作。由于进程2要等待I/O完成,于是需要换进程3执行。此时操作系统将CPU的使用权限还给用户进程,进程3在用户态下运行,同时打印机这个输出设备也开始并行工作。
当打印机工作完成后,会发出I/O完成的中断信号。CPU再次切换为核心态,操作系统内核对中断信号进行处理,现在需要换进程2继续执行。此时CPU权限还给用户进程,进程2在用户态下运行。
-
中断的分类
-
内中断(异常):信号的来源是CPU内部,与当前执行的指令有关
- 陷入(trap)、访管中断:系统调用,有意而为之;进程阻塞
- 故障(fault):可修复的,如缺页;进程阻塞
- 终止(abort):不可修复的,如整数除0;进程终止
-
外中断:信号的来源是CPU外部,与当前执行的指令无关
- 外设请求
- 时钟中断
- 高优先级进程抢占
- 人工干预
内中断是代码导致的——陷入是代码中有系统调用,故障和终止都是代码抛出异常。
与当前代码无关的中断就都归为外中断。
-
-
内中断的处理过程:见系统调用
-
外中断的处理过程
- 执行完每个指令之后,CPU都要检查当前是否有外部中断信号
- 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器PC、各种通用寄存器)
- 根据中断信号类型转入相应的中断处理程序
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行
原语
-
原语的概念
原语是操作系统内核的组成部分,特点是执行期间具有不可中断性。
这种不可中断的操作被称为原子操作,是通过在执行过程中关闭中断实现的,关/开中断指令是特权指令。
原语一般由系统进程调用,运行在核心态下,并且常驻内存。引进原语的主要目的是实现进程的通信和控制。
- 原语的分类
- 请求(Req)型原语:用于高层向低层请求某种业务
- 证实(Cfm)型原语:用于提供业务的层证实某个动作已经完成
- 指示(Ind)型原语:用于提供业务的层向高层报告一个与特定业务相关的动作
- 响应(Res)型原语:用于应答,表示来自高层的指示原语已收到