【计算机网络】计算机网络面试常考知识点整理(二)

1、哲学家就餐问题

1.1 哲学家就餐问题描述

吃饭的布置如图所示,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。

哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生”活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。

这里写图片描述

1.2 解决方法:信号量解决方案(服务生解法)

一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。

系统中有N个并发进程。 若规定每个进程需要申请2个某类资源, 则当系统提供N+1个同类资源时,无论采用何种方式申请资源, 一定不会发生死锁。分析:N+1个资源被N 个进程竞争, 由抽屉原理可知, 则至少存在一个进程获2个以上的同类资源。这就是前面提到的哲学家就餐问题中5个哲学家提供6支筷子时一定不会发生死锁的原因。

系统中有5个并发进程, 规定每个进程需要申请2个某类资源。 若系统提供5个该类资源, 在保证一定不会产生死锁的前提下,最多允许多少个进程并发执行?假设允许N个进程, 将R=2,K=5带入上述公式, 有N*(2-1)+1=5所以 N=4。也就意味着,如果在任何时刻系统最多允许4个进程并发执行, 则一定不会发生死锁。 大多数哲学家就餐问题死锁阻止算法都是基于这个结论。
增加一个信号量,控制最多有4个进程并发执行,算法如下:

int fork[5] = {1,1,1,1,1};  //表示这时有五个叉子
int semaphore = 4;//设置初始值4,服务员要求开始只能有四个哲学家进来吃饭
void philosopher(int i){
    while(1){
        wait(footman);
        think();
        wait(fork[i]);//申请左叉子
        wait(fork[i+1]%5);//申请右叉子
        eat();
        signal(fork[i+1]%5);//释放右叉子
        signal(fork[i]);//释放左叉子
        signal(footman);
    }
}

2、进程状态转换图

2.1 进程的基本状态

运行态:该进程正在执行。
就绪态:进程做好了准备,只要有机会就开始执行。
阻塞态:进程在某些事件发生前不能执行,如I/O操作完成。
新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组之中,通常是进程控制块已经创建但还没有加入到主存中的新进程。
退出态:操作系统从可执行进程组之中释放出的进程,或者因为他自身停止了(已被执行完),或是因为某种原因被取消。

2.2 五状态模型转换图

这里写图片描述

  • 空->创建:创建执行一个程序的新进程。
  • 新建->就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换到就绪态。(大多数系统基于现有的进程数或分配给现有进程的虚存数量设置一些限制,以确保不会因为活跃进程的数量过多而导致的系统性能的下降)。
  • 就绪->运行:需要选择一个新进程运行时,操作系统从就绪队列中选取一个处于就绪态的进程,这是调度器或分派器的工作。
  • 运行->退出:如果当前正在运行的进程表示自己已经完成或取消,操作系统会将它终止。
  • 运行->就绪:一是正在运行的进程到达了“允许不中断执行”的最长时间段,一是操作系统给不同的进程分配不同的优先级,进程有可能会被抢占,一是进程自愿释放对处理器的控制(例如一个周期性地进行审计和维护的后台进程)。
  • 运行->阻塞:如果进程请求它必须等待的某些事件,则进入阻塞态。
  • 阻塞->就绪:当所等待的事件发生时,处于阻塞态的进程转换到就绪态。
  • 就绪->退出:在某些系统中,父进程可以在任何时刻终止一个子进程。如果一个父进程终止,与该父进程相关的所有子进程都将被终止。

加入挂起态:

这里写图片描述

这里写图片描述

扩展: 就绪态,阻塞态,就绪/挂起态,阻塞/挂起态。

扫描二维码关注公众号,回复: 2313681 查看本文章
  • 就绪态:进程在主存中并可以执行。
  • 阻塞态:进程在主存中并等待一个事件。
  • 阻塞/挂起态:进程在辅存中并等待一个时间。
  • 就绪/挂起态:进程在辅存中,但是只要被载入主存中就可以执行。

3、线程与进程之间的区别和联系,线程是否具有相同的堆栈

3.1 线程与进程之间的区别和联系

  1. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 
  2. 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  3. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
  4. 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
  5. 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

3. 2 线程拥有自己的栈空间

相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。


4、 操作系统中进程调度策略哪几种

4.1 先进先出算法(FIFO:First-In-First-Out)

该算法按照进程进入就绪队列的先后次序来选择。即每当进入进程调度,总是把就绪队列的队首进程投入运行。

4.2 时间片轮转算法(RR:Round-Robin)

这主要是分时系统会使用的一种算法。轮转法的基本思想是:将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片。当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度。同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行;

如此轮流调度,使得就绪队列中的所有进程在一个有限的时间T内都可以依次轮流获得一个时间片的处理机时间,从而满足系统对用户分时响应的要求。

在轮转法中,时间片长度Q的选取非常重要,将直接影响系统开销和响应时间。如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,比如一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就会退化成先进先出算法了。

【以下是影响时间片值设置的几个主要因素】

系统响应时间:当进程数目一定时,时间片Q值的大小正比于系统对响应时间的要求。
就绪进程的数目:当系统响应时间T一定时,时间片Q值的大小反比于就绪进程数。
计算机的处理能力:计算机的处理能力直接决定了每道程序的处理时间,显然,处理速度愈高,时间片值就可愈小。

4.3 最高优先级算法(HPF:Highest Priority First)

进程调度每次将处理及分配给具有最高优先级的就绪进程。

进程优先数的设置可以是静态的,也可以是动态的。静态优先数是在进程创建时根据进程初始特性或用户要求而确定的,在进程运行期间不能改变;动态优先数则是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变(如等待时间增长),不断修改优先数。

4.4 多级队列反馈法

设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二队次之,其余队列优先级依次降低。仅当第1~i-1个队列均为空时,操作系统调度器才会调度第i个队列中的进程运行。赋予各个队列中进程执行时间片的大小也各不相同。在优先级越高的队列中,每个进程的执行时间片就越小或越大(Linux-2.4内核就是采用这种方式)。

当一个就绪进程需要链入就绪队列时,操作系统首先将它放入第一队列的末尾,按FCFS的原则排队等待调度。若轮到该进程执行且在一个时间片结束时尚未完成,则操作系统调度器便将该进程转入第二队列的末尾,再同样按先来先服务原则等待调度执行。如此下去,当一个长进程从第一队列降到最后一个队列后,在最后一个队列中,可使用FCFS或RR调度算法来运行处于此队列中的进程。

如果处理机正在第i(i > 1)队列中为某进程服务时,又有新进程进入第k(k < i)的队列,则新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给处于第k队列的新进程。

从MLFQ调度算法可以看出长进程无法长期占用处理机,且系统的响应时间会缩短,吞吐量也不错(前提是没有频繁的短进程)。所以MLFQ调度算法是一种合适不同类型应用特征的综合进程调度算法。

进程调度

猜你喜欢

转载自blog.csdn.net/sofia_m/article/details/80962572