hello,大家好,我是黄小黄。今天开始将进行计算机操作系统的学习啦,文章内容主要参考王道考研408的书籍与课程,与操作系统相关的笔记都会记录在计算机操作系统的专栏中,欢迎点击订阅专栏:点击订阅
话不多说,正文开始!
我们先来看一下电脑是如何诞生的吧:
于是我们得到计算机系统的层次结构如下:
王道书上给出的操作系统的定义如下:
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源分配,以提供给用户和其他软件方便的接口和环境,它是计算机最基本的系统软件。
说明:
操作系统的功能和目标–作为系统资源的管理者
有如下功能:
操作系统的功能和目标–向上层提供方便易用的服务
操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能够更加方便地使用计算机,用户无需关心底层硬件的原理,只要对操作系统发出命令即可。具体见下图:
操作系统使用举例:
直接给用户使用的
给软件/程序员使用的
操作系统的功能和目标–作为最接近硬件的层次
需要实现对硬件机器的扩展。 没有任何软件支持的计算机称为裸机。在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、更方便的机器。
通常把覆盖了软件的机器称为扩充机器,又称为虚拟机。
操作系统对硬件的扩展主要体现在:将CPU、内存、磁盘、显示器等硬件合理组织起来,让各种硬件能够相互协调配合,实现更多更复杂的功能。
并发: 指两个或多个事件在同一时间间隔内发生,这些事件在宏观上是同时发生的,但是在微观上是交替发生的。
并行: 指两个或多个事件同一时刻同时发生。(易混淆)
考点
单核CPU 同一时刻只能执行 一个程序, 各个程序只能 并发 地执行;
多核CPU 同一时刻可以同时执行 多个程序, 多个程序可以 并行 地执行。
共享: 即资源共享,指系统中的资源可供内存中多个并发执行的进程共同使用。
而共享有两种资源共享方式:
为什么说并发性与共享性互为存在条件?该如何理解?
答:以QQ微信同时发送文件为例,两个进程正在并发执行,需要共享地访问硬盘资源。如果失去了并发性,则系统只有一个程序正在运行,那么共享性就失去了存在的意义。如果失去共享性,则QQ微信不能同时访问硬盘资源,就无法实现同时发送文件,无法实现并发。
虚拟: 指把物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑对应物是用户感受到的。
如何理解呢? 我们知道,一个程序需要放入内存并给它分配CPU才能执行。而一个GTA5游戏需要4G运行内存,QQ需要256MB的内存,微信也要256MB内存,而假设电脑只有4GB内存,而这些程序运行需要的内存远远大于4GB,为什么可以同时运行呢?
答:这是虚拟存储器技术。实际只有4GB内存,但是在用户看来似乎远远大于4GB。
异步: 指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进。只有系统拥有并发性,才有可能导致异步性!
手工操作阶段
手工操作阶段计算过程如下图,可见有明显缺点: 用户独占全机、人机速度矛盾导致资源利用率基地!!!
批处理阶段:单/多道批处理系统
单道批处理: 引入脱机输入/输出技术(用外围机+磁带完成),并由监督程序负责控制作业的输入、输出。缓解了一定程度的人机速度矛盾,资源利用率有一定提升。 但是依然存在明显缺点: 内存中仅能有一道程序运行, 只有该程序运行结束后才能调入下一道程序。CPU有大量的时间是在等待I/O完成,资源利用率仍然低。
为了解决上述问题,采用了多道批处理系统: 每次往内存中读入多道程序,多道程序可以并发执行,共享计算机资源,资源利用率大幅提升, CPU和其他资源能保持忙碌状态,系统吞吐量增大。
但是无论是单道还是多道批处理,都没有实现人机交互,用户是无法调试程序的, 为了解决该问题,就有了分时操作系统。
分时操作系统
计算机以时间片为单位轮流为各个用户/作业服务, 各个用户可以通过终端与计算机进行交互。
主要优点: 用户的请求可以被及时响应,解决了人机交互的问题。 允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点: 不能优先处理一些紧急任务。 不区分任务的紧急性。于是就有了实时操作系统。
实时操作系统
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的 主要特点是及时性和可靠性。
主要优点: 能够优先响应紧急任务,某些紧急任务不需时间片排队。
网络操作系统
是伴随着计算机网络发展诞生的,能把网络中各个计算机有机结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信。
分布式操作系统
主要特点是 分布性和并行性。 系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成任务。
个人计算机操作系统:
如Window XP、MacOS等,方便个人使用。
这里需要与cmd等命令行的指令进行区分。这里的指令指的是CPU能够看得懂的机器指令(一串二进制序列)
在CPU设计和生产时候,就划分了特权指令和非特权指令,即CPU执行一条指令前就能判断出其类型。
对于应用程序,只能使用“非特权指令”,例如加法指令,减法指令等。
而对于内核程序,操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许管理者,即操作系统内核来使用。
CPU能判断出指令类型,但是,它是如何区分正在运行的程序是内核程序还是应用程序的呢?
其实,CPU有两种状态,“内核态”和“用户态”。
当CPU处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
当CPU处于应用态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
CPU中有一个寄存器叫做 程序状态字寄存器(PSW), 其中有个二进制位,1表示内核态,0表示应用态。
用户态和内核态是如何进行转化的?
内核态->用户态: 执行一条特权指令–修改PSW标志位为“用户态”,这个动作意味着操作系统主动让出CPU使用权;
用户态->内核态: 由“中断”引发,硬件自动完成变态过程, 触发中断信号意味着操作系统将强行夺回CPU的使用权。
中断的作用
CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序。在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序。
而 “中断”是让操作系统内核夺回CPU使用权的唯一途径。
如果没有“中断”机制,那么一旦应用程序上CPU运行,CPU就会一直运行这个应用程序,就没有并发的一席之地了。
中断的类型
内中断的实例: 试图在用户态下执行特权指令、执行除法指令时发现除数为0。即:若当前执行的指令是非法的,则会引发一个中断信号。
当然,有时候应用程序想要请求操作系统内核的服务,此时就会执行一条特殊的指令:陷入指令, 该指令会引发一个内部中断信号。
执行陷入指令意味着应用程序主动将CPU控制权还给操作系统内核。系统调用就是通过陷入指令完成的。
外中断的实例: 时钟中断–由时钟部件发来的中断信号。每一条指令执行结束时,CPU都会例行检查是否有外中断信号。
内中断也称异常
分为如下三种:
中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。 当CPU检测到中断信号后,会根据中断信号的类型去 查询“中断向量表”, 以此来找到相应的中断处理程序在内存中的存放位置。具体硬件上的实现,将在计算机组成原理中探讨。
“系统调用” 是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
❓ 系统调用与库函数的区别?
答:系统调用应该是比高级语言的库函数更为底层的接口。不过,并不是所有库函数都涉及到系统调用,比如:取绝对值的函数… …
系统调用与库函数的区别见下图:
例子见下图:
那么什么功能需要用到系统调用呢? 王道书给出了如下分类:
系统调用相关功能涉及系统资源管理,进程管理等操作,需要特权指令,所以系统调用处理需要由操作系统欸和程序负责完成运行在核心态。用户程序可以执行trap命令发起系统调用,请求OS服务,相当于把CPU使用权交给OS内核程序。用户程序不能直接执行对系统影响很大的操作,必须通过系统调用的方式请求OS执行,以便保证系统稳定性和安全性,防止用户程序随意更改/访问重要的系统资源,影响其他进程执行。
传递系统调用参数->执行陷入指令(用户态)->执行相应的内请求核程序处理系统调用(核心态)->返回应用程序。
OS运行环境理解为:用户通过OS上层程序,而这个程序依赖OS底层管理程序提供服务支持,当需要管理程序服务时,系统则通过硬件中断机制进入核心态,运行管理程序,也可能是程序运行出现异常情况,被动需要管理程序服务,通过异常处理来进入核心态,管理程序运行结束时,用户程序需要继续运行,此时通过响应的保存的程序现场退出中断处理程序/异常处理程序,返回断点处继续执行。
操作系统的内核
内核是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。
而内核分为大内核和微内核,具体图示如下:
大内核: 将操作系统的主要功能模块都作为系统内核,运行在核心态。
优点:高性能;缺点:内核代码量大,结构混乱,难以维护。
微内核: 只把最基本的功能保留在内核。
优点:内核功能少,结构清晰,方便维护;
缺点:需要频繁地在核心态和用户态之间切换,性能低。
大内核与微内核的区别?
如果应用程序想要请求操作系统的服务,这个服务同时涉及到进程管理、存储管理、设备管理。
如果采用的是大内核的方式,则只需要进行两次变态;
如果采用的是微内核的方式,则需要进行六次变态。
需要注意的是,变态的过程是有成本的,要消耗不少的时间,频繁地变态会降低系统性能。
变态是为了方便描述,实际表述的时候:CPU状态的转换
分层结构
内核分为多层,每层可单向调用更低一层提供的接口。注意,只能调用相邻的,不可以跨层。
这种分级的思想,便于调试和验证,每层都相对独立,可以逐层调试,更加方便。另外,层与层之间的调用接口固定不变,我们可以在层与层之间新加一层,只需要保证原来定义的接口不变。
但是,难以定义边界。比如,进程有时候需要使用到内存管理相关的功能,而内存管理有时候也需要使用进程相关的资源。这种分层的模式,导致有一些不灵活。
模块化
模块化是将操作系统按功能划分为若干个具有一定独立性的模块。每个模块具有某方面的管理功能,并规定好各模块间的接口,使各模块之间能通过接口进行通信。还可以进一步将各模块细分为若干个具有一定功能的子模块,同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法。
模块化即将内核划分为多个模块,各个模块之间相互协作。
内核 = 主模块 + 可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理等。
可加载内核模块:可以动态的加载新模块到内核,而无需重新编译整个内核。
优点: 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发。支持动态加载新的内核模块,比如安装驱动程序等,增加了OS的适应性。任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高。
缺点: 模块间的接口定义未必合理实用;模块间相互依赖,更难调试和验证。
外核
内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全。
外核可以直接给用户进程分配“不虚拟、不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源,减少了硬件资源的“映射层”,提升了效率。
什么是操作系统的引导?
简单来说,开机的时候,怎么让操作系统运行起来,就是操作系统的引导。
解答这个问题前,我们需要知道,磁盘中存储了什么内容。
除了我们能看到的磁盘分区以外,还包含了个主引导记录(MBR),包含了磁盘引导程序和分区表。
C盘: 是这个磁盘的活动分区,安装了操作系统。
操作系统要启动的话,操作系统的数据需要被放到主存中。这里需要补充一个知识点:计算机的主存由RAM和ROM两部分组成。而RAM芯片里的数据,只要关机,就会被清空。而ROM里的数据不会因为断点而消失。
而CPU开机通电后,则会找到引导程序,执行该程序里的指令。指示CPU去把磁盘的主引导记录读入到内存。
重点来啦!主引导记录中有磁盘引导程序和分区表。磁盘引导程序会根据分区表去判断C盘所处的位置,读入C盘的PBR引导程序。PBR引导记录里的程序 ,会找到启动管理程序,通常存储在根目录的某个位置。
操作系统引导的过程:
传统计算机
一台物理机器上只能运行一个操作系统,带来了很多应用上的限制。
虚拟机
使用虚拟化技术,将一台物理机器虚拟化多台机器(Virtual Machine,VM),每个虚拟机器都可以独立运行一个操作系统。
同义术语: 虚拟机管理程序/虚拟机监控程序/Virtual Machine Monitor/Hypervisor