目录
一、什么是操作系统
1.是管理计算机硬件和软件资源的计算机程序
2.五大功能:
(1)处理机管理(cpu)
(2)进程管理
(3)内存管理
(4)设备管理
(5)文件系统管理
二、系统调度(进程和线程)
1.引起进程调度的原因有以下几类
(1)正在执行的进程执行完毕
(2)正在执行的进程调用阻塞原语将自己阻塞,进入睡眠
(3)调用P原语,资源不足而阻塞;调用V原语,激活等待的线程
(4)分时系统中,当前进程的时间片用完
(5)就绪队列中出现优先级更高的进程
2.进程的上下文切换
(1)概念:
将cup状态从一个进程切换到另一个进程,其实就是运行环境的切换
(2)状态
【1】进程运行时:其硬件状态保存在CPU寄存器中
【2】进程不运行时:寄存器的值保存在进程控制块中,当操作系统要运行一个新的进程时,将进程控制块中相关值送到对应的寄存器中。
注:
1.进程的内存布局:代码段、数据段、堆、栈、寄存器
2.寄存器有:程序计数器、程序状态寄存器、栈指针、通用寄存器等
3.进程的状态:
(1)就绪状态:除cpu以外所有资源准备完毕,只要获得处理机就能立即执行。
-》在一个系统中,可以有多个进程同时处于就绪状态,通常把他们排成一个就绪队列
(2)执行状态:进程已获处理机并正在执行
-》单处理机系统只能有一个进程处于执行状态
(3)阻塞状态 :进程因某事件(如请求I/O,申请缓存空间等)而暂停执行的状态,即进程执行受到阻塞的状态
-》通常阻塞状态的进程排成一个阻塞队列
(4)挂起状态:待补充
-》在某些操作系统中存在挂起状态
4.创建进程的流程
1.分配初始化PCB( Process Control Block)
2.初始化寄存器
3.拷贝、初始化内存页表
4.从硬盘拷贝程序到内存
5.将进程添加到就绪队列中
6.线程调度时选择该进程,并切换到用户态执行
5.进程调度的算法
1.先来先服务(FCFS):
-》算法简单,对长作业有利,对短作业不利
2.时间片轮转:
(1)系统将所有就绪进程排成一个队列
(2)按照先来先服务从前往后执行
(3)但每个进程仅能运行一个用户设定的时间片大小(如100ms)
(4)时间到则停止执行,并将未执行完的进程放到队列尾部等待下次执行
注:如果时间片大于所有进程执行时间,那么时间片轮转==先来先服务
-》时间片大小对系统性能影响很大,要选择合适大小
3.短作业优先:总是调度当前执行时间最短的进程
-》对长作业不利,甚至由于总是调用短进程,导致长进程始终无法执行
-》不能保证紧迫作业及时处理
-》作业长短只是根据用户提供的估计时间而定,调度不一定准确
4.优先级调度:
(1)非剥夺式
更为重要的进程进入就绪队列,会让当前进程执行完才把处理机交给更重要的。
(2)剥夺式
更为重要的进程进入就绪队列,则立即暂停正在运行的进程,将处理机交给重要的。
5.多级反馈队列调度
(1)设置多个就绪队列,优先级从1~n逐渐降低
(2)每个队列的时间片不同,下一级是上一级的2倍长
(3)进程进入内存按照FCFS进入第一级就绪队列尾部,直到轮到他
(4)若该进程可以在规定时间片处理完成,则可以撤离。若无法完成,则进入第二级队列尾部
(5)再按照FCFS原则将第一级队列执行完,才去执行第二级队列。
(6)再次遇到该进程,同样是能执行完可撤离,不能执行完进入下一级队列尾部,依次类推
注:如果处理机在处理第i级队列进程时,出现优先级较高的队列进程,则会抢占当前处理机,并叭正在运行进程放到第i级队列的末尾。
-》优势如下
1.终端型作业:短作业优先
2.短作业:周转时间短
3.长作业:经过前面几个队列会得到部分执行,不会长期得不到处理
三、进程间如何通信
1.管道
(1)无名管道
管道通常指无名管道, 它会创建两个文件描述符:fd[0]为读文件描述符,fd[1]为写文件描述符
特点:
-》半双工:数据只能在一个方向上流动
-》只能用于具有亲缘关系的进程间通信
-》可以看成是一种特殊文件(对于它的读写也可以使用普通的read、write等函数),但是它不是普通文件,不属于任何文件系统,并且只存在于内存中
(2)命名管道
FIFO是一种文件类型,同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据,且“先进先出”。
特点:
-》FIFO可以在无关进程之间交换数据
-》FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
2.共享内存
(1)概念:指两个或多个进程共享一个给定的存储区
(2)特点:
-》最快:是最快的一种IPC(inter-Process Communication),因为进程是直接对内存进行存取
-》同步:由于多个进程同时进行操作,所以需要进行同步
-》结合:信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
3.信号量
(1)概念:它是一个计数器,用于实现进程间的互斥同步
(2)特点:
-》信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
-》信号量基于操作系统的P、V操作,程序对信号量的操作都是原子操作
-》每次对信号量的P、V操作可以加减任意正整数(而不是加1减1)
-》支持信号量组
4.消息队列
(1)概念:是消息的连接表,存放在内核中。一个消息队列由一个标识符(队列ID)唯一标识。
(2)特点:
-》面向记录:其中的消息具有特定的格式以及特定的优先级
-》独立于发送和接收进程:进程终止时,消息队列及其内容不会被删除
-》支持消息随机查询:不仅支持先进先出读取,并且支持类型读取
5.Socket
更为一般的进程间通信机制,可以用于不同机器之间的进程间通信
四、死锁
- 概念
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 - 死锁产生的原因
(1)因竞争资源发生死锁
现象:系统中供多个进程共享的资源的数目不足以满足全部进程的需要时,就会引起对诸资源的竞争而发生死锁现象
(2)进程推进顺序不当发生死锁 - 死锁产生的四个必要条件(有一个条件不成立,则不会产生死锁)
(1)互斥条件:一个资源一次只能被一个进程使用
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
(3)不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
(4)循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系 - 处理死锁的方法
只要上述一个条件不成立,就不会产生死锁,所以解决死锁的基本方法有:预防死锁、避免死锁、检测死锁、解除死锁。
(1)预防死锁(破坏四个必要条件):
资源一次性分配:(破坏请求和保持条件)
可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
(2)避免死锁(银行家算法):
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
(3)检测死锁解除死锁
通过将资源分配图简化的方法来检测系统状态S是否为死锁状态。
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
①剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
②撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止。
(4)放任不管
大多数操作系统都采取这种方法,由于死锁发生的概率比较小,所以当发生时候让应用程序去解决就行了,例如通过重启来解决
五、内存管理
1.什么是内存
内存是用来存放数据的硬件
程序执行前都是先放在内存中才能被CPU执行
2.逻辑地址 物理地址 线性地址 相对地址 绝对地址
(1)逻辑地址:是指由程序产生的与段相关的偏移地址,它是相对于当前进程数据段的地址。
(2)线性地址:是逻辑地址到物理地址的中间层。
程序经过编译后产生逻辑地址,或者说段中的偏移地址,再加上基地址就生成了一个线性地址。
若启用了分页机制,则线性地址会再次转换产生一个物理地址,若没有启用分页,则线性地址直接就是物理地址。
(3)物理地址:是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终地址。
若启用分页机制,则线性地址会使用页目录和页表中的项转换为物理地址。
若没有启用,则线性地址直接就是物理地址。
-》相对地址又称为逻辑地址,绝对地址又称为物理地址
3.为什么要内存管理?什么是虚拟内存?
1.为什么要进行内存管理?
(1).为什么要进行内存管理:
因为内存是稀缺资源,容量很少
引入虚拟内存技术,现在的内存管理不是对物理地址的管理,而是对虚拟地址的管理;
(2).如何管理虚拟内存空间:
通过MMU(内存管理单元)的地址转换机制,完成虚拟空间到地址空间的映射;
(3).虚拟内存的思想:
虚拟内存的思想是允许程序占用的空间超过内存的大小,把程序划分为大小固定的页,由操作系统根据程序运行的位置把正在执行的页面调入内存,其他程序依旧存储在硬盘上,也叫写时复制;操作系统根据内存配置决定一次加载多少页面到内存;
2. 虚拟内存
为了更好的管理内存资源,虚拟内存必须为每个进程提供一个大的(确保进程可以顺利的运行),一致的(我们应该对需要进行运行的进程一视同仁)和私有的(确保不同的进程不会意外的写进另外一个进程的存储空间造成错误)存储空间。
- 虚拟内存的作用与缺点
好处:
(1) 扩大地址空间。无论段式虚存,还是页式虚存,或是段页式虚存,寻址空间都比实存大。
(2)内存保护。每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。另外,虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改。
(3)公平分配内存。采用了虚存之后,每个进程都相当于有同样大小的虚存空间。
(4)当进程需要通信时,可采用虚存共享的方式实现。 - 不过,使用虚存也是有代价的,主要表现在以下几个方面:
(1)建立数据结构占用内存
(2)虚拟地址到物理地址的转换增加指令执行时间
(3)页面的换入换出需要磁盘I/O消耗时间
(4)页中存储不满会浪费内存
4.什么是缓存
概念:是CPU中的一部分,它存在于CPU中
目的:为了解决CPU速度和内存速度的差异
操作:内存中被CPU访问最频繁的数据和指令被复制到CPU缓存中,这样再次使用这些数据时,CPU就可以直接去更快的缓存中取用。
不足:缓存空间小,存放数据有限,因此要经常按照一定的算法来更换
5.缓存替换算法
(1)随机算法(RAND)
概念:使用随机数发生器产生一个要替换的块号,并将该块替换出去。
特点:
-》简单、易于实现
-》没有利用上层存储器的历时信息,没有根访存的局部性原理,不能提高Cache的命中率
(2)先进先出算法(FIFO)
概念:将最先进入Cache的信息块替换出去。
特点:
-》比较容易实现,系统开销小
-》利用了主存的历史信息,但不能正确反映程序局部性原理
-》因为并不能说最先进入就不经常使用,无法提高Cache的命中率
(3)最近最少使用算法(LRU)
概念:将近期最少使用的Cache中的信息块替换出去
特点:
-》比FIFO要好,但不能保证过去不常用将来也不常用
-》需要随时记录Cache中各个块的使用情况,系统开销大,通常需要对每一块设置一个计数器模块。
(4)最优替换算法(OPT)Optimal replacement
概念:使用OPT需要先执行一次程序,统计Cache的替换情况作为先验信息。再次执行时就可以用最有效的方式替换,达到最优目的。
前面介绍的几种算法主要以历史信息为依据,但过去页面的调度情况和将来未必相同。
最好的算法应该是选择最久不被访问的页面作为被替换的页面,他就是最优替换算法。
特点:
-》OPT是一种理想化的算法,先执行一遍不现实
-》经常将这种算法用作评价其他替换算法好坏的标准
(5)最少使用算法(LFU)Least Frequently Used
概念:选择最少访问的页面作为被替换的页面
特点:
-》较为合理:利用了页面调度情况的历史信息和程序的局部性,
-》实现起来非常困难:需要为每个页面设置一个很长的计数器
分页的问题及解决方案:
页表会很大,页表放置就成了问题
地址是32位的(4G),页面尺寸通常是4K的,因此会产生2^20个页面(4M)的内存。假设并发10个进程,需要40M内存。
-》分析:实际上大部分逻辑地址根本不会用到
-》解决尝试一:只存在用到的逻辑页
由于需要多次访问内存,会降低CPU运行效率,没有直接使用连续地址的偏移一次完成的快。
所以必须连续存放,不能只存放用到的逻辑页
-》解决尝试二:多级页表
多级页表的问题
-》多级页表时间问题的解决:快表
快表是CPU中的寄存器,运行速度非常快,但是存储的内容非常少,每次只能存储最近看过的页表。
通过物理电路可以一次比对,取出当前页号,并定位到物理地址。
如果快表查不到,则只能去多级页表中查找。
快表+多级页表
空间占用少、时间使用少。
-》关键点:TLB的命中率必须要高
1.表尽可能大
段页结合的实际内存管理
1.虚拟内存
2.具体如何工作?
-》存储时:一个应用程序有一个代码段,首先在虚拟地址中割出一个区域给这个代码段,然后操作系统在虚拟区中的段打成一片片的页,再和页关联在一起。
-》使用时:先用段号+偏移找到虚拟地址,再使用页号+偏移地址找到物理地址,并将其发送到地址总线上进行使用。
内存的换入换出
1.虚拟地址(4G),物理地址(1G)
如何使用1G的内存,给用户制造出一种4G的感觉呢?
换入:
用户的代码段是存储在磁盘上的,从磁盘上将需要使用的虚拟内存换入
如果需要使用3G部分的代码段的时候,先将1G部分的换出,再将其换入
具体步骤:请求调页
使用段表和页表查找,发现缺页,则中断。
操作系统去磁盘中读取并换入