操做系统-面试题汇总

目录算法

进程管理多线程

进程和线程有什么区别?架构

同一进程中的线程能够共享哪些数据?并发

线程独占哪些资源?异步

进程间有哪些通讯方式?ide

同步、异步与互斥函数

并发与并行操作系统

调度线程

进程调度策略设计

什么是优先级反转,如何解决?

什么是僵尸进程?

什么是孤儿进程?

进程的异常控制流:陷阱、中断、异常和信号

内存管理

参考


进程管理

进程和线程有什么区别?

  • 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分派的基本单位;
  • 线程依赖于进程而存在,一个进程至少有一个线程
  • 进程有本身的独立地址空间,线程共享所属进程的地址空间;
  • 进程是拥有系统资源的一个独立单位,而线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),和其余线程共享本进程的相关资源如内存、I/O、cpu等;
  • 在进程切换时,涉及到整个当前进程CPU环境的保存,环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少许的寄存器的内容,并不涉及存储器管理方面的操做,可见,进程切换的开销远大于线程切换的开销
  • 线程之间的通讯更方便,同一进程下的线程共享全局变量等数据,而进程之间的通讯须要以进程间通讯(IPC)的方式进行;
  • 多线程程序只要有一个线程崩溃,整个程序就崩溃了,但多进程程序中一个进程崩溃并不会对其它进程形成影响,由于进程有本身的独立地址空间,所以多进程更加健壮

同一进程中的线程能够共享哪些数据?

  • 进程代码段
  • 进程的公有数据(全局变量、静态变量...)
  • 进程打开的文件描述符
  • 进程的当前目录
  • 信号处理器/信号处理函数:对收到的信号的处理方式
  • 进程ID与进程组ID

线程独占哪些资源?

  • 线程ID
  • 一组寄存器的值
  • 线程自身的栈(堆是共享的)
  • 错误返回码:线程可能会产生不一样的错误返回码,一个线程的错误返回码不该该被其它线程修改;
  • 信号掩码/信号屏蔽字(Signal mask):表示是否屏蔽/阻塞相应的信号(SIGKILL,SIGSTOP除外)

线程的分类

  • 用户级线程(user level thread):对于这类线程,有关线程管理的全部工做都由应用程序完成,内核意识不到线程的存在。在应用程序启动后,操做系统分配给该程序一个进程号,以及其对应的内存空间等资源。应用程序一般先在一个线程中运行,该线程被成为主线程。在其运行的某个时刻,能够经过调用线程库中的函数建立一个在相同进程中运行的新线程。用户级线程的好处是很是高效,不须要进入内核空间,但并发效率不高。

  • 内核级线程(kernel level thread):对于这类线程,有关线程管理的全部工做由内核完成,应用程序没有进行线程管理的代码,只能调用内核线程的接口。内核维护进程及其内部的每一个线程,调度也由内核基于线程架构完成。内核级线程的好处是,内核能够将不一样线程更好地分配到不一样的CPU,以实现真正的并行计算。

事实上,在现代操做系统中,每每使用组合方式实现多线程,即线程建立彻底在用户空间中完成,而且一个应用程序中的多个用户级线程被映射到一些内核级线程上,至关因而一种折中方案。

进程间有哪些通讯方式?

  • (无名)管道(Pipe)

管道是一种半双工的通讯方式,单向的、先进先出的、无结构的、固定大小的字节流。数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。

  • 命名管道

命名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

  • 信号(Signal)

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

  • 消息队列

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  • 共享内存

共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步和通讯。

  • 信号量(Semaphore)

信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段;课本里面的PV操做就是对信号量的增减。

  • 套接字(Socket)

与其余通讯机制不一样的是,它可用于不一样机器间的进程通讯。

同步、异步与互斥

  • 同步:多个进程由于合做而使得进程的执行有必定的前后顺序。好比某个进程须要另外一个进程提供的消息,得到消息以前进入阻塞态;
  • 互斥:多个进程在同一时刻只有一个进程能进入临界区
  • 异步(和同步相比):同步是顺序执行,异步是在等待某个资源的时候继续作本身的事

并发与并行

并发:在一个时间段中同时有多个程序在运行,但其实任一时刻,只有一个程序在CPU上运行,宏观上的并发是经过微观的不断切换实现的;

多线程:并发运行的一段代码。是实现异步的手段。

并行(和串行相比):在多CPU系统中,多个程序不管宏观仍是微观上都是同时执行的。

调度

进程调度策略

批处理系统

先来先服务 first-come first-serverd(FCFS)

最短做业优先 shortest job first(SJF)

最短剩余时间优先 shortest remaining time next(SRTN)

