写在前面

 hello,大家好,我是黄小黄。今天开始将进行计算机操作系统的学习啦,文章内容主要参考王道考研408的书籍与课程,与操作系统相关的笔记都会记录在计算机操作系统的专栏中,欢迎点击订阅专栏:
话不多说,正文开始!


文章目录

  • 写在前面
  • 1 操作系统的概念与功能
  • 2 操作系统的特征
  • 3 操作系统的发展与分类
  • 4 操作系统的运行机制
    • 4.1 特权指令与非特权指令
    • 4.2 内核态与用户态
  • 5 中断和异常
  • 6 系统调用
    • 6.1 什么是系统调用
    • 6.2 为什么系统调用是必须的?
    • 6.3 系统调用的过程
  • 7 操作系统的体系结构
  • 8 操作系统的引导
  • 9 虚拟机

1 操作系统的概念与功能

我们先来看一下电脑是如何诞生的吧:

  1. 厂商会把CPU、内存等硬件组装成一台裸机;
  2. 而在裸机出售前,一般厂商都会安装一个操作系统;
  3. 我们购买电脑后,可以在操作系统上安装应用程序(软件);
  4. 作为用户的我们,可以使用这些应用程序。

于是我们得到计算机系统的层次结构如下:

王道书上给出的操作系统的定义如下:

操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源分配,以提供给用户和其他软件方便的接口和环境,它是计算机最基本的系统软件。

说明:

  1. 操作系统作为软件和硬件中的一个层次,是系统资源的管理者;

  2. 操作系统需要向上层(应用程序和用户)提供方便易用的服务;

  3. 操作系统是最接近硬件的一种的软件。

操作系统的功能和目标–作为系统资源的管理者
有如下功能:

  1. 处理机管理
  2. 存储器管理
  3. 文件管理
  4. 设备管理

操作系统的功能和目标–向上层提供方便易用的服务
操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能够更加方便地使用计算机,用户无需关心底层硬件的原理,只要对操作系统发出命令即可。具体见下图:

操作系统使用举例:
直接给用户使用的

  • GUI:很多操作系统提供了图形化用户接口,用户可以使用形象的图形界面进行操作,而不需要记忆复杂的命令;
  • 联机命令接口:又叫交互式命令接口,用户需要在命令行与计算机系统进行交互,用户说一句,系统跟着做一句,比如win系统我们常常使用的cmd;
  • 脱机命令接口:又叫批处理命令接口,如win系统的搜索功能,搜索某个盘的某个文件。用户说一堆,系统跟着做一堆。

给软件/程序员使用的

  • 程序接口:用户通过程序间接使用,或者通过代码,例如"hello,world"程序中调用的printf函数,底层就是调用了系统提供的服务,使得字符在显示屏上打印。

操作系统的功能和目标–作为最接近硬件的层次
需要实现对硬件机器的扩展。 没有任何软件支持的计算机称为裸机。在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、更方便的机器。
通常把覆盖了软件的机器称为扩充机器,又称为虚拟机。

操作系统对硬件的扩展主要体现在:将CPU、内存、磁盘、显示器等硬件合理组织起来,让各种硬件能够相互协调配合,实现更多更复杂的功能。


2 操作系统的特征


并发: 指两个或多个事件在同一时间间隔内发生,这些事件在宏观上是同时发生的,但是在微观上是交替发生的。
并行: 指两个或多个事件同一时刻同时发生。(易混淆)

考点

单核CPU 同一时刻只能执行 一个程序, 各个程序只能 并发 地执行;
多核CPU 同一时刻可以同时执行 多个程序, 多个程序可以 并行 地执行。

共享: 即资源共享,指系统中的资源可供内存中多个并发执行的进程共同使用。

而共享有两种资源共享方式:

  1. 互斥共享方式: 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源,例如:使用QQ和微信视频,同一时间段只能将摄像头分配给其中一个进程;
  2. 同时共享方式: 系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问,例如:同时使用QQ和微信发送文件,宏观上,两边都是在同时读取并发送文件,说明两个进程都在访问硬盘资源,微观上看,两个进程交替着访问硬盘。

