- 进程管理
- 进程和线程
- 进程
- 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。
- 进程的通信方式
- 管道
- 管道是一种半双工的通信方式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程
- 分类
- 普通管道 PIPE
- 流管道(s_pipe)
- 命名管道(name_pipe)
- 命名管道也是半双工的通信方式,它允许无亲缘关系的进程间进行通信
- 系统 IPC(包括消息队列、信号量、共享存储)
- 信号量是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。
- 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
- 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存就是映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。
- SOCKET
- 管道
- 进程同步机制
- 原子操作
- 信号量机制
- 自旋锁管程
- 会合
- 分布式系统
- 进程调度策略
- FCFS(先来先服务)
- 该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用 FCFS 算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
- 优先级
- 短作业(进程)优先调度算法
- 短作业(进程)优先调度算法 SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
- 高优先权优先调度算法
- 优先权调度算法的类型
- 非抢占式优先权算法
- 在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。
- 抢占式优先权调度算法
- 在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。
- 非抢占式优先权算法
- 高响应比优先调度算法
- 在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。如果我们能为每个作业引入动态优先权,并使作业的优先级随着等待时间的增加而以速率 a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。
- 优先权调度算法的类型
- 短作业(进程)优先调度算法
- 时间片轮转
- 在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把 CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几 ms 到几百 ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。
- 多级反馈
- 前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。
- 实施过程
- 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第 i+1 个队列的时间片要比第 i 个队列的时间片长一倍。
- 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按 FCFS 原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第 n 队列后,在第 n 队列便采取按时间片轮转的方式运行。
- 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第 1~(i-1) 队列均空时,才会调度第 i 队列中的进程运行。如果处理机正在第 i 队列中为某进程服务时,又有新进程进入优先权较高的队列(第 1~(i-1) 中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第 i 队列的末尾,把处理机分配给新到的高优先权进程。
- FCFS(先来先服务)
- 进程的 5 种状态及转换过程
- 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
- 运行状态:占用处理机资源运行,处于此状态的进程数小于等于 CPU 数
- 阻塞状态:进程等待某种条件,在条件满足之前无法执行
- 线程
- 线程是进程的实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
- 线程同步的方式
- 互斥量(CMutex)
- 采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
- 信号量(CSemphore)
- 它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件(信号)
- 通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
- 互斥量(CMutex)
- 线程与进程的区别
- 因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。
- 体现在通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。
- 体现在 CPU 系统上面,线程使得 CPU 系统更加有效,因为操作系统会保证当线程数不大于 CPU 数目时,不同的线程运行于不同的 CPU 上。
- 体现在程序结构上,举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用 if else 嵌套来判断 pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助。
- 进程
- 同步和互斥
- 同步是多个进程因为合作而使得进程的执行有一定的先后顺序。比如某个进程需要另一个进程提供的消息,获得消息之前进入阻塞态;
- 互斥是多个进程在同一时刻只有一个进程能进入临界区。
- 饥饿与死锁
- 饥饿
- 指一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态;
- 死锁
- 指两个或两个以上的进程/线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
- 产生的四个条件(有一个条件不成立,则不会产生死锁)
- 互斥条件
- 一个资源一次只能被一个进程使用
- 请求与保持条件
- 一个进程因请求资源而阻塞时,对已获得资源保持不放
- 不剥夺条件
- 进程获得的资源,在未完全使用完之前,不能强行剥夺
- 循环等待条件
- 若干进程之间形成一种头尾相接的环形等待资源关系
- 互斥条件
- 解决死锁的基本方法
- 预防死锁
- 资源一次性分配:(破坏请求和保持条件)
- 可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
- 避免死锁
- 预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
- 银行家算法如何解题?
- 列出各个资源的剩余情况,再列出各个进程完成需要的资源情况,最后根据前两种情况判断哪个进程可以执行完,执行完进程后会释放资源,再重复以上步骤即可。
- 银行家算法如何解题?
- 预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
- 检测死锁
- 首先为每个进程和每个资源指定一个唯一的号码;然后建立资源分配表和进程等待表。
- 解除死锁
- 当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
- 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
- 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
- 当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
- 预防死锁
- 解决死锁的常用策略
- 鸵鸟策略、预防策略、避免策略、检测与解除死锁
- 饥饿
- 进程和线程
- 内存管理
- 分页和分段
- 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
- 段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定
- 段向用户提供二维地址空间;页向用户提供的是一维地址空间
- 段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
- 将用户程序变为可在内存中执行的程序的步骤
- 编译
- 链接
- 装入
- 程序的装入方式
- 绝对装入
- 动态运行装入
- 可重定位装入
- 内存连续分配管理方式
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 页面置换算法
- 最佳置换算法
- 先进先出置换算法
- 最近最久未使用算法
- 时钟置换算法
- 堆栈(stack)、堆(heap)
- 栈
- 用户维护函数调用上下文。由高地址向低地址生长,通常以M为单位,由操作系统维护。
- 保存了一个函数调用所需要维护的信息,称为活动记录,包括
- 函数的返回地址,参数
- 临时变量
- 上下文:寄存器
- 空间管理
- 栈(英文名称是 stack)是系统自动分配空间的,例如我们定义一个
char a;
系统会自动在栈上为其开辟空间 - 栈上的空间是自动分配自动回收的
- 栈(英文名称是 stack)是系统自动分配空间的,例如我们定义一个
- 栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问
- 堆
- 空间管理
- 动态申请内存,即使用 new or malloc 等分配到的内存,可以比栈大很多,需用户自己释放
- malloc
- 对于申请内存这种特权操作,肯定是操作系统内核来做比较合适,但是频繁的进行系统调用,在用户态和内核态之间切换,也就是频繁的调用中断处理程序,性能是较差的。所以,事实上都是通过 c 语言的运行库封装好的库函数,预申请一块设当的内存,然后零售给程序用,可以采用空闲链表或者位图等来管理。这取决于运行库的实现了。
- malloc
- 动态申请内存,即使用 new or malloc 等分配到的内存,可以比栈大很多,需用户自己释放
- 堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
- 空间管理
- 栈
- 分页和分段
- 文件管理
- 磁盘调度算法(先来先服务算法、最短寻道时间优先算法、扫描算法、循环扫描算法)
- I/O 管理
- I/O 控制方式
- 程序 I/O 方式
- 这种方式下,CPU 通过 I/O 指令询问指定外设当前的状态,如果外设准备就绪,则进行数据的输入或输出,否则 CPU 等待,循环查询。
- 中断驱动方式
- 每次中断均需保存断点(返回地址)和现场(各寄存器的值,包括标志寄存器),中断返回时,要恢复断点和现场。
- DMA 方式
- DMA(Direct Memory Access,直接存储器访问)。在 DMA 出现之前,CPU 与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU 是通过系统总线与其他部件连接并进行数据传输。
- DMA 方式在数据传送过程中,没有保存现场、恢复现场之类的工作。
- 由于 CPU 根本不参加传送操作,因此就省去了 CPU 取指令、取数、送数等操作。内存地址修改、传送字个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以 DMA 方式能满足高速 I/O 设备的要求,也有利于 CPU 效率的发挥。
- I/O 通道控制方式
- 通道是一个用来控制外部设备工作的硬件机制,相当于一个功能简单的处理机。通道是独立于 CPU 的、专门负责数据的输入输出传输工作的处理器,它对外部设备实统一管理,代替 CPU 对 I/O 操作进行控制,从而使 I/O 操作可以与 CPU 并行工作。通道是实现计算机和传输并行的基础,以提高整个系统的效率。
- 程序 I/O 方式
- Spooling 技术
- Spooling 技术能够缓和 CPU 和外设的速度,提高 I/O 速度,将独占设备转化为共享设备,并实现虚拟设备功能。
- I/O 控制方式