最高响应比优先 Highest Response Ratio Next(HRRN)

交互式系统
交互式系统有大量的用户交互操做,在该系统中调度算法的目标是快速地进行响应。

时间片轮转 Round Robin

优先级调度算法

多级反馈队列调度算法 Multilevel Feedback Queue

什么是优先级反转,如何解决?

高优先级的进程等待被一个低优先级进程占用的资源时,就会出现优先级反转,即优先级较低的进程比优先级较高的进程先执行。

解决方法:

  • 优先级天花板(priority ceiling):当任务申请某资源时,把该任务的优先级提高到可访问这个资源的全部任务中的最高优先级,这个优先级称为该资源的优先级天花板。简单易行。
  • 优先级继承(priority inheritance):当任务A申请共享资源S时,若是S正在被任务C使用,经过比较任务C与自身的优先级,如发现任务C的优先级小于自身的优先级,则将任务C的优先级提高到自身的优先级,任务C释放资源S后,再恢复任务C的原优先级。

什么是僵尸进程?

一个子进程结束后,它的父进程并无等待它(调用wait或者waitpid),那么这个子进程将成为一个僵尸进程。僵尸进程是一个已经死亡的进程,可是并无真正被销毁。它已经放弃了几乎全部内存空间,没有任何可执行代码,也不能被调度,仅仅在进程表中保留一个位置,记载该进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)供父进程收集,除此以外,僵尸进程再也不占有任何内存空间。这个僵尸进程可能会一直留在系统中直到系统重启。

危害:占用进程号,而系统所能使用的进程号是有限的;占用内存。

如下状况不会产生僵尸进程:

  • 该进程的父进程先结束了。每一个进程结束的时候,系统都会扫描是否存在子进程,若是有则用Init进程接管,成为该进程的父进程,而且会调用wait等待其结束。
  • 父进程调用wait或者waitpid等待子进程结束(须要每隔一段时间查询子进程是否结束)。wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。waitpid则能够加入WNOHANG(wait-no-hang)选项,若是没有发现结束的子进程,就会当即返回,不会将调用waitpid的进程阻塞。同时,waitpid还能够选择是等待任一子进程(同wait),仍是等待指定pid的子进程,仍是等待同一进程组下的任一子进程,仍是等待组ID等于pid的任一子进程;
  • 子进程结束时,系统会产生SIGCHLD(signal-child)信号,能够注册一个信号处理函数,在该函数中调用waitpid,等待全部结束的子进程(注意:通常都须要循环调用waitpid,由于在信号处理函数开始执行以前,可能已经有多个子进程结束了,而信号处理函数只执行一次,因此要循环调用将全部结束的子进程回收);
  • 也能够用signal(SIGCLD, SIG_IGN)(signal-ignore)通知内核,表示忽略SIGCHLD信号,那么子进程结束后,内核会进行回收。

什么是孤儿进程?

一个父进程已经结束了,可是它的子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程会被Init(进程ID为1)接管,当这些孤儿进程结束时由Init完成状态收集工做。

进程的异常控制流:陷阱、中断、异常和信号

陷阱是有意形成的“异常”,是执行一条指令的结果。陷阱是同步的。陷阱的主要做用是实现系统调用。好比,进程能够执行 syscall n 指令向内核请求服务。当进程执行这条指令后,会中断当前的控制流,陷入到内核态,执行相应的系统调用。内核的处理程序在执行结束后,会将结果返回给进程,同时退回到用户态。进程此时继续执行下一条指令

中断由处理器外部硬件产生,不是执行某条指令的结果,也没法预测发生时机。因为中断独立于当前执行的程序,所以中断是异步事件。中断包括 I/O 设备发出的 I/O 中断、各类定时器引发的时钟中断、调试程序中设置的断点等引发的调试中断等。

异常是一种错误状况,是执行当前指令的结果,可能被错误处理程序修正,也可能直接终止应用程序。异常是同步的。这里特指由于执行当前指令而产生的错误状况,好比除法异常、缺页异常等。有些书上为了区分,也将这类“异常”称为**“故障”**。

信号是一种更高层的软件形式的异常,一样会中断进程的控制流,能够由进程进行处理。一个信号表明了一个消息。信号的做用是用来通知进程发生了某种系统事件。

死锁

致使死锁的四个必要条件

1)互斥。一次只有一个进程可使用一个资源。其余进程不能访问已分配给其余进程的资源。

2)占有并等待。当一个进程等待其余进程时,继续占有已经分配的资源。

3)不可抢占。不能强行抢占进程已占有的资源。

4)循环等待。存在一个封闭的进程链,使得每一个进程至少占有此链中下一个进程所须要的一个资源。

内存管理 参考