为什么说并发性与共享性互为存在条件?该如何理解?
答:以QQ微信同时发送文件为例,两个进程正在并发执行,需要共享地访问硬盘资源。如果失去了并发性,则系统只有一个程序正在运行,那么共享性就失去了存在的意义。如果失去共享性,则QQ微信不能同时访问硬盘资源,就无法实现同时发送文件,无法实现并发。

虚拟: 指把物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑对应物是用户感受到的。

如何理解呢? 我们知道,一个程序需要放入内存并给它分配CPU才能执行。而一个GTA5游戏需要4G运行内存,QQ需要256MB的内存,微信也要256MB内存,而假设电脑只有4GB内存,而这些程序运行需要的内存远远大于4GB,为什么可以同时运行呢?
答:这是虚拟存储器技术。实际只有4GB内存,但是在用户看来似乎远远大于4GB。

异步: 指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进。只有系统拥有并发性,才有可能导致异步性!


3 操作系统的发展与分类

手工操作阶段
手工操作阶段计算过程如下图,可见有明显缺点: 用户独占全机、人机速度矛盾导致资源利用率基地!!!

批处理阶段:单/多道批处理系统
单道批处理: 引入脱机输入/输出技术(用外围机+磁带完成),并由监督程序负责控制作业的输入、输出。缓解了一定程度的人机速度矛盾,资源利用率有一定提升。 但是依然存在明显缺点: 内存中仅能有一道程序运行, 只有该程序运行结束后才能调入下一道程序。CPU有大量的时间是在等待I/O完成,资源利用率仍然低。

为了解决上述问题,采用了多道批处理系统: 每次往内存中读入多道程序,多道程序可以并发执行,共享计算机资源,资源利用率大幅提升, CPU和其他资源能保持忙碌状态,系统吞吐量增大。

但是无论是单道还是多道批处理,都没有实现人机交互,用户是无法调试程序的, 为了解决该问题,就有了分时操作系统。

分时操作系统
计算机以时间片为单位轮流为各个用户/作业服务, 各个用户可以通过终端与计算机进行交互。

主要优点: 用户的请求可以被及时响应,解决了人机交互的问题。 允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点: 不能优先处理一些紧急任务。 不区分任务的紧急性。于是就有了实时操作系统。

实时操作系统
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的 主要特点是及时性和可靠性。

主要优点: 能够优先响应紧急任务,某些紧急任务不需时间片排队。

网络操作系统
是伴随着计算机网络发展诞生的,能把网络中各个计算机有机结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信。

分布式操作系统
主要特点是 分布性和并行性。 系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成任务。

个人计算机操作系统:
如Window XP、MacOS等,方便个人使用。


4 操作系统的运行机制

4.1 特权指令与非特权指令

这里需要与cmd等命令行的指令进行区分。这里的指令指的是CPU能够看得懂的机器指令(一串二进制序列)

在CPU设计和生产时候,就划分了特权指令和非特权指令,即CPU执行一条指令前就能判断出其类型。

对于应用程序,只能使用“非特权指令”,例如加法指令,减法指令等。
而对于内核程序,操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许管理者,即操作系统内核来使用。

4.2 内核态与用户态

CPU能判断出指令类型,但是,它是如何区分正在运行的程序是内核程序还是应用程序的呢?

其实,CPU有两种状态,“内核态”和“用户态”。
当CPU处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
当CPU处于应用态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。

CPU中有一个寄存器叫做 程序状态字寄存器(PSW), 其中有个二进制位,1表示内核态,0表示应用态。

用户态和内核态是如何进行转化的?
内核态->用户态: 执行一条特权指令–修改PSW标志位为“用户态”,这个动作意味着操作系统主动让出CPU使用权;
用户态->内核态: 由“中断”引发,硬件自动完成变态过程, 触发中断信号意味着操作系统将强行夺回CPU的使用权。


5 中断和异常


