操作系统(OS)
OS是配置在计算机硬件上的软件,隐藏了计算机硬件的操作细节,可以作为用户和计算机之间交互的接口,对计算机资源进行抽象。主要负责处理器管理、存储器管理、I/O设备管理、文件管理。
处理器管理:进程控制、进程同步、进程通信、进程调度、死锁处理。
存储器管理:内存分配、地址映射、内存扩充
设备管理:...
文件管理: 文件存储、目录管理、文件读/写
进程
进程和线程:
最初多个程序只能顺序执行,为了能够使进程能够并发执行,引入进程的概念。进程是系统进行资源分配和调度的一个单位,是正在运行中的程序。进程由程序、数据和进程
控制块PCB组成。PCB描述进程的详细信息,操作系统可以通过PCB来管理进程。
进程上下文切换的开销比较大,为了减少程序在并发执行时付出的时空开销,引入线程。线程是独立运行的单位,线程切换时,只需保存少量寄存器内容,切换系统开销低于进程。一个进程中的多个线程并发执行,一个进程中线程共享系统资源。
进程状态:
就绪状态:进程处于准备好运行的状态,只要获得CPU,便可立即执行。将就绪的进程排成就绪队列
执行状态: 已经获得CPU,程序正在执行的状态。
阻塞状态: 正在执行的进程发生某事件暂时无法执行。将阻塞进程排成一个队列叫阻塞队列。
状态转换
就绪状态通过进程调度变为执行状态,执行状态时间片用完变为就绪状态,执行状态请求I/O变为阻塞状态,阻塞状态I/O完成变为就绪状态。
进程同步:
什么是进程同步?
进程同步协调多个并发进程,使得它们能够按照一定规则和顺序共享系统资源,使程序的执行具有可再现性。
如何实现进程同步?
- 使用硬件机制。最简单的使用关中断,当进程访问临界资源时,执行关中断,CPU不响应外部中断,就不会执行进程和线程的切换。
- 使用信号量机制。定义信号量初值,wait操作表示申请一个单位的资源,信号量减1,当信号量小于0时,进程进入阻塞状态。signal操作表示释放一个单位的资源。使用信号量可以实现进程互斥或进程前驱关系。
- 使用管程。管程是资源管理程序,定义了表示共享资源的数据结构和对共享数据结构进行操作的一组过程。每次只允许一个进程进入管程,实现进程互斥。
进程通信:
进程同步和互斥虽然可以交换信息,但是效率低,使用进程通信机制来传输大量的数据。包括
- 共享存储取系统:进程共享数据结构或共享存储区,进行通过这些空间通信。
- 管道通信系统:管道是连接两个进程的一个共享文件。发送进程向管道以字符流的形式写入数据,接受进程可以从管道读数据。管道通信也是需要互斥和同步的。
- 消息传递系统:把数据封装为消息的格式,利用操作系统的通信原语在进程间进行消息传递。
- 客户机-服务器系统:
套接字:主要用来进行网络中不同计算机进行通信。套接字是包含目的地址,端口号和其他通信信息的一个数据结构。每一个连接都有唯一的一对套接字,可以区分不同应用进程之间的通信,确保通信双方逻辑链路的唯一性。
远程过程调用:本地和服务器各有一个远程过程的存根。本地主机将参数传入过程存根,存根将参数封装为消息发送到服务器,服务器将参数传给存根调用相应过程,并把执行结果传送回去。
作业/进程调度:
作业调度:把程序从外存调度到内存,创建进程,分配资源,并插入就绪进程队列。
先来先服务:优先考虑等待时间最长的作业
短作业优先:以作业/进程运行时间的长度来计算优先级,时间越短,优先级粤高。
优先级调度:由外部赋予作业优先级,根据优先级进行调度。
高响应比优先:既考虑等待时间又考虑运行时间,(等待时间+运行时间)/运行时间。
进程调度:
非抢占式:进程不会抢占正在运行进程的处理器
抢占式:进程会根据某种原则去暂停正在执行的进程,并占用这个处理器。
可以防止一个进程长时间占用处理器,也可实现人机交互。
轮转调度算法:就绪队列上的每个进程每次仅运行一个时间片,当该进程时间片耗尽时,会将该CPU分配给队首进程
优先级调度算法:在时间片结束后将处理机分配给就绪队列中优先级最高的进程。
多级反馈队列调度算法:可以满足各类进程的需要
设置多个就绪队列,为每个队列赋予不同的优先级,优先级依次递减。在优先级越高的队列,时间片越小,每个队列都采用先来先服务算法。首先放入第一个队列末尾,如果进程没执行完,就放入到第二个队列。
死锁:
死锁定义:
哲学家进餐问题中,如果每个哲学家都拿起左手边的筷子,如果他们再拿右手边的筷子就会陷入无线等待的情况,这就是死锁。死锁就是每个进程都占有资源,又去申请其他被占有的资源,进入无限等待的情况,所有进程都处于阻塞状态。资源分配图出现一个环。
解决:最多4个人同时拿筷子,或者只有同时拿两双筷子;或者奇偶拿不同方向筷子。
死锁4个必要条件:
互斥条件:进程访问临界资源。
请求和保持条件:进程请求被占有的临界资源并且保持自己占有的资源。
不可抢占条件:如果进程占有一个资源其他进程就不能占有这个资源。
循环等待条件:每一个进程都在等待其他进程释放资源,形成一个循环链。
处理死锁方法:
预防死锁:破坏死锁的必要条件。
避免死锁:防止系统进入不安全状态。银行家算法。
检测死锁:化简资源分配图...
解除死锁:终止进程使系统从死锁状态解除。
预防死锁:
- 破坏请求和保持条件:
申请整个运行过程所需的全部资源,所以之后不会提出资源请求,破坏了请求条件。只有一种资源不满足,就不会分配资源。在等待期间未占有任何资源,破坏保持条件。
- 破坏不可抢占条件:
进程申请资源得不到满足后,必须释放已经保持的所有资源。
- 破坏循环等待条件:
为资源编序号,人为规定资源访问顺序,破坏循环等待条件。
避免死锁:
避免系统进入不安全状态,安全状态是指系统不会出现死锁的状态。可以使用银行家算法避免进入死锁。
银行家算法:每次进程请求资源时判断资源数是否小于系统中可利用的资源数,如果小于就尝试分配资源给进程,然后判断系统是否处于安全状态。如果不安全,这次分配资源作废。判断是否安全状态:遍历所有进程,看是否系统中有足够的资源分配给进程。
检测死锁:
使用资源分配图和死锁定理检测死锁。(图中结点分为资源结点和进程结点,边分为资源请求边和资源分配边。当一个进程请求一个资源时,就由进程结点有向边指向资源结点;当分配一个资源时,资源结点有向边指向进程结点。)
死锁定理:简化资源分配图,如果能消去图中所有的边,使所有的进程结点都成为孤立结点,那么该图使可完全化简的,否则该图不可完全化简。状态S为死锁的充分条件:S状态的资源分配图是不可完全化简的。
解除死锁:
人工解除死锁或者利用死锁解除算法。
- 给死锁进程分配足够的资源
- 终止撤销进程,终止撤销系统中一个或多个死锁进程,直至打破循环环路。
存储器管理
程序装入内存需要分配一定的内存空间。最初使用连续分配方式:固定分区分配、动态分区分配、动态可重定位分配。
固定分区:每个程序放入到固定的分区。
动态分区分配:在内存中找到一块空闲的分区分配给进程。可以用顺序搜索(首次适应、循环首次适应、最佳适应、最坏适应算法),也可以使用索引搜索(伙伴系统)。因为动态分区分配会出现很多空闲块,形成碎片,可以通过重定位的方式对内存进行紧凑。
现在最常用的存储管理方式是虚拟存储。
虚拟存储是在分页和分段的基础上引入置换和换出,可以在逻辑上扩充内存容量。根据局部性原理,只需要将少数页面先装入内存就可以执行,程序在运行时,如果要访问的页在内存就继续执行下去,否则发出缺页中断,OS将需要的页面调入内存,如果内存已满还需要进行页面置换操作。
分页存储管理将进程的逻辑地址空间和内存地址空间分为若干个块,在分配时将进程中的块放入物理块中。进程通过页表查找页号到物理块的映射(页号作为索引下标),此外还有状态位(是否被调入内存),访问位,修改位,外存地址。
页面置换操作:
最佳置换算法:淘汰最长时间内不在被访问的页面(很难预测)。
先进先出置换算法:淘汰最先进入内存的页面。
最近最久未使用置换算法:选择一个最近最久未使用的页面进行置换。
最少使用置换算法:选择在最近使用最少的页面最为淘汰页。
Clock置换算法:
LRU需要有许多硬件的支持。简单的Clock置换算法:将内存中的所有页面通过指针链接成一个循环队列,当页面被访问时,访问位置1。在淘汰页面时,检查页的访问位,如果是0就选择该页换出,否则将它重新置0,给与该页第二次驻留内存的机会,按照顺序检查下一个页面。
频繁页面置换会对系统性能产生影响,可以使用页面缓冲算法,在系统中一个已修改链表,对每一个要被换出的页面,暂时不把他们写回磁盘,而是将它们挂起在已修改换出页面的链表上,当链表数目达到一定值时,把它们一起写回到页面上,减少磁盘I/O的次数。
进程太多导致每个进程分配的物理块太少,会频繁进行页面换进换出出现抖动的现象,可以使用工作集的解决方法。?
分段存储:
分段存储的原因:
(1) 用户通常把自己的作业按照逻辑关系划分为若干个段,每个段都是从0开始编址,并有自己的名字和长度。逻辑地址由短段号和段内地址决定,方便用户编程。
(2) 信息共享:分段可以更容易实现信息共享和保护。
文件
文件组织方式(逻辑结构):
- 顺序文件:按照顺序存储文件记录,定长记录文件查找快,插入删除比较慢,如果使变长记录都很慢。
- 索引文件:对变长记录文件建立一个索引表,为每个记录在索引表中设置一个表项,存放指向记录的指针和长度,这样就可以将变长记录顺序文件的顺序检索转变为对定长记录索引文件的随机检索。
- 索引顺序文件:
- 直接文件:
根据关键字直接获得指定记录的物理地址。
哈希文件:
利用哈希函数将关键字相应文件目标表目的指针。
文件管理:
使用文件目录实现文件管理。
文件目录是文件控制块(FCB)/文件目录项的集合。Unix系统文件目录项包括文件名和i结点指针。i结点存放文件信息包括物理地址和连接计数等。
使用树形目录结构,包括根目录和子目录。根据路径名去树里面查找。
文件存储方式:
(1)连续组织方式:
为文件分配一组连续的盘块,保存文件起始盘块和文件长度。
优点:简单高效,顺序访问快;
缺点:会出现碎片;需要提前知道文件长度;插入删除不灵活
(2)链接组织方式:
将文件装到多个离散的盘块中,用指针链接成一个链表。
隐式链接:
在文件目录的每个目录项中,含有指向链接文件的第一个盘块和最后一个盘块的指针。每一个盘块都含有指向下一个盘块的指针,只适合顺序访问。
缺点:只能顺序访问,在磁盘中查找速度很慢
显式链接:
将指针使用内存中一个表中存储,表的序号是物理盘块号,每个表项存项该盘块号的下一个盘块号。查找在内存中,提高检索速度,减少访问磁盘的次数。
缺点:FAT占用很大内存,需要将整个FAT调入内存。
优点:消除外部碎片;插入删除容易;无需知道文件的大小;
(3)索引组织方式:
单级索引方式
没必要将整个FAT调入内存,将每个文件对应的盘块号集中放在一起,在访问到某个文件时,将该文件对应的盘块号一起调入内存。为每个文件分配一个索引块,把分配给该文件的盘块号记录在该索引块中。支持直接访问。
多级索引方式
使用单级索引方式如果文件很大,需要很多个索引块,如果索引块太多,效率会很低,所以需要建立索引的索引。适合大文件的存储。
增量(混合)索引方式
为了照顾不同大小的文件,使用多种组织方式来构成文件。Unix System V有13个地址项,0~9是直接寻址,直接存放盘块号,10提供一次间接寻址(一级索引),11提供二次间接寻址(二级索引),12提供三次间接寻址(三级索引)。
I/O系统
功能
- 隐藏物理细节:
I/O设备类型多,差异大,不同I/O设备需要使用不同的命令来操纵。I/O系统隐藏了物理设备实现的细节,用户可以使用简单的抽象的I/O命令来操作I/O设备。
(2) 设备独立性:使用抽象的逻辑设备名表示设备。如果用户想要打印时,只需提供I/O命令和抽象的逻辑设备名。
- 控制I/O设备:轮询,中断,DMA,通道
I/O系统层次结构和模型:
I/O系统分层实现,每一层都利用下一层提供的服务,实现输入输出相关的一部分功能,并为高层提供服务。I/O系统分为用户层I/O软件、设备独立性软件、设备驱动程序、中断处理程序。
中断处理:
CPU执行过程中出现异常或特殊请求,停止当前正在执行的程序去响应事件,服务结束后又能返回到被中止的程序继续执行。每一种中断都有一个中断类型码,每一个中断号对应一个中断向量,中断向量是中断服务子程序的入口地址,CPU收到中断号后,去中断向量表找中断向量,保护现场,将寄存器压入堆栈,保护各个标志位,将CS、IP压入堆栈,保护断点,执行中断服务子程序,执行完后恢复现场,返回断点继续执行主程序。
由于操作系统的管理工作(比如进程切换,分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态。中断可以使CPU从用户态切换为核心态(唯一途径),使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。