1.共享内存 可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存 空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式 需要依靠某种同步操作,如互斥锁和信号量等。
2.消息队列 “消息队列”是在消息的传输过程中保存消息的容器。具有写权限得进程可 以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可 以从消息队列中读取信息。
3.信号 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
4.信号量 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作 为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因 此,主要作为进程间以及同一进程内不同线程之间的同步手段。
5.套接字 这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程 间通信,应用非常广泛。
6.普通管道 普通管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 父子关系的进程间使用。
7.有名管道 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
进程的调度方法:
1.先来先服务调度算法。 先来先去服务调度算法是一种最简单的调度算法,也称为先进先出或严格排队方案。当每个进程就绪后,它加入就绪队列。当前正运行的进程停止执行,选择在就绪队列中存在时间最长的进程运行。该算法既可以用于作业调度,也可以用于进程调度。先来先去服务比较适合于常作业(进程),而不利于段作业(进程)。
2.短作业(进程)优先调度算法。 最短进程优先是一个非抢占策略,他的原则是下一次选择预计处理时间最短的进程,因此短进程将会越过长作业,跳至队列头。该算法即可用于作业调度,也可用于进程调度。但是他对长作业不利,不能保证紧迫性作业(进程)被及时处理,作业的长短只是被估算出来的。
3.优先权调度算法。 为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。此算法常被用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。 1). 非抢占式优先权算法 在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。 2). 抢占式优先权调度算法 在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
4.高响应比优先调度算法。 根据比率:R=(w+s)/s (R为响应比,w为等待处理的时间,s为预计的服务时间) 如果该进程被立即调用,则R值等于归一化周转时间(周转时间和服务时间的比率)。R最小值为1.0,只有第一个进入系统的进程才能达到该值。调度规则为:当前进程完成或被阻塞时,选择R值最大的就绪进程,它说明了进程的年龄。当偏向短作业时,长进程由于得不到服务,等待时间不断增加,从而增加比值,最终在竞争中赢了短进程。 和最短进程优先、最短剩余时间优先一样,使用最高响应比策略需要估计预计服务时间。
5.基于时间片的轮转调度算法。 轮转法是基于适中的抢占策略的,以一个周期性间隔产生时钟中断,当中断发生后,当前正在运行的进程被置于就绪队列中,然后基于先来先去服务策略选择下一个就绪作业的运行。这种技术也称为时间片,因为每个进程再被抢占之前都给定一片时间。
6.多级反馈队列调度算法。 多级反馈队列算法,不必事先知道各种进程所需要执行的时间,他是当前被公认的一种较好的进程调度算法。其实施过程如下: 1)设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。 2)当一个新进程进入内存后,首先放入第一队列的末尾,按照先来先去原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,同样等待调度…如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。 3)仅当第一队列空闲的时候,调度程序才调度第二队列中的进程运行;仅当第1到(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。 4)如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。
7.反馈法: 如果没有关于进程相对长度的任何信息,则最短进程优先,最短剩余时间、最高响应优先比都不能使用。另一种导致偏向短作业的方法是处罚运行时间较长的作业,换句话说,如果不能获得剩余的执行时间,那就关注已执行了的时间。 调度基于被抢占原则(按时间片)并使用动态优先级机制。当一个进程第一次进入系统中时,他被放置在一个优先级队列中,当第一次被抢占后并返回就绪状态时,它被放置在下一个低优先级队列中,在随后的时间里,每当被抢占时,他被降级到下一个低优先级队列中。一个短进程很快被执行完,不会在就绪队列中降很多级,一个长进程会逐渐降级。因此先到的进程和短进程优先于长进程和老进程。在每个队列中,除了优先级在最低的队列中之外,都是用简单的先来先去服务机制,一旦一个进程处于优先级最低的队列中,它就不可能在降级,但会重复的返回该队列,直到运行结束。因此,该队列按照轮转方式调度。
锁机制:包括互斥锁、条件变量、读写锁 *互斥锁提供了以排他方式防止数据结构被并发修改的方法。 *读写锁允许多个线程同时读共享数据,而对写操作是互斥的。 *条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条 件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制 包括无名线程信号量和命名线程信号量。
信号机制 类似进程间的信号处理。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用 于数据交换的通信机制。
进程管理,存储管理,设备管理,文件管理,程序接口,用户界面。
以下三种情况会导致用户态到内核态的切换: 1.系统调用; 2.异常,比如缺页异常; 3.外围设备的中断,当外围设备完成用户请求的操作后,会向 CPU 发出相应的 中断信号。
64 位系统, 那它和 32 位系统相比,有什么区别和优点: 1)寻址能力不同; 2)运算速度不同。
1.调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 。 2.并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。 3.拥有资源: 进程是拥有资源的一个独立单位,线程自己基本上不拥有系 统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和 栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。进 程之间是不能共享地址空间的, 而线程是共享着所在进程的地址空间的。 4.系统开销: 在创建或撤消进程时,由于系统都要为之分配和回收资源, 导致系统的开销明显大于创建或撤消线程时的开销。
进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。 选择调出页面的算法就称为页面置换算法。好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出。
1.最佳置换算法(OPT) 最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。 最佳置换算法可以用来评价其他算法。假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串: 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 进程运行时,先将7, 0, 1三个页面依次装入内存。进程要访问页面2时,产生缺页中断,根据最佳置换算法,选择第18次访问才需调入的页面7予以淘汰。然后,访问页面0时,因为已在内存中所以不必产生缺页中断。访问页面3时又会根据最佳置换算法将页面1淘汰……依此类推,从图中可以看出釆用最佳置换算法时的情况。 可以看到,发生缺页中断的次数为9,页面置换的次数为6。 2.先进先出(FIFO)页面置换算法 优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。 这里仍用上面的实例,釆用FIFO算法进行页面置换。进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。利用FIFO算法时进行了 12次页面置换,比最佳置换算法正好多一倍。 FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,这是由 Belady于1969年发现,故称为Belady异常,只有FIFO算法可能出现Belady 异常,而LRU和OPT算法永远不会出现Belady异常。 3.最近最久未使用(LRU)置换算法 选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。 再对上面的实例釆用LRU算法进行页面置换,进程第一次对页面2访问时,将最近最久未被访问的页面7置换出去。然后访问页面3时,将最近最久未使用的页面1换出。 前5次置换的情况与最佳置换算法相同,但两种算法并无必然联系。实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。 LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现Belady异常。FIFO算法基于队列实现,不是堆栈类算法。A.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法 1:利用 AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段 代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配,因此 不会出现死锁的情形。当某些资源不够时阻塞调用进程;由于等待队列的存在, 使得对资源的请求满足 FIFO 的要求,因此不会出现饥饿的情形。 方法 2:利用信号量的保护机制实现。通过信号量 mutex 对 eat()之前的取左 侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的 出现。 B.原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子; 而偶数号的哲学家则相反。按此规定,将是 1,4 号哲学家竞争 4 号筷子,2,3 号哲 学家竞争 2 号筷子.即五个哲学家都竞争偶数号筷子,获得后,再去竞争奇数号筷 子,最后总会有一个哲学家能获得两支筷子而进餐。而申请不到的哲学家进入阻 塞等待队列,根据 FIFO 原则,则先申请的哲学家会较先可以吃饭,因此不会出 现饿死的哲学家。 伪代码:
1、临界区: 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合 控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个 线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的 线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他 线程才可以抢占。
2、互斥量: 采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的 权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。 互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的 公共资源安全共享 。
3、信号量: 它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时 刻访问此资源的最大线程数目。
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线 程的优先级比较的操作。