操作系统第二次作业
进程的三种状态:
- 运行态(running,在该时刻实际占用处理机 )
- 就绪态(Ready,可运行,因为其他进程正在进行而暂时被挂起)
- 阻塞态(Blocked,除非某种外部事件发生,否则不能运行)
目前计算机上,中断处理程序使用汇编语言编写的原因:中断处理程序,以操作系统最底层的调度器为例,需要使用汇编语言程序存储寄存器值,设置新的栈等,即汇编语言代码要为新的当前进程进行装入寄存器值和内存映射并启动等现场保存工作.
进程和线程的本质区别:多个线程的执行流组成进程,进程是用来集合资源的,而线程是CPU调度中的实体.
在使用线程的系统中,每个线程都有一个堆栈,它存储着执行的历史.
竞争条件:两个多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件.
若采用时间片调度而不是优先级调度,是否会H继续陷入死循环:
- 采用优先级调度陷入死循环的原因在于低优先级的进程永远处于被调度队列的较后位置,而正好于处于临界区时无法有其他进程再被调度形成死锁,故会陷入死循环;
- 采用时间片调度也会发生这种情况,虽然时间片调度作为一种非抢占式进程,在时间片到、进程运行完毕或者进程执行原语操作时都会面临进程切换的问题,而当进程切换发生时,死锁也就会相应发生了.但是时间片调度仍然很大的避免了优先级高的无法离开临界区的问题.
读者-写者问题的3种形式化:
- 读者优先: 当读者在读时,写者不能进行写,当有新的读者到来时,如果没有写,那么就可以立刻开始读.当写完成时,如果有一些读者和写者都在等待队列中时,读者的启动的优先级高,这些读者都可以同时启动.
- 读者和写者具有公平的情况:读读共享,写写互斥,写读互斥.当我们开始进行读的时候我们需要一次性将读者队列读完.当我们进行写时,也要一次一次将写者等待队列写完.
- 写者优先:当等待队列中有写者时,读者不可以被启动.即当有任何进程完成时,有写者在等待,读者都不可以被启动.
以下各种情况下的CPU运行公式:
$\frac{T}{S+T}$
$\frac{T}{S+T}$
考虑context switch的次数:
Context switch的次数为:$\frac{T}{ST/Q+T}$
当Q=S时,考虑$T<Q时$,CPU利用率为:$\frac{T}{S+T}$当$T\ge Q$时,CPU 利用率为50$.
随着时间片越来越小,上下文切换花销所占的比重会越来越大,CPU会趋近于0.
平均响应时间最短,最短作业优先在批处理系统中常常伴随着最短平均响应时间.
所以调度的顺序在于x的值,x的大小在不同的位置有不同的调度顺序.
对于每种不同的调度算法计算不同的平均进程周转时间.
时间片轮转: 程序具有多道处理能力,作业均获得公平的CPU份额.所以每个进程都占用$\frac{1}{5},\frac{1}{4},\frac{1}{3},\frac{1}{2},1$的CPU. 完成的时间为:10,8,6,4,2;故完成的时间为10,18,24,28,30.
平均时间为110/5=22
优先级调度,按照:优先级54321的顺序,即6,8,10,2,4的顺序,故相应的完成时间为6,14,24,26,30,平均时间为:20
相应的完成时间为:10,16,18,22,30,平均时间为19.2
按照:2,4,6,8,10,相应的完成时间为:2,6,12,20,30,平均时间为 14
$\frac{35}{50}+\frac{20}{100}+\frac{10}{200}+\frac{x}{250}\le1$
故$x\le12.5$
优先级调度算法会引起饥饿问题.所以minix3的优先级调度(多级排队系统)会产生饥饿.
对于某个低优先级而无穷等待的CPU,和超载的计算机系统,稳定的更高优先级的进程流会组织低优先级的进程获得CPU,此时对于低优先级的进程而言,就有饥饿的可能.