系统概要

1.何为操作系统?

操作系统是运行在计算机上的软件,用于管理软硬件资源。

2.系统调用

核心概念:
系统态划分:操作系统中的进程划分为两类、一类是用户态,一类是系统态。
用户态:用户自己创建的用户程序进程。
系统态:操作系统已经定义运行的进程。
系统调用:
用户自己编写的程序在运行期间,有可能需要使用到系统资源,这时用户态进程就需要通过系统调用向操作系统发出资源调用请求,并由OS代为完成。
系统调用分类:
设备管理、文件管理、进程管理、进程通信、内存管理。

进程&线程

1.并发&并行

并发:多件事在同一时刻同时运行。单核CUP中,实际上还是顺序执行。
并行:多件事在同一时间段同时运行。多见于多核CPU中。

2.同步&异步

同步:事件按照顺序执行,下一条函数需要等待上一次的执行结果返回。
异步:事件无需按照顺序执行,不同事件之间不需要相关结果返回。

3.进程

进程是进程实例中一个独立的运行过程,是操作系统进行资源分配的最小单位。
进程五状态:
操作系统 - 图1
创建状态:进程处于创建状态,但尚未进入到就绪状态。
就绪状态:进程已经创建,且获取到自身所需的资源,等待获取时间片。
运行状态:进程获取到当前CPU时间片,开始运行。
阻塞状态:进程等待。由于CPU需要处理其他任务而使得当前进程失去时间片占用。
结束状态:进程执行完毕,归还自身获取到的所有资源。
进程同步两方式:
为何需要进程同步?
多道程序环境下,进程是异步并发执行的,不同进程之间存在着不同的制约关系。异步进程执行过程中会争夺临界资源。
临界资源?
进程并发执行过程中,需要共享一些资源,而这些资源只能提供给单个当前运行中的进程。这种只能由单
个进程占用的资源叫做临界资源。
临界区?
将进程中用于访问临界资源的代码块叫做临界区。
两种同步机制
私有信号量
P,V原语操作
进程七种通信方式:
进程通信时,需要借助系统内核缓存区来实现信息交换。
管道/匿名管道:用于具有亲缘关系的父子进程、兄弟进程通信。管道属于半双工通信,单条管道只能单向传输。管道的实质是一个内核态缓冲区内核文件该缓存区通常是一个循环队列。
有名管道:匿名管道间亲缘关系进程通信局限性的优化。提供了一种路径与之关联,通过磁盘文件或文件系统文件通信。
信号:信号是一种无需知道进程状态,可在任意时刻发送给进程的机制。
信号量:信号量是通过计数器的方式,实现进程对共享文件的访问,实质在于解决进程同步
消息队列:消息队列是内核中的消息链表,消息队列能够承载更多的信息量。
共享内存:最有用的通信方式。进程将通过共享内存进行进程通信。内核中的共享内存可以直接读取,而不需要拷贝到进程自己的空间中。
套接字:该方式适用于网络间的进程通信,如客户端与服务端通信。套接字为端到端之间的通信。
进程调度算法:
先到先服务:从就绪队列中选择最先进入队列的进程,为止分配所需的资源并开始执行。
短作业优先:从就绪队列中选择最短运行时间的进程,为其分配所需资源并开始执行。
优先级调度:为每个进程分配优先级,优先执行最高优先级的进程。
时间片轮转调度:每个进程轮流拥有时间片,时间片用完则停止运行。
多级反馈队列调度:长度进程都能考虑到。

4.线程

线程属于进程,是操作系统中最小的调度单位。通常是一种指令流、将一条条指令交给CPU执行。
线程七状态:
线程.png
创建状态:线程对象已经创建,但未进入就绪状态
就绪状态:创建后未经系统调度的线程
执行状态:线程抢占到CPU时间片,开始执行
阻塞状态:线程因为资源占用而导致进入暂停等待状态
等待状态:当前线程需要其他线程的一些特定操作(中断、通知等)
超时等待状态:当前线程在指定时间后会开始运行,但是实际不一定会立即执行
结束状态:线程运行结束,归回资源
线程同步、通信方式:
互斥锁:不同线程之间,可以访问公有资源,为了防止并发访问问题,则通过互斥锁使得公有资源在一定时间内只能有一个线程占用,如Java中的Synchronized、Lock等
信号量:通过计数器的方式来限制同一时刻中公有资源的线程访问数量
事件:线程间通过Wait/Notify来进行线程间的通知同步。

5.死锁

