一组控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序集合。
无操作系统 — 人工操作:
用户独占主机,CPU 等待人工操作
无操作系统 — 脱机输入/输出:
过程:事先将装有用户程序和数据的纸带(或卡片)装入纸带输入机(或卡片机),在一台外围机的控制下,把纸带(卡片)上的数据(程序)输入到磁带上。当 CPU 需要这些程序和数据时,再从磁带上将其高速地调入内存。 类似地,当 CPU 需要输出时,可由 CPU 直接高速地把数据从内存送到磁带上,然后再在另一台外围机的控制下,将磁带上的结果通过相应的输出设备输出。
优点:减少了 CPU 的空闲时间,提高了 I/O 速度
单道批处理系统:
过程:把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序(Monitor),在它的控制下使这批作业能一个接一个地连续处理。首先,由监督程序将磁带上的第一个作业装入内存,并把运行控制权交给该作业。当该作业处理完成时,又把控制权交还给监督程序,再由监督程序把磁带(盘)上的第二个作业调入内存。计算机系统就这样自动地一个作业一个作业地进行处理,直至磁带(盘)上的所有作业全部完成,
优点:相对来说提升了系统资源的利用率和吞吐量
缺点:内存中仅有一道作业无法充分利用计算机的资源。
多道批处理系统:
过程:用户所提交的作业都先存放在外存上并排成一个队列,称为“后备队列”;然后,由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享 CPU 和系统中的各种资源。
优点:更加充分的利用计算机资源【A 作业请求 I/O 时,可以将 CPU 交给 B】,提高了系统的吞吐量
缺点:平均周转时间长,无交互性
分时系统:
产生的背景:要求人机交互、共享主机、便于用户上机
过程:作业应直接进入内存。不允许一个作业长期占用处理机,直至它运行结束或出现 I/O 请求后,方才调度其它作业运行。应该规定每个作业只运行一个很短的时间(例如 0.1 秒钟,通常把这段时间称为时间片),然后便暂停该作业的运行,并立即调度下一个程序运行。如果在不长的时间(如 3 秒)内能使所有的用户作业都执行一次 (一个时间片的时间),便可使每个用户都能及时地与自己的作业交互,从而可使用户的请求得到及时响应。
特征:多路性、独立性、及时性、交互性
实时系统:
定义:实时系统(Real Time System)是指系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。用于实时控制和实时处理。如抢票系统、导弹发射系统等。
特征:多路性、独立性、及时性、交互性、可靠性
并发、共享、虚拟、异步
处理机管理功能:
- 进程控制
- 进程同步
- 进程通信
- 进程调度
存储器管理功能:
- 内存分配
- 内存保护:确保程序在自己的内存空间运行,彼此互不干扰
- 地址映射:将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址。
- 内存扩充:借助于虚拟存储技术,从逻辑上去扩充内存容量,使用户所感觉到的内存容量比实际内存容量大得多,
设备管理功能:完成用户进程提出的 I/O 请求;为用户进程分配其所需的 I/O 设备;提高 CPU 和 I/O 设备的利用率;提高 I/O 速度;方便用户使用 I/O 设备。
- 缓冲管理:有效地缓和 CPU 与 I/O 设备速度不匹配的矛盾
- 设备分配:根据用户进程的 I/O 请求、系统的现有资源情况以及按照某种设备的分配策略,为之分配其所需的设备
- 设备处理:基本任务是用于实现 CPU 和设备控制器之间的通信
文件管理功能:对文件存储空间的管理、目录管理、文件的读/写管理,以及文件的共享与保护等功能
- 文件存储空间管理:为每个文件分配必要的外存空间,提高外存的利用率,并能有助于提高文件系统的存、取速度。
- 目录管理:为每个文件建立其目录项,并对众多的目录项加以有效的组织,以实现方便的按名存取。文件共享、允许文件重名、提高文件检索速度
- 文件的读/写管理和保护
作为用户和计算机之间的接口:
- 用户接口
- 程序接口
异常(内中断):源于CPU执行指令内部的事件(缺页、访管指令,算数溢出)
中断(外中断):来自CPU执行指令以外的事件,与当前运行的程序无关(时钟中断)
最关键的原因是,现代操作系统必须具备的多线程、多进程技术都是基于中断技术实现的,无论是 Windows 的任务抢先式分配 cpu 还是 Linux 的分时分配 cpu,首先都需要定时中断的参与,才能让系统得到 cpu 执行时间,然后系统才能根据各自的算法启动等待队列里面的进程或线程。
其次,计算机操作系统自然离不开外部设备:鼠标、键盘、网卡、磁盘等等。就拿网卡来说,计算机并不知道时候数据包会来到,它只需要保证数据来了我能正常接收就行了。但是他也不可能一直等着接收数据包,不然太浪费资源了。因此合理的办法是,当数据包来到之后,再通知计算机,然后再对你处理,而这个通知方法就是中断。
**中断:**中断是指某个事件(电源掉电、加法溢出或外部设备传输结束等)发生时系统终止现行程序的运行,引出中断处理程序对该事件进行处理,完毕后返回断点继续运行,这个过程称为“中断”。
**多通道技术:**是一种可以提升存储器数据发送性能的技术。它的主要原理,是在动态随机存储体和存储器控制器/芯片组之间,增加更多的并行通信通道,以增加数据发送的带宽。
**内核:**操作系统的内核是实现操作系统基本功能的程序模块的集合,在机器的系统态(核心态)下运行;
**外壳:**操作系统的外壳,指的是运行在内核之上的、完成OS外层功能(如命令解释、机器诊断等)的程序,他们运行在机器的用户态下,是一种开放式结构,其功能可方便地修改或增删。
为了使程序能够并发执行,并对并发执行的程序和进程加以描述和控制
**软件同步机制:**较难实现,比较好的实现如 Peterson 算法,双标记位 + 一个全局变量
- Peterson 算法
硬件同步机制:
关中断:软件同步机制中都是在落锁和判断之间发生中断,乃至导致无法实现互斥的进入临界区,关中断就是在测试之前关闭中断,系统不响应中断。
缺点:1. 滥用关中断的权利可能导致严重后果;2. 关中断时间过长会影响系统的并发性,直接的影响系统的资源利用率;3. 关中断无法适应多CPU系统
测试并建立指令(TS):关中断是为了避免在加锁和判断之间发生中断,TS 将两个操作合并为一条指令。
Swap 交换指令:
硬件同步机制存在的问题:会出现忙等的现象,违背了让权等待的原则。
信号量机制:
整型信号量:会出现忙等的现象
记录型信号量:引入了一个链表,记录需要资源的进程,解决了忙等的问题
AND 型信号量:一次性分配多种资源,将进程所需要的全部资源进行分配
缺点:1. 资源浪费严重,2. 可能会出现饥饿现象
信号量集:一次可分配多种资源,每种可分配多个。并且引入了下限值的概念,可以避免资源被过度分配的问题。
管程机制:
- 一种共享资源的数据结构,由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块
- 使用面向对象的思想进行了封装
共享存储系统:
- 共享数据结构:信号量机制
- 共享存储区:为了传输大量数据,OS 在内存中划出一块共享存储区域,诸进程通过该共享区域读或写交换信息,实现通信。数据的形式、位置、访问控制都是由进程来控制的。需要通信的进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中,便可对其中的数据进行正常的读、写,操作完成或者不在需要时,再讲分区归还给共享存储区。也因为其一次可以操作一个分区,并可将大量的数据读取或者写入分区,所以这种方式也属于高级通信。另外因为数据不需要在进程之间复制,所以这是最快的一种进程通信机制。
管道通信:所谓“管道”是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。
- 无名管道:是Unix早期的一种通信方式,是半双工通信,只能用于父子进程或兄弟进程间,并且它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
- 命名管道:可以用于在无关进程间交换数据,FIFO也就是先进先出,有路径名与命名管道关联,它以一种特殊设备形式存在于文件系统中,并且可以实现半双工或全双工的通信。
消息传递系统: 在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用OS提供的一组通信原语,在进程间进行消息传递,完成进程间的数据交换。
- 直接通信方式(消息缓冲队列):直接通信方式,是直接通过原语将消息发送到指定的进程,因此要求发送和接收的进程都必须以显示的方式提供对方的标识符。
- 间接通信方式(消息队列):间接通信方式是指发送和接收进程都通过共享中间实体(OS中称为信箱)的方式进行消息的发送和接收,完成进程间的通信。
客户机-服务器系统:
- 套接字:ip + port,可以定位到哪个主机下的哪个进程,这样就可以对其进行请求。他不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机间的进程通信。
- 远程过程调用/方法调用(RPC):远程过程调用RPC(Remote Procedure Call)是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对开发人员表现为常规的过程调用,无须额外的为此编程。
进程是OS分配资源的基本单位;线程作为OS调度和分派的基本单位
为了减少程序在并发执行时所付出的时空开销,进程切换开销大,线程更轻量化,切换开销小
临界区:当多个线程访问一个独占性共享资源时,可以使用临界区对象。通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
事件:事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。方便的实现多线程优先级的比较操作
互斥量:互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,但是更节省资源,更有效率。
信号量:当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。
最主要的区别:进程是动态的、程序是静态的
进程所属用户 ID、进程控制块 PCB、一个或多个线程、打开的文件描述符、独立的地址空间
**同步:**多个进程因为合作而使得进程的执行有一定的先后顺序。
**互斥:**多个进程在同一时刻只有一个进程能进入临界区
内核级线程:线程管理由内核完成
用户级线程:线程管理由应用程序完成
**死锁:**指多个进程在运行的过程中因争夺资源而造成的一种僵局。当进程处于这种僵持状态时,若无外力作用,都无法向前推进
**原因:**系统资源不足、进程推进顺序非法
产生死锁的四个必要条件:
- 互斥条件:一个资源同时只能被一个进程使用
- 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
- 不可剥夺条件:进程占有资源后,未使用完之前不可被剥夺
- 循环等待条件:若干进程之间形成一种首尾相接的循环等待资源关系。
解决死锁的办法:
预防死锁:破坏产生死锁的四个必要条件中的一个。
避免死锁:使用银行家算法判断此次资源的分配是否会使系统进入不安全状态。
死锁检测:使用资源分配图,基于死锁定理
死锁解除:剥夺资源、撤销进程
死锁至少是两个进程,但饥饿可以只有一个进程
处于饥饿状态的可以是一个就绪进程,处于死锁状态的一定是阻塞进程
先来先服务(FCFS): 此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序来选择作业(或进程)。
短作业优先(SJF):这种调度算法主要用于作业调度,它从作业后备队列中挑选所需运行时间(估计值)最短的作业进入主存运行。
时间片轮转调度算法(RR):当某个进程执行的时间片用完时,调度程序便停止该进程的执行,并将它送就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
优先权调度算法:
- 静态优先权:运行之前直接分配一个优先权
- 动态优先权:随着进程运行优先权动态变化,如高响应比优先算法。按照高响应比((已等待时间+要求运行时间)/ 要求运行时间)优先的原则。可以防止进程等待时间过长。
多级反馈队列调度算法:
设置多个就绪队列,从第一个开始,就绪队列的优先级逐渐降低,运行时间逐渐变长。当一个进程进入内存后,首先将其放在第一个就绪队列的末尾,如果在第一个就绪队列执行完毕,结束;否则放入第二个就绪队列末尾,只有当高优先级的队列的进程均执行完毕的时候才可以轮到低优先级队列的进程进行执行。
性能:对于终端型和小型作业可以在前几个优先队列执行完毕,获得较好的响应时间;对于长作业也可以在后续长的就绪队列执行完成,不必担心出现进程饥饿现象。
第一种协议:所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。优点就是简单、易行且安全;缺点就是资源被严重浪费、进程经常发生饥饿现象。
第二种协议:允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。
页是信息的物理单位,分页是为了实现离散分配方式,以减少内存的外零头,提高内存的利用率。分页仅仅是由于系统管理的需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
页的大小固定且由系统确定,把逻辑地址分为页号和页内地址两部分,由机器硬件实现的。因此一个系统只能有一种大小的页面。
段的长度却不固定,决定于用户所编写的程序,通常由编写程序在对源代码进行编辑时,根据信息的性质来划分。
分页的作业地址空间是一维的,即单一的线性空间。
分段的作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需要给出段内地址。
多道程序并发执行时,共享内存,如果不管理,则会导致内存数据的混乱,从而限制并发
内存保护:保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。
具体方法:
覆盖:不用把程序全部读入内存才能运行,而是按调用关系分段(因此对程序员是不透明的),覆盖区中存放需要的程序段,其他段放在外存中,用于同一个程序
交换:将等待状态的程序从内存换到外存中,将准备好的程序调回内存,用于不同程序
绝对装入方式:编译程序产生绝对地址的目标代码,直接装入内存的指定位置,不需要经过地址变换。适用于单道程序环境
可重定位装入方式:在程序装入的时候对指令和数据进行修改的过程称为重定位,地址变换在装入的时候一次性完成,以后不在改变,又被称为静态重定位。可以适应多道程序环境,但是不支持程序在内存中移动。
动态运行时装入方式:装入程序将装入模块装入内存后不是立即把装入模块中的相对地址转换为绝对地址,而是将这种转换推迟到程序执行的时候。可以实现程序在内存中移动。
静态链接:在程序运行之前,将各目标模块和所需的库函数链接成一个完整的装配模块,以后 不在拆开。
装入时动态链接:在装入内存的时候边装入边链接的方式
优点:
- 便于修改和更新【地址】
- 便于实现对目标模块的共享
运行时动态链接:程序在执行的时候需要该模块才进行链接
单一连续分配:适用于单用户、单任务的操作系统中。内存被分为系统区和用户区两个部分
固定分区分配:将用户空间划分为固定大小的区域,每个区域只装入一道作业。最大缺点就是浪费内存
划分方法:
- 分区大小相等
- 分区大小不等
动态分区分配:根据进程的实际需要动态的分配空间
分区的组织方式:
- 空闲分区表
- 空闲分区链
分区分配算法:
首次适应算法
优点:倾向于使用低地址空间,为大作业分配大的空间创造了条件
缺点:
- 低址部分不断被划分,形成好多难以被利用的小空间
- 每次从低址开始查找,降低了查找效率
循环首次适应算法
优点:分区大小分布均匀,且避免了查找空闲分区的开销
缺点:缺乏大的空闲分区
最佳适应算法
优点:每次切割下来的剩余部分总是最小的
缺点:切割下来的部分难以利用
最坏适应算法
优点:查找快、不会形成太小的分区,产生碎片的几率小
缺点:缺乏大分区
快速适应算法【分类搜索法】
优点:
- 查找效率高
- 既可以保留大分区,也不会产生碎片
缺点:回收分区时,系统开销大
伙伴系统【倍增思想】:规定一个分区范围[2^l, 2m],申请时首先计算申请的空间范围[2i, 2^(i + 1)],依次判断是否存在2^(i + 1)、2^(i + 2) 大小的分区,存在则对分区进行多次拆分,回收时根据情况进行多次合并【将两个伙伴分区合并】。
优点:查找快、合并和拆分分区快
哈希算法:以空闲分区的大小为关键字建立哈希表
动态重定位分区分配:为了解决连续分区分配方式中的碎片浪费现象,通过拼接或者紧凑的方法,利用被拆分之后的小分区。
缺点:需要借助一个重定位寄存器
基本分页:
页面和物理块:将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页;把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框。
地址结构:页号P + 位移量 W
页表:实现页号到物理块号的地址映射
快表:是一个联想寄存器,高速缓存部分页表
地址变换过程:在 CPU 给出有效地址后,由地址变换机构自动地将页号 P 送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如在快表中未找到对应的页表项,则需要先判断页号是否发生地址越界,然后再访问内存中的页表,找到后,把从页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则 OS 必须找到一个老的且已被认为不再需要的页表项,将它换出。
基本分段:
地址结构:段号 + 段内地址
段表:记录段号、段长、段基址
快表:缓存部分段表信息
地址变换过程:系统将逻辑地址中的段号与段表长度TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出
越界中断信号;若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物理地址。
段页式:
地址结构:段号 + 段内页号 + 业内地址
地址变换过程:在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长 TL。进行地址变换时,首先利用段号 S,将它与段表长 TL 进行比较。若 S
**最佳置换算法:**每次将以后不需要或者最迟使用的换出
**先进先出置换算法:**每次将最先进入的置换出
**最近最久未使用置换算法(LRU):**使用“最近的过去”作为“最近的将来”的近似。可以使用哈希表 + 双向链表实现
**clock 置换算法:**当采用简单 Clock 算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置 1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是 0,就选择该页换出;若为 1,则重新将它置 0,暂不换出,而给该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为 1,则再返回到队首去检查第一个页面。由于该算法是循环地检查各页面的使用情况,故称为 Clock 算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法 NRU(Not Recently Used)。
**改进型 Clock 置换算法:**添加了一个修改位,换出时不单单只考虑是否最近未被访问,还需要考虑是否被访问
四类页面:
- 1 类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。
- 2 类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
- 3 类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问。
- 4 类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问。
页表:逻辑地址中的页号与所占主存块号的对应关系
快表:放在高速缓存中的部分页表
作用:访问内存页面只需至少访问一次高速缓存,一次内存,而使用页表则要至少访问两次内存
虚拟存储器:是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外在容量之和所决定,其运行速度接近于内存速度,每位的成本接近于外存。
- 扩大地址空间;
- 内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改。
- 公平内存分配。采用了虚存之后,每个进程都相当于有同样大小的虚存空间。
- 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
- 虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中可以保留多个进程,系统并发度提高
- 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片
所谓抖动是指,在具有虚拟存储器的计算机系统中,由于频繁的页面置换活动,使得访问外存储器次数过多,从而引起的系统效率大大降低的一种现象。
方便编程、信息共享、信息保护、动态增长、动态链接
第五章-设备控制器