操作系统
操作系统的特征
并发
并发:是指两个或多个时间在用一时间间隔内发生,这些时间宏观上是同时发生的,但微观上是交替发生的
并行:是指,两个或多个事件在同一时刻同时发生
操作系统的并发性是指:计算机系统中“同时”运行着多个程序,这些程序宏观上看是运行着的,而微观上看是交替运行的
单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行
多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行
共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
生活实例:
- 互斥共享方式:使用QQ和微信视频。同一时间段内摄像头只能分配给其中一个进程。
- 同时共享方式:使用QQ发送文件A,同时使用微信发送文件B。宏观上看,两边都在同时读取并发送文件,说明两个进程都在访问硬盘资源,从中读取数据。微观上看,两个进程是交替着访问硬盘的。
虚拟
虚拟是指,把一个物理上的实体变为若干个逻辑上的对应物。物理实体是存在的,而逻辑上对应物是用户感受到的
虚拟技术中的“时分复用技术”。微观上处理机在各个微小的时间段内交替着为各个进程服务
异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一管到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性

只有系统拥有并发性,才有可能导致异步性
没有并发和共享,就谈不上虚拟和异步,因此,并发和共享是操作系统的两个最基本的特征
操作系统的发展与分类
手工操作阶段

批处理阶段 --- 单道批处理系统


批处理阶段 --- 多道批处理系统

分时操作系统

实时操作系统
优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时间内处理完事件。实时操作系统的主要特点是及时性和可靠性
实时操作系统分为两周:
- 硬实时系统:必须在绝对严格的规定时间内完成处理
- 软实时系统:能接受偶尔违反时间的规定
操作系统的运行机制
应用程序分为两种:
- 普通程序员写的就是“应用程序,应用程序只能使用“非特权指令”,如加法指令,减法指令等等
- 操作系统执行的是“内核程序“,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许“管理者”---即操作系统内核来使用
那么 CPU 如何判断出此时正在运行的是内核程序还是应用程序?
CPU 有两种状态,“内核态”和“用户态”
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
CPU 中有一个寄存器叫 程序状态字寄存器(PSW),其中有个二进制位,1 表示内核态,0 表示用户态

中断和异常
中断的作用
在合适的情况下,操作系统内核会把 CPU 的使用权主动让给应用程序
“中断”是让操作系统夺回 CPU 使用权的唯一途径
如果没有中断机制,那么一旦应用程序上 CPU 运行,CPU 就会一直运行这个应用程序
中断的类型
内中断(也称异常、例外):与当前执行的指令有关,中断型号来源于CPU内部
来看几个例子
- 试图在用户态下执行特权指令
- 执行除法时发现除数为 0
- 有些时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令 --- 陷入指令,该指令会引发一个内部中断信号
外中断(也称中断): 与当前执行的指令无关,中断信号来源于 CPU 外部
- 时钟中断 --- 由时钟部件发来的中断信号
- I/O 中断---由输入/输出设备发来的中断信号

中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理,当 CPU 检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到对应中断处理程序在内存中存放的位置

系统调用
什么是系统调用

系统调用和库函数的区别

什么功能需要用到系统调用
凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理)等都必须通过系统调用的方式向操作系统内核提出服务请求

系统调用的过程
- 首先先向 CPU 传递参数,表明系统调用类型,例如,Linux 下的 fork 指令
- 执行陷入指令,该中断由陷入指令引发,因此转入响应的中断处理程序 --- 即系统调用的入口程序
- 根据寄存器中的参数判断用户需要那种系统调用服务
- 然后调用 fork 系统调用的处理程序,让 fork 系统调用的处理程序上 CPU 执行
- CPU 转成用户态,继续执行其他指令





进程的概念、组成、特征
进程的概念
程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列指令集合
进程:是动态的,是程序的一次执行过程
进程的组成
PCB
当进程被创建的时候,操作系统会为该进程分配一个唯一的、不重复的 “身份证号” -- (PID)Process ID,进程 ID
操作系统要记录 PID、进程所属用户 ID(UID)
还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些 I/O 设备、正在使用哪些文件)
还要记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)
这些信息都被保存在一个数据结构 PCB(Process Control Block)中,即进程控制快
操作系统需要对各个并发的进程进行管理,但凡管理时所需要的信息,都会被放在 PCB 中

除了 PCB 之外,进程的组成还包括程序段和数据段

PCB 是给操作系统用的
程序段、数据段是给进程自己用的,与进程自身的运行逻辑有关
进程的特征
程序是静态的,进程是动态的,相比于程序,进程拥有以下特征

进程的状态与转换
进程的状态
创建态、就绪态

运行态

在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)
在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下 CPU,并让它进入 “阻塞态”

当一个进程结束了之后,一个进程可以执行 exit 系统调用,请求操作系统终止该进程
此时该进程会进入“终止态”,操作系统会让该进程下 CPU,并回收内存空间等资源,最后还要回收该进程的 PCB
进程状态的转换


进程 PCB 中,会有一个变量 state 来表示进程的当前状态
如:1. 表示创建态,2.表示就绪态,3.表示运行态,为了对一个状态下的各个进程进程统一的管理,操作系统会将各个进程的 PCB 组织起来
进程的组织
链接方式

索引方式

进程控制
进程控制就是要实现进程状态转换
如何实现进程控制
进程控制是由原语实现的
原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断
为什么进程控制(状态转换)的过程要 “一气呵成”?

如果不是”一气呵成“,当他完成第一步后收到了中断信号,那么 PCB2 的 state=1,但是它却被放在阻塞队列里
如何实现原语的“原子性”
使用 “关中断” 和 “开中断” 这两个特权指令实现原子性的

关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了 “原子性”
进程控制相关的原语


无论哪个进程控制原语,要做的无非三类事情:
- 更新 PCB 中的信息
- 将 PCB 插入合适的队列
- 分配/回收资源


进程通信
进程之间通信(Inter-Process Communication,IPC)是指两个进程之间产生数据交互
为什么进程通信需要操作系统支持?
因为进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,因此,需要操作系统来实现进程中的通信
共享存储

如果使用共享存储来实现进程中通信,应该保证各个进程对共享空间的访问应该是互斥的
各个进程可以使用操作系统内核提供的同步互斥工具,如(P、V)操作
-
基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式,存放的位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式
-
基于数据结构的共享:可以理解为一种特殊的全局变量,比如共享空间里只能放一个长度为 10 的数组,这种共享方式速度慢,限制多,是一种低级通信方式
消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的 “发送消息/接受消息” 两个原语进行数据交换

假设现在进程 P 要发送一个消息给进程 Q

进程 P 现在本地初始化消息 msg,然后使用发送原语 send(Q, msg)
这会让 msg 进入到进程 Q 的消息队列里面
进程 Q 使用接受原语,reveive(P, &msg) ,操作系统会在 Q 的消息队列里面去找有没有这个消息,如果有,就会把 msg 传到 Q 的位置
间接通信方式
间接通信方式,以“信箱”作为中间实体进行消息传递
还是 P 向 Q 发送一个消息
- 进程 P 在自己的地址空间内完善 msg 的内容
- 发送原语,
send(A, msg)往信箱 A 发送消息 msg - 进程 Q 接受原语,
receive(A, &msg)从信箱 A 中接受消息

操作系统允许多个进程往用一个信箱 send 消息,也可以多个进程从同一个信箱中 receive 消息