操作系统面试题(进程部分总结)

什么是进程?

进程就是正在执行的程序,是操作系统资源分配和调度的基本单位。
一般来说,进程包含指令执行序列和资源。

什么是线程?

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
线程的出现将资源和指令执行分开,既有多段程序交替执行,切换起来又快,既保留了并发的优点,又避免了进程切换的代价

进程与线程的区别?

拥有资源

进程是资源分配的基本单位,有自己的独立地址空间,但是线程不拥有资源,没有自己的独立地址空间。线程可以访问隶属于进程的资源。

调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。
在进行进程切换时,要保存当前执行进程在切换时的样子,而线程的切换只有指令切换(PC指针变),没有内存切换不用动映射表

通信方面

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信只能通过进程通信的方式进行。

** 独立 **
进程是独立的,一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程

并发和并行有什么区别?

并发:在一段时间内,多个任务都会被处理
并行:在同一时刻,有多个任务在执行

进程同步的方式有哪些?

临界区
共享数据不保护,就会出错,因为程序执行顺序是未知的
临界区是一段代码,一次最多只能让一个进程进入,因此在一个进程修改信号量时,不允许其他进程执行修改信号量的代码。每个进程在进入临界区之前,需要先进行检查。

互斥量

mutex互斥信号量,使用一个互斥的变量来直接制约多个进程,表示一次只能一个进程使用公共资源。

信号量
在这里插入图片描述

信号量(Semaphore)是一个结构体,value 代表信号量的值,queue是阻塞队列,用于存放睡眠的进程,进程可以对信号量进行增减,减为P,增为V。这两个操作为系统调用

对于P操作,如果执行操作后信号量小于 0,那么执行该操作的进程就会阻塞,否则继续执行;
对于V操作,如果操作之后的信号量小于等于0,那么就会从阻塞队列唤醒一个进程。
管程

管程使用的是面向对象思想,将表示共享资源的数据结构还有相关的操作,包括同步机制,都集中并封装到一起。所有进程都只能通过管程间接访问临界资源,而管程只允许一个进程进入并执行操作,从而实现进程互斥。管程中设置了多个条件变量,表示多个进程被阻塞或挂起的条件。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。管程有一个重要特性,就是在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。

进程间的通信的几种方式

管道(pipe)及命名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;

消息队列:消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息;

共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;

信号量:主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段;

套接字:这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

为什么进程上下文切换比线程上下文切换代价高?

进程切换分两步:

1.切换页目录以使用新的地址空间

2.切换内核栈和硬件上下文

对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。

进程有哪几种状态?

就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行。
执行:进程已经获得CPU,程序正在执行状态。
阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。
在这里插入图片描述

进程调度算法有哪些?

先来先服务

非抢占式的调度算法,按照请求的顺序进行调度。

平均周转时间偏大

短作业优先

非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
短作业优先保证了平均周转时间最短
然而导致了响应时间过长

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

最短剩余时间优先

最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

时间片轮转

按时间片来轮转调度,能够控制响应时间
但是时间片的大小不能简单的设置
时间片大:会导致响应时间长
时间片小:虽然响应时间小,但导致吞吐量小

优先级调度

为每个进程分配一个优先级,按优先级进行调度。

这几个基本的调度算法都不完美,所以要写一个程序来综合这三个算法,从而实现调度

可以介绍下Linux0.11的调度函数schedule

  1. 用counter一个变量同时代表优先级和时间片两个值
  2. 每次执行schedule都是找到PCB中counter最大的就绪进程,然后给switch_to去执行
  3. 所有就绪态的进程的counter都用完时(counter=0),counter=counter/2+初值
  4. 这样做恢复了时间片,且让阻塞态恢复就绪态的counter比直接等待转就绪的大,在阻塞队列里待的越久,counter(优先级)越大

这个算法的优点:

  1. 保证了响应时间的界
  2. 经过IO以后,counter就会变大,IO越长,counter越大,照顾了IO进程
  3. 后台进程一直按照counter轮转,近似SJF(短作业优先)
  4. 每个进程只用一个counter变量维护

什么是死锁?死锁产生的条件?

1). 死锁的概念

在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。

2). 死锁产生的四个必要条件

互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;

占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;

非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放

循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

3). 死锁的处理基本策略和常用方法

解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁 、鸵鸟策略 等。

(1). 死锁预防
  
  死锁预防的基本思想是 只要确保死锁发生的四个必要条件中至少有一个不成立,就能预防死锁的发生,具体方法包括:

打破互斥条件:允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常并无实用价值。

打破占有并等待条件:可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。

打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。

打破循环等待条件:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不回产生环路,预防死锁的发生。

(2). 死锁避免的基本思想
  
  死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。所谓安全状态是指:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。资源分配图算法和银行家算法是两种经典的死锁避免的算法,其可以确保系统始终处于安全状态。其中,资源分配图算法应用场景为每种资源类型只有一个实例(申请边,分配边,需求边,不形成环才允许分配),而银行家算法应用于每种资源类型可以有多个实例的场景。

(3). 死锁解除

死锁解除的常用两种方法为进程终止和资源抢占。所谓进程终止是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止;所谓资源抢占是指从一个或多个死锁进程那里抢占一个或多个资源,此时必须考虑三个问题:

(I). 选择一个牺牲品
(II). 回滚:回滚到安全状态
(III). 饥饿(在代价因素中加上回滚次数,回滚的越多则越不可能继续被作为牺牲品,避免一个进程总是被回滚)

猜你喜欢

转载自blog.csdn.net/m0_51082307/article/details/109683624
今日推荐