问题整理自cyc大佬的专栏。
推荐付费阅读他的其他文章,很有收获。另外大佬的GitHub内容也非常有用。
部分答案整理自网络,点击蓝字可以查看原链接。蓝字都是可以点进去的。
面试的主要内容:
本文主要整理操作系统及Linux的常见问题。
一 操作系统
1 ★★★ 进程与线程的本质区别、以及各自的使用场景。
进程:
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。
在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。
进程不足:
-
进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
-
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
因为要并发,我们发明了进程,又进一步发明了线程。只不过进程和线程的并发层次不同:进程属于在处理器这一层上提供的抽象;线程则属于在进程这个层次上再提供了一层并发的抽象。还可以有效地利用多处理器和多核计算机。
区别:
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
- 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
- 线程缺乏访问控制,进程中的一个线程出错,会终止掉整个进程。
- 切换的效率,复杂度也不同。
2 ★☆☆ 进程状态
- 创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态 (前期准备)
- 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行(万事俱备,只欠东风)
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态 (东风已来)
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用 (风暂时停)
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行 (战争结束)
如果进程运行时间片使用完也会进入就绪状态。
另外为用户观察需要,进程还有挂起和激活两种操作。挂起后进程处于静止状态进程不再被系统调用,对于操作是激活操作。
3 ★★★ 进程调度算法的特点以及使用场景。优缺点比较。
先来先去服务(FCFS: first come first service) : 总是把当前处于就绪队列之首的那个进程调度到运行状态。
非抢占式
- 优点:有利于长作业以及CPU繁忙的作业
- 缺点:不利于短作业以及I/O繁忙的作业
短作业(进程)优先调度算法SJ(P)F:对预计执行时间短的作业(进程)优先分派处理机.通常后来的短作业不抢先正在执行的作业.
- 优点:比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;提高系统的吞吐量;
- 缺点:对长作业非常不利,可能长时间得不到执行;未能依据作业的紧迫程度来划分执行的优先级;难以准确估计作业(进程)的执行时间,从而影响调度性能。
轮转法(RR调度算法):让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。常被用于批处理系统中,还可用于实时系统中。
多级反馈队列算法:设置多个就绪队列,分别赋予不同的优先级
高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。
3 ★☆☆ 线程实现的方式
待补充
4 ★★☆ 协程的作用
协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,
而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显
不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程 ,对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。
5 ★★☆ 常见进程同步问题。
生产者与消费者问题
问题描述:一组生产者进程和一组消费者进程共享一块初始为空,大小确定的缓冲区,该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。常采用进程间通信的方法解决该问题,
问题分析:生产者与消费者进程对缓冲区的访问是互斥关系,而生产者与消费者本身又存在同步关系,即必须生成之后才能消费。因而对于缓冲区的访问设置一个互斥量,再设置两个信号量一个记录空闲缓冲区单元,一个记录满缓冲区单元来实现生产者与消费者的同步。
读者与写者问题
问题描述:有读者与写者两个并发进程共享一个数据,两个或以上的读进程可以访问数据,但是一个写者进程访问数据与其他进程都互斥。
问题分析:读者与写者是互斥关系,写者与写者是互斥关系