中断的作用
CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序。在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序。
“中断”是让操作系统内核夺回CPU使用权的唯一途径。
如果没有“中断”机制,那么一旦应用程序上CPU运行,CPU就会一直运行这个应用程序,就没有并发的一席之地了。

中断的类型

  1. 内中断:与当前执行的指令有关,中断信号来源于CPU内部;
  2. 外中断:与当前执行的指令无关,中断信号来源于CPU外部。

内中断的实例: 试图在用户态下执行特权指令、执行除法指令时发现除数为0。即:若当前执行的指令是非法的,则会引发一个中断信号。
当然,有时候应用程序想要请求操作系统内核的服务,此时就会执行一条特殊的指令:陷入指令, 该指令会引发一个内部中断信号。
执行陷入指令意味着应用程序主动将CPU控制权还给操作系统内核。系统调用就是通过陷入指令完成的。

外中断的实例: 时钟中断–由时钟部件发来的中断信号。每一条指令执行结束时,CPU都会例行检查是否有外中断信号。

内中断也称异常
分为如下三种:

  1. 陷阱、陷入(trap): 由陷入指令引发,是应用程序故意引发的;
  2. 故障(fault): 由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU的使用权交还给应用程序,让它继续执行下去,如缺页故障;
  3. 终止(abort): 由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如整数除以0、非法使用特权指令。

中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。 当CPU检测到中断信号后,会根据中断信号的类型去 查询“中断向量表”, 以此来找到相应的中断处理程序在内存中的存放位置。具体硬件上的实现,将在计算机组成原理中探讨。


6 系统调用

6.1 什么是系统调用

“系统调用” 是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。

系统调用与库函数的区别?
答:系统调用应该是比高级语言的库函数更为底层的接口。不过,并不是所有库函数都涉及到系统调用,比如:取绝对值的函数… …
系统调用与库函数的区别见下图:

6.2 为什么系统调用是必须的?

例子见下图:

那么什么功能需要用到系统调用呢? 王道书给出了如下分类:

  • 设备管理: 完成设备的 请求/释放/启动 等功能
  • 文件管理: 完成文件的 读/写/创建/删除 等功能
  • 进程控制: 完成进程的 创建/撤销/阻塞/唤醒 等功能
  • 进程通信: 完成进程之间的 消息传递/信号传递 等功能
  • 内存管理: 完成内存的 分配/回收 等功能

系统调用相关功能涉及系统资源管理,进程管理等操作,需要特权指令,所以系统调用处理需要由操作系统欸和程序负责完成运行在核心态。用户程序可以执行trap命令发起系统调用,请求OS服务,相当于把CPU使用权交给OS内核程序。用户程序不能直接执行对系统影响很大的操作,必须通过系统调用的方式请求OS执行,以便保证系统稳定性和安全性,防止用户程序随意更改/访问重要的系统资源,影响其他进程执行。

6.3 系统调用的过程

传递系统调用参数->执行陷入指令(用户态)->执行相应的内请求核程序处理系统调用(核心态)->返回应用程序。

OS运行环境理解为:用户通过OS上层程序,而这个程序依赖OS底层管理程序提供服务支持,当需要管理程序服务时,系统则通过硬件中断机制进入核心态,运行管理程序,也可能是程序运行出现异常情况,被动需要管理程序服务,通过异常处理来进入核心态,管理程序运行结束时,用户程序需要继续运行,此时通过响应的保存的程序现场退出中断处理程序/异常处理程序,返回断点处继续执行。


需要注意以下两点:

  1. 陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,使CPU进入核心态;
  2. 发出系统调用请求是在用户态,而 对系统调用的相应处理是在核心态完成的。

7 操作系统的体系结构

操作系统的内核
内核是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。

  • 操作系统内核需要运行在内核态;
  • 操作系统的非内核功能运行在用户态。

内核分为大内核和微内核,具体图示如下:

大内核: 将操作系统的主要功能模块都作为系统内核,运行在核心态。
优点:高性能;缺点:内核代码量大,结构混乱,难以维护。

