操作系统笔试面试要点

一.大纲

1.什么是操作系统
2.线程和进程
3.内存管理
4.调度
5.临界区和临界冲突的解决
6.7种IPC方式
7.死锁,产生原因以及处理办法
8.进程间同步与互斥的区别,线程同步的方式
9.常见的进程调度算法
10.实时系统的基本特性

参考博文:
https://blog.csdn.net/xiongluo0628/article/details/81461053
https://blog.csdn.net/FanceFu/article/details/79357048
https://blog.csdn.net/qq_38998213/article/details/87899231
https://blog.csdn.net/youngchang06hpu/article/details/8009947

1.什么是操作系统:

操作系统是计算机硬件和用户交互的桥梁,是管理计算机硬件资源和软件资源的程序

2.进程和线程:

进程:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是操作系统进行资源分配和调度的一个独立单位.,是多道程序设计技术的产物,用来提升操作系统的效率,实现宏观意义上的并行。

线程:
线程是进程的一个实体**,是CPU调度和分派的基本单位**,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源 (如程序计数器,一组寄存器和栈) ,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

进程和线程的区别和联系:

联系:
线程是进程的的具体化,一个进程可以创建或者撤销多个线程。
多个线程可以并发执行,共享进程中的数据,但各自拥有自己独立栈空间,程序计数器和存储的上下文。

区别:
在这里插入图片描述

总结:
1.线程开销小而进程开销大
2.一个程序至少有一个进程,一个进程至少有一个线程
3.进程可以随着程序的需要随时创建和销毁,但只要有一个线程崩溃,那么进程也会崩溃

3.内存管理

1.虚拟内存(最适合用来管理大型对象或者结构数组 ):
每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一 页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

2.内存映射文件(最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据 ):
内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

3.内存堆栈(最适合用来管理大量的小对象)

4.调度

1.优先权优先:

  • 手动赋予优先权
  • 将响应比作为优先权(高响应比优先调度算法)

2.时间表轮转法:
将所有就绪进程按 FIFO 的原则排成一个队列,每次调度时,把 CPU 分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 分配给队首的进程。
时间片轮转算法的效率和时间片有很大关系。因为每次进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太短,进程切换太频繁,在进程切换上就会花过多时间。

3.多级反馈队列:
① 设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权越高的队列中,为每个进程所规定的执行时间片就越小。
② 当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入下一个队列的队尾。

4.临界区和临界冲突的解决

一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等
对临界资源进行访问的那段代码称为临界区。
解决方案:
为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查,确保每次只有一个进程进入临界区,如已有进程进入自己的临界区,则其他试图进入临界区的进程必须等待。进入临界区的进程要在有限时间内退出,以便其他进程能及时进入自己的临界区。如果不能进入自己的临界区,就应该让出CPU,避免进程出现忙等等现象。

5. 进程间的通讯方式

1.管道:允许父子进程间通讯
2.命名管道:允许无关系的进程间通讯
3.信号:通知接收进程某一实践已经发生,类似广播
4.信号量:通常作为一种标识符,例如锁
5.消息队列:消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识
6.共享内存:由一个进程创建,别的进程也可以访问的一段内存
7.套接字:套接口也是进程间的通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。

优缺点对比:
管道:速度慢、容量有限
消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
信号量:不能传递复杂信息,只能用来同步。
共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。

6.线程间通讯方式

线程间通讯方式共分为两种模型:共享内存消息传递

1.使用 volatile 关键字(共享内存):多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务
2.使用wait()和notify()方法:Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础, wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁
3.管道

7.死锁,产生原因以及处理办法

死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁产生的四个必要条件:
1.互斥条件:一个资源每次只能被一个进程使用
2.不可剥夺条件:进程已获得资源,在未使用完之前,不能被其他进程强行剥夺,只能主动释放
3.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4.循环等待条件:即进程集合{p0,p1,p2,p3……pn};p0正在等待p1占用的资源,p1正在等待p2占用的资源,pn正在等待p0占用的资源。
只要上述一个条件不成立,就不会发生死锁。

处理办法:银行家算法,可以参考这篇文章 一句话+一张图说清楚——银行家算法

8.进程间同步与互斥的区别及线程同步的方式

互斥(排他性): 某个资源只允许同一时间内只有一个进程对其访问,但并不能限制其访问顺序/某一时刻某两个进程不能同时运行
同步(协作性): 在大多数情况下,在互斥的基础上通过一些机制实现进程的有序访问,少数情况下,允许多个进程同时访问
同步机制遵循的原则
 1.空闲让进;
 2.忙则等待;
 3.有限等待;
 4.让权等待;

9.线程同步的方式:

临界区互斥量信号量事件
  
  临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。
  互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问。
  信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象与其他前面几种方法不同,信号允许多个线程同时使用共享资源。
  事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便实现多线程的优先级比较操作。
  对比:
在这里插入图片描述

10.进程的同步的方法:

**自旋锁:**在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

**管程:**进程只能互斥得使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。
在管程入口处的等待队列称为入口等待队列,由于进程会执行唤醒操作,因此可能有多个等待使用管程的队列,这样的队列称为紧急队列,它的优先级高于等待队列。

11.常见的进程调度算法

轮询和中断:
轮询效率低,等待时间很长,CPU利用率不高;中断容易遗漏一些问题,CPU利用率高。

1.先来先服务(FCFS): 此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序选择作业(或进程)
  
2.短作业优先(SJF:Shortest Process First): 这种算法主要用于作业调度,它从作业后备序列中挑选所需运行时间最短的作业进入主存运行。

3.时间片轮转调度算法: 将所有就绪进程按 FIFO 的原则排成一个队列,每次调度时,把 CPU 分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 分配给队首的进程。
时间片轮转算法的效率和时间片有很大关系。因为每次进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太短,进程切换太频繁,在进程切换上就会花过多时间。

4.高响应比优先: 按照高响应比(已等待时间+要求运行时间)/要求运行时间 优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP。选择最大的作业投入运行。

5.优先权调度算法: 按照进程的优先权大小来调度。使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。

6.多级队列调度算法:
  ① 设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权越高的队列中,为每个进程所规定的执行时间片就越小。
② 当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入下一个队列的队尾。

12.实时系统的基本特性

在特定时间内完成特定的任务,实时性与可靠性。
所谓“实时操作系统”,实际上是指操作系统工作时,其各种资源可以根据需要随时进行动态分配。由于各种资源可以进行动态分配,因此,其处理事务的能力较强、速度较快。

发布了47 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41525021/article/details/100109553