操作系统的特征
并发
共享
虚拟
异步
操作系统的功能
1、资源分配,资源回收
硬件资源 CPU、内存、硬盘、I/O设备。
2、为应⽤程序提供服务
操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。
3、管理应⽤程序
即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。
4、操作系统内核的功能
(1)进程调度能⼒: 管理进程、线程,决定哪个进程、线程使⽤CPU。
(2)内存管理能⼒: 决定内存的分配和回收。
(3)硬件通信能⼒: 管理硬件,为进程和硬件之间提供通信。
(4)系统调⽤能⼒: 为应用提供系统调⽤。
⽤户态和核⼼态
在什么场景下,会发⽣内核态和⽤户态的切换
系统调⽤:当⽤户程序需要请求操作系统提供的服务时,会通过系统调⽤进⼊内核态。
异常:当程序执⾏过程中出现错误或异常情况时,CPU会⾃动切换到内核态,以便操作系统能够处理这些异常
中断:外部设备(如键盘、⿏标、磁盘等)产⽣的中断信号会使CPU从⽤户态切换到内核态。操作系统会处理
这些中断,执⾏相应的中断处理程序,然后再将CPU切换回⽤户态。
进程和线程
Linux内核是不区分进程和线程
进程:是一个正在执行的程序实例,它拥有自己独立的地址空间、内存、数据和文件描述符。
线程:是进程内的执行单元,多个线程共享相同的内存空间和系统资源。
进程:资源分配最小单位。
线程:系统调度最小单位。
资源:进程是系统中拥有资源的基本单位,⽽线程不拥有系统资源,属于同一进程的线程共享资源。
调度:线程切换的代价远低于进程。
并发:
独⽴性:每个进程都拥有独⽴的地址空间和资源、除了共享全局变量,不允许其他进程访问。同⼀进程中的不同线程是为了提⾼并发性以及进⾏相互之间的合作⽽创建的,它们共享进程的地址空间和资源。
系统开销:线程所需要的开销⽐进程⼩
进程控制块
系统通过 进程控制块PCB 来描述进程的基本情况和运⾏状态,就进⽽控制和管理进程,它是进程存在的唯⼀标识, 其包括以下信息:
1. 进程描述信息:进程标识符、⽤户标识符
2. 进程控制和管理信息:进程当前状态,进程优先级
3. 进程资源分配清单:有关内存地址空间或虚拟地址空间的信息,所打开⽂件的列表和所使⽤的I/O设备信息。
4. CPU相关信息: 当进程切换时,CPU寄存器的值都被保存在相应PCB中,以便CPU重新执⾏该进程时能从断 点处继续执⾏;
并发与并⾏
1. 单个处理核在很短时间内分别执⾏多个进程,称为并发
2. 多个处理核同时执⾏多个进程称为并⾏
进程的状态切换
运⾏态: 该时刻进程占⽤CPU
就绪态:可运⾏,由于其他进程处于运⾏状态⽽暂时停⽌运⾏
阻塞态:该进程正在等待某⼀事件发⽣(如等待输⼊/输出操作的完成)⽽暂时停⽌运⾏
挂起状态可以分为两种:
阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
就绪挂起状态:进程在外存(硬盘),但只要进⼊内存,即刻⽴刻运⾏;
进程的上下⽂切换
⼀个进程切换到另⼀个进程运⾏,称为进程的上下⽂切换, 进程的上下⽂切换包括虚拟内存、栈、全局变量 等⽤户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。
进程的时间⽚耗尽
阻塞等待
⾼优先级进程运⾏
中断处理
进程通过睡眠函数 sleep 这样的⽅法将⾃⼰主动挂起
进程的创建
为新进程分配⼀个独特的进程控制块(PCB)
为新进程分配所需要的资源,⽐如内存、CPU时间
初始化进程控制块(PCB)的各种字段,包括状态、优先级、寄存器初始值等。
将其状态设置为就绪状态,使其能够被调度执⾏。进程进⼊就绪队列,等待分配处理器时间。
7、进程的终⽌
根据标识符,查找需要终⽌的进程的 PCB;
如果进程处于执⾏状态,则⽴即终⽌该进程的执⾏,然后将处理器资源分配给其他进程;
如果其还有⼦进程,则应将该进程的⼦进程交给 1 号进程接管;
将该进程所拥有的全部资源都归还给操作系统; 将其从 PCB 所在队列中删除;
8、进程的阻塞
找到被阻塞进程的标识符对应的PCB 如果该进程为运⾏状态,则保护其现场,将其状态转为阻塞状态,停⽌运⾏;
将该 PCB 插⼊到等待队列中,将处理机资源调度给其他就绪进程
9、进程的唤醒
在该事件的阻塞队列中找到相应进程的 PCB;
将其从阻塞队列中移出,并置其状态为就绪状态;
把该 PCB 插⼊到就绪队列中,等待调度程序调度;
进程调度
进程通信
进程之间要通信必须通过内核。
共享存储
消息队列
管道
信号量
信号
Socket通信
守护进程
守护进程是指在后台运⾏的,没有控制终端与它相连的进程。它独⽴于控制终端,周期性地执⾏某种任务。
僵⼫进程
⼀个进程使⽤fork创建⼦进程,如果⼦进程退出,⽽⽗进程并没有调⽤wait或waitpid获取⼦进程
的状态信息,那么⼦进程的进程描述符仍然保存在系统中。这种进程称之为僵⼫进程。
孤⼉进程
⼀个⽗进程退出,⽽它的⼀个或多个⼦进程还在运⾏,那么那些⼦进程将成为孤⼉进程。孤⼉进程
将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集⼯作。
死锁
1、互斥
每个资源要么已经分配给⼀个进程,要么就是可⽤的
2、占有和等待
已经得到了某个资源的进程可以再请求新的资源
3、不可抢占
已经分配给⼀个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放
4、环路等待
死锁发⽣时,系统中⼀定有由两个或两个以上的进程组成的⼀条环路,该环路中的每个进程都在等待着下⼀个进程
所占有的资源。
处理⽅法
1、鸵⻦算法
把头埋在沙⼦⾥,假装根本没发⽣问题。
因为解决死锁问题的代价很⾼,因此鸵⻦算法这种不采取任务措施的⽅案会获得更⾼的性能。
当发⽣死锁时不会对⽤户造成多⼤影响,或发⽣死锁的概率很低,可以采⽤鸵⻦算法。
2、死锁检测与死锁恢复
死锁预防
(1)破坏互斥条件
例如假脱机打印机技术允许若⼲个进程同时输出,唯⼀真正请求物理打印机的进程是打印机守护进程。
(2)破坏占有个等待条件
1. 规定所有进程在开始执⾏前请求所需要的全部资源。
2. 要求当⼀个进程请求资源时,先暂时释放其当前占⽤的所有资源,然后在尝试⼀次获得所需的全部资源。
(3)破坏不可抢占条件
1. 保证每⼀个进程在任何时刻只能占⽤⼀个资源,如果请求另⼀个资源必须先释放第⼀个资源
2. 将所有的资源统⼀编号,进程可以在任何时刻提出资源请求,但是所有请求必须按照资源编号的顺序(升序)提
出
(4)破坏环路等待
死锁避免
(1)安全状态
如果没有死锁发⽣,并且即使所有进程突然请求对资源的最⼤需求,也仍然存在某种调度次序能够使得每⼀个进程
运⾏完毕,则称该状态是安全的。
(2)单个资源的银⾏家算法
⼀个⼩城镇的银⾏家,他向⼀群客户分别承诺了⼀定的贷款额度,算法要做的是判断对请求的满⾜是否会进⼊不安
全状态,如果是,就拒绝请求;否则予以分配。
(3)多个资源的银⾏家算法
检查⼀个状态是否安全的算法
1. 查找右边的矩阵是否存在⼀⾏⼩于等于向量 A。如果不存在这样的⾏,那么系统将会发⽣死锁,状态是不安全
的。
2. 假若找到这样⼀⾏,将该进程标记为终⽌,并将其已分配资源加到 A 中。
3. 重复以上两步,直到所有进程都标记为终⽌,则状态时安全的。
内存管理
虚拟内存<-->内存管理MMU<-->物理内存
⻚⾯置换算法
1、最佳⻚⾯置换算法(OPT)
置换在「未来」最⻓时间不访问的⻚⾯,实际系统中⽆法实现,因此作为实际算法效率衡量标准。
2、先进先出置换算法(FIFO)
将⻚⾯以队列形式保存,先进⼊队列的⻚⾯先被置换进⼊磁盘。
3、最近最久未使⽤的置换算法(LRU)
根据⻚⾯未被访问时⻓⽤升序列表将⻚⾯排列,每次将最久未被使⽤⻚⾯置换出去。
4、时钟⻚⾯置换算法
把所有的⻚⾯都保存在⼀个类似钟⾯的「环形链表」中,⻚⾯包含⼀个访问位。
当发⽣缺⻚中断时,顺时针遍历⻚⾯,如果访问位为1,将其改为0,继续遍历,直到访问到访问位为0⻚⾯,进⾏
置换。
分段
1、纯分段
分段和分⻚本质上是不同的,⻚⾯是定⻓的⽽段不是。
2、分段和分⻚结合