微内核: 只把最基本的功能保留在内核。
优点:内核功能少,结构清晰,方便维护;
缺点:需要频繁地在核心态和用户态之间切换,性能低。

大内核与微内核的区别?

如果应用程序想要请求操作系统的服务,这个服务同时涉及到进程管理、存储管理、设备管理。
如果采用的是大内核的方式,则只需要进行两次变态
如果采用的是微内核的方式,则需要进行六次变态。

需要注意的是,变态的过程是有成本的,要消耗不少的时间,频繁地变态会降低系统性能。

变态是为了方便描述,实际表述的时候:CPU状态的转换

分层结构
内核分为多层,每层可单向调用更低一层提供的接口。注意,只能调用相邻的,不可以跨层。
这种分级的思想,便于调试和验证,每层都相对独立,可以逐层调试,更加方便。另外,层与层之间的调用接口固定不变,我们可以在层与层之间新加一层,只需要保证原来定义的接口不变。
但是,难以定义边界。比如,进程有时候需要使用到内存管理相关的功能,而内存管理有时候也需要使用进程相关的资源。这种分层的模式,导致有一些不灵活。

模块化
模块化是将操作系统按功能划分为若干个具有一定独立性的模块。每个模块具有某方面的管理功能,并规定好各模块间的接口,使各模块之间能通过接口进行通信。还可以进一步将各模块细分为若干个具有一定功能的子模块,同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法。

模块化即将内核划分为多个模块,各个模块之间相互协作。
内核 = 主模块 + 可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理等。
可加载内核模块:可以动态的加载新模块到内核,而无需重新编译整个内核。
优点: 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发。支持动态加载新的内核模块,比如安装驱动程序等,增加了OS的适应性。任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高。
缺点: 模块间的接口定义未必合理实用;模块间相互依赖,更难调试和验证。

外核
内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全。
外核可以直接给用户进程分配“不虚拟、不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源,减少了硬件资源的“映射层”,提升了效率。

计算机操作系统–体系结构小结


8 操作系统的引导

什么是操作系统的引导?
简单来说,开机的时候,怎么让操作系统运行起来,就是操作系统的引导。
解答这个问题前,我们需要知道,磁盘中存储了什么内容。

在一块磁盘安装完操作系统后,其分布如下图所示:

除了我们能看到的磁盘分区以外,还包含了个主引导记录(MBR),包含了磁盘引导程序和分区表。

C盘: 是这个磁盘的活动分区,安装了操作系统。

操作系统要启动的话,操作系统的数据需要被放到主存中。这里需要补充一个知识点:计算机的主存由RAM和ROM两部分组成。而RAM芯片里的数据,只要关机,就会被清空。而ROM里的数据不会因为断点而消失。

而CPU开机通电后,则会找到引导程序,执行该程序里的指令。指示CPU去把磁盘的主引导记录读入到内存。

重点来啦!主引导记录中有磁盘引导程序和分区表。磁盘引导程序会根据分区表去判断C盘所处的位置,读入C盘的PBR引导程序。PBR引导记录里的程序 ,会找到启动管理程序,通常存储在根目录的某个位置。

操作系统引导的过程:

  1. CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机);
  2. 将磁盘的第一块–主引导记录 读入内存,执行硬盘引导程序,扫描分区表;
  3. 从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序;
  4. 从根目录下找到完整的操作系统初始化程序(即 启动管理器)并执行,完成“开机”的一系列动作。


9 虚拟机

传统计算机
一台物理机器上只能运行一个操作系统,带来了很多应用上的限制。

虚拟机
使用虚拟化技术,将一台物理机器虚拟化多台机器(Virtual Machine,VM),每个虚拟机器都可以独立运行一个操作系统。
同义术语: 虚拟机管理程序/虚拟机监控程序/Virtual Machine Monitor/Hypervisor

  • 第一类VMM:直接运行在硬件上;
  • 第二类VMM:运行在宿主操作系统上。

两类虚拟机管理程序(VMM)的对比