先谈谈个人对操作系统学习的理解:
操作系统的学习可以先浅显分为几个模块:
1.操作系统的四大特征
2.操作系统的四大功能
(1)处理机管理功能;
(2)存储器管理功能;
(3)设备管理功能;
(4)文件管理功能;
先来学习四大特征。分别是:并发,共享,虚拟和异步。
第一点,并发(Concurrence)。
并发不等于并行。
并发是宏观上的并行。
程序在系统中只能顺序运行。
引入进程后,两个进程才能并发运行。
第二点,共享(Sharing)
OS环境下的共享是资源复用。
第一种是互斥共享方式。存在临界资源。
第二种是同时访问方式。微观上还是互斥。
第三点,虚拟(Virtual)
分为两种方式:1.时分复用技术:利用某设备的空闲时间去服务其他客户。所谓虚拟就是将一台物理上的处理机虚拟成多台逻辑上的虚拟机。2.空分复用技术:利用存储器的空闲空间分区域存放和运行多道程序,同时还空分复用内存。
第四点,异步(Asynchronism)
多进程运行情况下,进程是以人们不可预知的速度向前推进的。
操作系统的四大主要功能:
第一,处理机管理功能。处理机的分配和运行都是以进程为基本单位的。处理机管理的主要功能有创建和撤销进程,协调进程,实现进程之间的信息交换和按照一定的算法把处理机分配给进程。
第二,存储器管理功能。实现静态和动态两种内存分配。实现地址映射,内存保护和内存扩充。
第三,设备管理功能。管理I/O的分配。实现缓冲管理,设备分配和设备处理等功能。
第四,文件管理功能。实现的对存储空间,目录和文件读写的管理。
---------------------------------------------------------------------------------------------------------------------------------
分割线
按照书上内容来区分。
进程的描述与控制
前趋图只需要理解不允许有循环。
进程PCB包含:进程标识信息:标识ID,父进程标识ID,用户标识;处理器状态信息:用户使用的寄存器,控制和状态寄存器,堆栈指针;进程控制信息。
重点:
信号量机制
1.整型信号量:只有两个原子操作P/V,只要S<0,会不断循环测试,不遵循“让权等待”。
“让权等待”:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
2.记录型信号量:除了存放代表资源数目的整型变量value以外,增加了一个进程链表指针list。
如果资源量小于0进入处理机,进程自我阻塞,释放处理机。若资源量加一后,资源数目仍小于0,则应该唤醒一等待进程。
经典进程的同步问题
1.生产者-消费者问题:
用记录型信号量解决生产者-消费者问题。
在生产者和消费者之间的公用缓冲池建立缓冲区,利用互斥信号量实现进程对缓冲区的互斥使用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
2.哲学家进餐问题
五个哲学家一起生活,一共有五个碗和五只筷子,只有当一位哲学家同时拿到左右手两边的筷子和碗时才可以开始进餐。
该问题中,临界资源为筷子。为筷子设置互斥信号量,实现筷子的互斥使用。
3.读者-写者问题
多个读者可以同时阅读,读者和写者不能同时访问,多个写者不可以同时访问。
管程机制
1.管程是用来管理系统中的共享资源的一个软件模块。任一时刻,管程中只允许一个进程执行。
2.利用管程来实现生产者消费者问题
进程通信
进程通信分为高级和低级通信
1.共享存储器系统
向系统申请一个共享数据区域,对该区域进行读写。
2.管道通信
所谓“管道”是连接两进程的一个共享文件,发送进程以字符流的形式将大量信息写入管道,接受进程从中读入。
3.消息传递系统
用报文和信箱来传递
4.客户机-服务器系统
(1)套接字:套接字关联一个特殊的文件,通信双方通过对文件进行读写来实现通信。
(2)远程过程调用和远程方法调用:远程过程通过调用PRC通信协议来实现
消息缓冲队列通信机制
利用消息缓冲区进行通信
线程
1.基本概念:将拥有资源的基本单位与调度和分派的基本单位分开处理。线程由线程标识符,程序计数器,一组寄存器的值和堆栈组成。
2.线程的控制:线程是由线程创建的,具有三种状态。
3.内核支持线程和用户级线程:
内核支持线程:线程的功能通过在内核支持设置线程控制块并加以控制。
用户级线程:由用户应用程序建立的线程,并且由用户服务程序负责所有用户级线程的调度执行和管理。
针对上述知识点的问题的解答
Q1:操作系统中为什么要引入进程概念?会产生怎样的影响?
A:引入线程是为了实现多个程序的并发执行。传统的程序不能够走走停停的运行,创建进程后可以通过保存PCB来继续执行。
Q2:PCB的作用是什么?为什么说PCB是进程存在的唯一标志?
A:PCB能使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位。系统是根据PCB感知进程的存在的。
Q3:如何保证进程互斥访问临界资源?
A:在进程进入临界区之前设置进入区和退出区,可用多种同步机制实现。例如,锁或者信号量。
Q4:
A:todo
Q5: A:todo
Q6:
Q7:
--------------------------------------------------------------------------------------------------------------------------------
处理机调度与死锁
1.处理机调度分三级:
高级调度:从磁盘的后备队列调用作业,分配资源并创建进程。
低级调度:进程调度,分为抢占调度和非抢占式。
中级调度:调度内外存。
调度算法
1.先来先服务:FCFS
2.短作业优先:SJF
3.优先级调度算法:PSA
4.高相应比优先调度算法:HRRN
5.时间片轮转法:RR 进程用FIFO队列排列
6.多级队列调度算法:将不同的进程分到不同的就绪队列中,队列之间采用固定优先权的抢占调度方式。
7.多级反馈队列调度算法:FB
设置不同优先级的多个队列,赋予各个队列不同的时间片,优先级越高时间片越小。
新就绪的进程进入第一队列末尾,执行完时间片后,如果进程尚未结束将其插入到第二个就绪队列末尾。系统总是调度第一级队列上的进程运行,当第一级队列运行完后再进行第二级队列。
实时调度
实时系统对任务有截止时间。
常用的几种实时调度的算法
1.最早截止时间优先算法(EDF) 将进程按照截止时间早晚进行排列,截止时间越早,优先级越高。
2.最低松弛度优先算法(LLF)松弛度=任务必须完成的时间-任务的运行时间-当前时间。松弛度越低,优先级越高
3.优先级倒置:此时有一个优先级最高的B,优先级最低的A和一个优先级位于AB之间的C。A正在执行,并且进入临界区正在使用临界资源R。此时B进入,B可以抢占A的cpu进行运行,但如果申请R会被阻塞。此时如果C抢占了A的cpu,B就忙等了。
解决方案:让A暂时继承B的优先级。
死锁的基本概念
一个进程集合中每一个进程都在等待其他进程释放自己所需的资源,结果是这一组资源全部无法推进。
产生原因:1.竞争资源;2.进程推进非法。
产生死锁的必要条件:1.资源互斥使用;2.请求与保持,当前占有资源的进程可以申请其他资源,占有资源的也可以保持自己的资源不放;3.不剥夺条件;4.环路等待条件。
预防死锁的方法
TODO:spooling技术破坏打印机的"互斥"条件。
1.摒弃“请求与保持” 允许一个进程只申请运行初期所需要的资源,运行后释放。全部释放后才能够申请新的资源。
2.摒弃“不剥夺条件” 规定一个已经保持某些资源的进程在新的资源没法满足时释放以获得的所有资源。
3.摒弃环路等待:将资源赋予不同的编号,严格按照编号来申请资源。
避免死锁
1.将系统状态分为安全和不安全状态。
系统能够按照某种顺序建立一个安全序列。
操作方法:在系统允许动态的申请资源,每次分配时进行安全性检查。
2.银行家算法避免死锁
系统需设置若干数据结构:
-1.可用资源向量Available,是一个含有m个元素的数组,其中每个元素代表一种可利用的资源数量。
-2.最大需求矩阵Max:Max【i,j】=K表示进程i需要Rj类资源最大数目为K。
-3.分配矩阵Allocation:定义每个进程已经分配到的数目
-4.需求矩阵Need:定义还需的数目
上述三个矩阵存在关系:
当进程发出资源申请时,系统按照银行家算法来进行检查:
步骤1:如果Requesti<=Need,转向步骤2;否则认为出错;
步骤2:如果Requesti<=Available,则转向步骤三;否则表示Pi必须等待;
步骤3:系统试探着分配资源给Pi,
步骤4:系统执行安全性算法,若安全完成分配,不安全本次试探分配作废;
安全性算法描述:
步骤一:设置两个工作向量:工作向量work,含有m个元素,表示安全性检查中系统可提供给进程的各类资源数目,初值等于Available;工作向量Finish,含有n个元素,表示系统是否有足够的资源来分配给各个进程。Finish的初值是false。
步骤二:
步骤三:继续步骤二
步骤四: 死锁的检测和解除
像是离散数学里的图论。
死锁定理:当且仅当S状态的资源分配图是不可完全简化的,说明S状态为死锁状态。
死锁检测:
死锁解除:
(1)剥夺资源;(2)撤销进程;
TODO:
--------------------------------------------------------------------------------------------------------------------------------
存储器管理
本章 主要讨论主存储器即内存
绝对地址(物理地址):内存单元的实际地址
存储空间(绝对地址空间):存放内存单元的集合
装入方式:
1.绝对装入方式;
2.可重定位装入方式与静态重定位:多道程序的环境下从0开始编址。
重定位:将装入模块中指令和数据的相对地址调整为相应内存单元的绝对地址
动态重定位:将重定位放到程序真正执行的时候实现。
通过重定位寄存器来实现,用来存放正在执行的作业在内存中的起始地址。
程序的链接
根据链接时间不同,将链接分为以下三种:
静态链接方式:程序运行之前,将各目标模块与他们所需的库函数链接成一个完整的装入模块;
装入时动态链接:
运行时动态链接
连续分配方式
是指为用户程序分配一段连续的内存空间,可分为单一连续分配,固定分区分配,动态分区分配和动态重定位四种分配方式。
1.单一连续分配
2.固定分区分配
在系统初启时就分区,每个分区只允许放一道作业。
程序分配大小与分到的大小不符合时,多余的部分称为内部碎片。
3.动态分区分配:
每次装入作业时候,从可用内存中划分出一个分区,大小刚好能够满足作业的实际需要。
将其装入内存需要遵循算法:
(1)首次适应算法。每次都从链首开始顺序查找,找到第一个能够满足要求的空闲分区。
(2)循环首次适应算法。每次分配从上一次分配位置之后的位置开始查找。
(3)最佳适应算法。将空闲区按从小到大进行排列,将满足要求的最小空闲区分配出去。
(4)最坏适应算法。将最大的分配出去。
4.伙伴系统:
当有程序装入内存时,伙伴系统会找到可分配的最小块,同时划分一个同样大小的伙伴。当一个进程释放内存时,查找该分区的伙伴是否空闲,如果空闲合并成一个较大的分区。
5.可重定位分区分配:
在动态分区分配方式上增加紧凑功能。
分区的保护
(1)界限寄存器;
(2)保护键;
对换
是指将内存中暂时不能运行的进程或程序或数据,调到外存上。
以整个进程为单位叫做:整体对换,广泛用于分时系统;
若“页”或“段”为单位叫做页面对换或者分段对换。
实现对换所需要的功能:
(1)管理对换空间。设在磁盘上,采取连续分配;
(2)进程换入。找出“就绪”的换入;
(3)进程换出。将阻塞态且优先级最低的换出。
基本分页存储方式
将作业离散的分布在内存中。
(1)将一个进程的逻辑地址空间分为若干个大小相等的片,称为页或者页面;
相应地,将内存空间分成若干个与页面大小相同的块,称为物理块或页框。内存的分配以块为单位,并允许将一个进程的若干页装入不相邻的物理块中。
(2)地址变换机构
系统中只有一个页表寄存器。当进程要进入执行状态时,将页表的内存始址和长度从PCB装入页表寄存器。当进程要访问某个逻辑地址中的指令或数据时,地址分为页号和页内地址两部分。将页号与页表寄存器中的对比,若不小于则发生越界中断。否则用页号去检索得到该页的物理块号,送入物理寄存器与页内地址拼接,得到相应的物理地址。
(3)具有快表的地址变换机构
由于页表放在内存中,CPU每存放一条指令或数据要读两次内存。所以在地址变换机构中增设“快表”。--具有并行查找能力的寄存器。快表中存放当前被频繁访问的页面的页号和对应页表项。
之后进行比较时,先查取快表,若快表中没有,再访问内存。同时将得到的页号存入快表中。
多级页表
页表过大,将页表存入不同的内存块,同时建立一个外层页表来存放页表。
同时设置一个外层页表寄存器
分段式存储方式
分段系统的作业空间是二维的。系统建立“段表”。
分页与分段的异同:
(1)分页是为了提高内存的利用率,分段是为了逻辑更好;
(2)页长度固定,段不固定;
(3)分页一维,分段二维;
段页式存储
将内存空间分为若干个段,再将每个段分为若干个页。
信息的共享