操作系统
一、概述
基本特征
并发、共享、虚拟、异步
基本功能
1.进程管理
进程管理、进程同步、进程通信、死锁处理、处理机调度
2.内存管理
内存分配、地址映射、内存保护和共享、虚拟内存
3.文件管理
文件存储空间的管理、目录管理、文件读写管理和保护
4.设备管理
完成用户IO请求、方便用户使用各种设备,并提高设备的利用率,主要包括缓存管理、设备分配、设备处理、虚拟设备等
终端类型
- 外中断
- 异常
- 陷入
二、进程管理
1.进程
资源分配的基本单位
进程控制块(PCB):描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对PCB的操作。
进程可以并发地执行,采用时分复用技术。
2.线程
独立调度的基本单位。
3.区别
- 拥有资源:
进程是资源分配的基本单位,在同一个进程中,线程的切换不会访问隶属进程的资源。进程拥有独立的内存单元,而线程没有。 - 调度:
线程是独立调度的基本单位,在同一个进程中,线程的切换不会引起进程的切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。 - 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO设备等,所付出的开销原大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
- 通信方便:线程间可以通过读写同一进程中的数据进行通信,而进程通信需要借助IPC。
4.进程的状态
- 就绪状态:等待被调度
- 运行状态
- 堵塞状态:等待资源
5.进程调度算法
批处理系统
- 先来先服务:利于长作业,不利于短作业
- 短作业优先:长作业有可能会饿死,处于一直等待短作业执行完毕的状态。
- 最短剩余时间优先:按估计剩余时间最短的顺序进行调度。
交互式系统
- 时间片轮转:时间片轮转算法的效率和时间片的大小有很大关系,如果时间片过小,会导致进程切换得太频繁,而进程的切换都要保存进程的信息并且载入新进程的信息,会导致在进程切换上会花过多时间。如果时间片过长,那么实时性就不能得到保证。
- 优先级调度:为每一个进程分配一个优先级,按优先级进行调度,为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
- 多级反馈队列:可以看成时间片轮转调度算法和优先级调度算法的结合。
实时系统
- 硬实时:必须满足绝对的截止时间
- 软实时:可以容忍一定的超时
6.进程同步
- 临界区
- 同步与互斥
- 信号量
- 管程
7.进程通信
进程通信是一种手段,进程同步是一种母的。为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的的信息。
- 管道:分为匿名管道和命名管道。匿名管道在父子进程之间,命名管道没有要求。都只支持半双工通信,即单向交替传输。
- 消息队列:独立存在于读写进程存在,从而解决命名管道的打开和关闭是可能产生的困难。避免了命名管道的同步堵塞问题,不需要进程自己提供同步方法。读进程可以根据消息类型有选择地接收消息,而不像命名管道那样只能默认的接收。
- 信号量:一个计数器,用于为多个进程提供对共享数据对象的访问。
- 共享存储:允许多个进程共享一个给定的存储区。因为数据不需要再进程之间复制,所以这是最快的一种IPC。需要使用信号量来同步对共享存储的访问。多个进程可以将同一个文件映射到他们的地址空间从而实现共享内存。
- 套接字:可以用于不同机器间的进程通信。
三、死锁问题
1.必要条件
- 互斥
- 占有和等待
- 不可抢占
- 环路等待
2.处理方法
- 鸵鸟策略
- 死锁检测与死锁恢复
- 死锁预防
1.破坏互斥条件
2.破坏占有和等待条件
3.破坏不可抢占条件
4.破坏环路等待 - 死锁避免
1.安全状态
2.单个资源的银行家算法
3.多个资源的银行家算法
四、内存管理
1.虚拟内存
将物理内存扩充成更大的逻辑内存,从而使程序获得更多的可用内存。为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。
2.分页系统地址映射
内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。
一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。
3.页面置换算法
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
- 最佳
- 最近最久未使用
- 最近未使用
- 先进先出
- 第二次机会算法
- 时钟
4.分段
虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。
分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
5.段页式
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
6.分页和分段的比较
- 对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
- 地址空间的维度:分页是一维地址空间,分段是二维的。
- 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
- 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
五、设备管理
1.磁盘结构
- 盘面
- 磁道
- 扇区
- 磁头:与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写)。
- 制动手臂:用于在磁道之间移动的磁头。
- 主轴:是整个盘面转动
2.磁盘调度算法
影响磁盘块时间的因素有:
- 旋转时间
- 寻道时间
- 实际的数据传输时间
其中寻道时间最长,因此磁盘调度的主要目的是使磁盘的平均寻道时间最短。
算法:
- 先来先服务
- 最短寻道时间优先
- 电梯算法
六、链接
1.程序执行过程:
- 预处理
- 编译
- 汇编
- 链接
2.静态链接
静态链接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:
- 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来。
- 重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。
3.目标文件
- 可执行目标文件:可以直接在内存中执行;
- 可重定向目标文件:可与其它可重定向目标文件在链接阶段合并,创建一个可执行目标文件;
- 共享目标文件:这是一种特殊的可重定向目标文件,可以在运行时被动态加载进内存并链接;
4.动态链接
静态库有以下两个问题:
- 当静态库更新时那么整个程序都要重新进行链接;
- 对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。
共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用 .so 后缀来表示,Windows 系统上它们被称为 DLL。它具有以下特点:
- 在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中;
- 在内存中,一个共享库的 .text 节(已编译程序的机器代码)的一个副本可以被不同的正在运行的进程共享。