多道处理系统中,多个进程之间因为争夺资源/非法的进程推进顺序而导致陷入阻塞无法自行解开的状态。
四个必要条件:
互斥:同一时间段内,共享资源只能有一个进程占用,其他进程必须等待该进程释放资源。
占有并等待:进程占用对方需要的资源不释放,而有等待对象释放自己需要的资源。
不剥夺:进程占有资源后,该进程的资源不能被剥夺,只能自行释放。
循环等待:循环进程队列p0-pn中,p0占用p1需要的资源,依次递推,pn又等待p0释放资源。
四种解决方式:
预防:事先通过一定机制来避免进程间出现死锁问题。效率不高
避免:事先不处理,动态分配资源时,才通过一定的限制条件来避免进程死锁
检测:事先不处理,当出现死锁时,系统可检测出死锁的发生与资源问题,从而定向的解除掉
解除:解除通常和检测配套使用,系统检测出死锁发生和占用了哪些资源,可通过解除来解开死锁的问题
预防死锁:
死锁预防中,通常只需要破坏必要条件中的后三个条件即可。
互斥锁是不能被破坏的。这是系统中固有特性决定,应该加以保持。
1、放弃占有并等待条件:
通常在进程分配资源期间,一次性分配足够的资源,该进程获取到所有资源后,不再提出资源的申请。问题是进程资源的分配存在较大的浪费问题。
2、放弃不剥夺条件:
进程占用资源后,如果需要申请其他资源,但申请失败时,则需要自行释放已占用的资源。
3、放弃循环等待条件:
资源按类型分配序号,进程按照一定的规则来申请资源
避免死锁:
进程预防方案中,通常都需要通过一定的限制条件来限制进程的资源申请,而且都存在一定的效率等问题。
避免死锁方案中,通常是在进程申请资源之前,需要预先考虑此次申请资源的安全性。
安全状态指的是,系统能够按照某种进程顺序来为每个进程分配所需资源,直至满足每个进程的资源需要,且不会造成系统处于不安全状态。
检测与解除:
1、存储资源申请与分配信息;2、算法检测死锁
1、剥夺资源解除;2、撤销进程解除

内存管理

1.任务

OS中的内存管理,主要用于内存分配malloc()、回收free()。

2.存储体系

image.png
逻辑地址:访问指令提供的地址(操作数)称为逻辑地址,也叫作相对地址。
物理地址:通过逻辑地址进行寻址计算变换得到的实际内存单元地址

3.存储管理机制

块式管理
最初始的一种管理机制,将内存分为大小相同的块,每个块中只包含一个进程
进程需要内存,则分配一个内存块,块内地址极大可能存在未被利用的内存,产生碎片。
页式管理
将进程的逻辑地址、系统内存空间分成若干大小相同(一般为2的幂,512B~8KB)的内存页,并进行编号分散存储。OS中允许1M的页数。
业内碎片:进程的最后一页可能无法装满内存物理块,而造成页内碎片。
页表:
由于进程中的每个页是允许分散存储在不同物理块中的,系统加载进程运行时,可通过页表中的页号映射到所在的物理块中
OS访问内存中的页表,根据页号查询到对应的物理块号,将物理块号和页偏移地址进行拼接得到实际的物理地址。
image.png
快表
OS加载进程数据时,需要进入到内存中查询页表。期间需要两次访问内存。一是根据页号查询出映射的物理块号,然后通过物理块号页内偏移量转化出实际的物理地址。二是根据转换后的地址将数据写入内存中。
快表是在页表和OS之间架设一个缓存数据层,CPU给出有效地址后,先查询快表中有无对应的物理地址。有则直接返回;无则查询内存中的页表,然后将页表数据同步更新到快表中。
如果快表已满,则OS必须寻找出较为老的页表数据,并将其替换掉。
段式管理
页式存储管理中,虽然提高了存储效率,但是页表中的页不存在实际意义。将内存分为特定的段后,通过段表来映射地址信息。段式存储能够同时满足系统和用户的多种需求。
段页式管理
页式管理:极大的提高了内存的利用率,减少了外部碎片的产生率。
段式管理:能够同时满足操作系统、用户两者的多种需求。
段页式管理:先将内存分段、然后再将段内存进行分页。
段页式存储中,需要访问三次内存。第一次先从段表中查询到开始的页表。第二次是从页表中查询到实际的物理地址。第三次是根据实际的物理地址访问内存获取到数据。因此,在基础访问之上,也架设了由段号、页号组成的高速缓存器。
image.png

4.虚拟地址

OS加载进程作业时,往往需要将进程的所有数据加载到内存空间中运行。这无疑需要更多的内存空间来支持。
如何解决:一是扩充物理空间;二扩充逻辑地址空间。而逻辑地址空间的扩充正是虚拟地址需要解决的问题。
1.定义:
虚拟地址是操作系统中为每一个进程分配的可独立使用的虚拟连续地址。一般的系统中,通常需要一次性加载进程的所有数据才可以运行。而虚拟存储器则是一种动态加载与替换的技术。
2.局部性原理:
进程在执行过程中,在较小时间段内,一般都是只在执行进程中的部分程序、而对于内存访问来说,也只是在访问局部的内存空间
1.局部性体现:
时间局部性:如果程序中的某条指令一旦执行过,一段时间后该指令可能会再次执行。通常在循环结构中2.较为常见。
空间局部性:如果内存空间中的部分地址单元被访问,一段之间后,该地址单元附近的地址也将可能会被
访问。
3.技术实现:
请求分页、请求分段
注:这两种方式都不同于分页式管理、分段式管理。
4.页面置换算法:
先进先出算法、最佳置换算法、最近最久未使用算法