课程:王道计算机考研 操作系统 —— 课程链接
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件
①操作系统是系统资源的管理者
②向上层提供方便易用的服务
③是最接近硬件的一层软件
直观的例子:打开 Windows 操作系统的“任务管理器”(快捷键:Ctrl+Alt+Del)
管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,包括:
处理机管理、存储器管理、文件管理、设备管理
进程:进程是一个程序的执行过程,执行一个程序前需要将该程序放到内存中,才能被CPU处理
一次用QQ和朋友视频聊天的过程:
Step 1:在各个文件夹中找到 QQ 程序安装的位置(如 D:/Tencent/QQ/Bin)---- 文件管理功能
Step 2:双击打开 QQ.exe ---- 存储器管理(内存管理):把程序相关数据存入内存
Step 3:QQ 程序正常运行 ---- 处理机(CPU)管理:给进程分配CPU资源
Step 4:开始和朋友视频聊天,使用摄像头、麦克风 ---- 设备管理:将设备使用权分配给进程,使用完之后将设备使用权回收
提供给用户和其他软件方便的接口和环境
操作系统提供的接口分为三类:命令接口、程序接口、GUI
联机命令接口
:又称交互式命令接口
,适用于分时或实时系统的接口,由一组键盘操作命令组成。用户输入一条指令,操作系统就执行一条指令
脱机命令接口
:又称批处理接口
,使用于批处理系统,由一组作业控制命令组成。用户输入一堆指令,操作系统运行一堆指令。在操作系统运行这些命令时用户不可干预
程序接口=系统调用=系统调用命令=广义指令
裸机
扩充机器或虚拟机
区别两个概念:
并发
:指两个或多个事件在同一时间间隔内
发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
并行
:指两个或多个事件在同一时刻
同时发生。
操作系统的并发性
指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。并发
地执行,因此操作系统会协调多个程序使他们交替进行(这些程序在宏观上是同时发生的,在微观上是交替进行的)并行
地执行共享,即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
注意:所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
举个例子:
互斥共享方式:使用QQ和微信视频。同一时间段内摄像头只能分配给其中一个进程。
同时共享方式:使用QQ发送文件A,同时使用微信发送文件B。宏观上看,两边都在同时读取并发送文件,
说明两个进程都在访问硬盘资源,从中读取数据。微观上看,两个进程是交替着访问硬盘的。
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
虚拟技术可以分为 时分复用技术 和 空分复用技术
在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
第一阶段:无操作系统(手工操作)阶段
手工操作方式:用户独占全机,CPU等待人工操作,人机速度矛盾 。
第二阶段:批处理阶段
单道批处理系统
分时系统:在一台主机上连接了多个带有显示器和键盘的终端,同时允许多个用户通过自己的终端,以交互方式使用计算机,共享主机中的资源。因此,作业直接进入内存,采用轮转运行方式,系统配置一个多路卡(实现分时多路复用),及时接收用户终端命令(数据)。
第四阶段:实时操作系统
实时系统:系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务的协调一致的运行。
1. 两种指令:特权指令、非特权指令
指令:CPU能识别、执行的最基本的命令
CPU通过处理器状态判断是否可以执行特权指令
2. 两种处理机状态
用户态(目态):此时CPU只能执行非特权指令
核心态(管态):此时CPU可以执行特权指令和非特权指令
3. 两种程序
内核程序:可以执行特权指令和非特权指令,运行在核心态
应用程序:只能执行非特权指令,运行在用户态
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。
早期的计算机,各程序只能串行执行,系统资源利用率低。为解决上述问题,人们发明了操作系统,引入中断机制,实现了多道程序并发运行(多道批处理阶段)
本质:只要发生中断,就意味着操作系统介入了程序运行,开展管理工作
发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态。中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。
狭义的中断指外中断
区分:信号来源是CPU外部还是CPU内部
系统调用 是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用
程序调用的 特殊函数,应用程序可以通过系统调用来请求获得 操作系统内核 的服务
为了避免各个进程随意的使用系统资源因而造成混乱,操作系统规定所有用户进程想要使用系统资源时都只能通过 系统调用 来向操作系统发出请求,最后操作系统会对各个请求进行协调管理
应用程序通过 系统调用 请求操作系统的服务。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用相关处理在核心态进行
系统调用是比库函数更底层的接口
○特权指令
从指令系统(指令集)角度定义,在指令系统中拥有用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令将发生异常,并切换到管态由操作系统接管cpu。所以用户程序不得使用特权指令,需要执行特权指令需要使用防管指令,进入核心态。
○访管指令
同样从指令集的角度定义,或者说从硬件角度(cpu状态)。访管指令,是用户程序自愿进管的指令(进管同时也意味着程序放弃cpu的控制权),该指令本身属于非特权指令,可在用户态执行,执行后进入核心态。核心态是通过cpu置相应标志表明当前处于核心态。cpu进入核心态后可以执行指令集中的所有指令(包括特权指令和非特权指令,但不执行访管指令)。
○陷入指令
原则上可看作访管指令,但是从操作系统的角度定义的。访管强调的是cpu从用户态切换到了核心态,可以执行指令集中的所有指令。而陷入(自陷、陷阱)指令强调程序从用户程序切换到了操作系统,陷入指令即汇编中的中断指令,执行陷入指令程序中断,跳转到中断服务程序(操作系统的代码)。所有访管强调的是可以执行特权指令,陷入强调的是进程放弃cpu,交还给操作系统。其实核心态和操作系统是不可分割的:道理很显然,进入核心态(管态),必然需要“跳转”到操作系统,不然区分用户态和核心态就没有了意义,如果程序执行完访管指令后,只是进入了管态,之后仍然执行自身的代码,那用户程序将可以为所欲为,显然不能允许。另一方面,如果cpu跳转到了操作系统,没有进入管态,那操作系统也无法执行特权指令,管理整个机器,显然也不行(当然也存在操作系统一部分运行在用户态,一部分(即内核)运行在管态,此时操作系统获取cpu控制权后不一定是处于核心态)。所有管态就是运行操作系统,访管指令本质上就是一条陷入(中断)指令。
○广义指令(系统调用)
系统调用,从操作系统的角度定义的。指用户程序需要借助操作系统来完成的特定操作,通过陷入指令可以进行系统调用。系统调用是一段代码而不是一条代码,在高级语言层面可能是一条,比如c语言的系统调用write(),在汇编层面这条语句包括,初始化相关参数和寄存器,执行陷入(中断)指令,跳转到中断服务程序,中断返回。之所以需要系统调用是因为用户程序不能执行特权指令,所以当需要完成特权指令才能做的特定操作,必须通过系统调用由操作系统完成。但系统调用一词并非强调程序不能使用特权指令,即不强调“需要”操作系统服务,仅仅强调“希望”让操作系统服务,表达的含义不是"不能"而是"不需要",即目标操作用户程序不需要自己做,直接调用操作系统即可完成,进行系统调用时也并非一定为了执行特权指令,也可能相关操作过于复杂,或者用户程序自身难以实现(有权做但做起来麻烦),而操作系统刚好给出了相应的接口供直接使用。
○库函数
操作系统提供的函数,供用户程序直接调用,简化程序的编写。编程时调用库函数直接使用操作系统已经实现的功能即可。与系统调用有些相似,不过库函数调用可以在用户态执行(不需要执行特权指令时),和普通的函数调用应该并没有什么区别。无需用户态切换到核心态,执行中断服务程序等一些操作。是对系统调用“不需要做”这一概念的推广,另外现在一般用户不直接使用系统调用,而是使用封装好的库函数,由库函数进行系统调用。库函数的意义在于,需要就拿去用,别再浪费时间了,直接用大佬已经实现的来搞。
作者:无法获取该昵称
https://www.bilibili.com/read/cv4393022/
陷入指令=访管指令=trap指令: 程序从应用程序(用户态/目态)切换到内核程序(核心态/管态)
陷入指令属于内中断的一种(详见1.1.5中断和异常)
系统调用的大致过程:
传递系统调用参数 →执行陷入指令(用户态)→执行相应的内请求核程序处理系统调用(核心态)→返回应用程序
注意: