面试-操作系统



1、什么是进程、线程?及区别?

进程:正在进行的一个过程,即正在运行的程序,一个程序进入内存运行,就变成一个进程,进程由一组机器指令,数据,堆栈组成,它拥有自己独立的空间和资源,从用户角度看:进程是程序的一次动态执行的过程,从操作系统的角度看:进程是系统进行资源调度和分配的基本单位。
线程:线程是进程的一个执行单元,负责当前进程中程序的执行,它是CPU调度和分派的基本单位,线程基本上不拥有系统的资源,除了一些必不可少的资源(如程序计数器,一组寄存器和栈),它可以共享所属进程的资源。
区别

  1. 调度性:进程在操作系统中作为资源分配的基本单位,而线程作为调度和分派的基本单位;
  2. 并发性:进程可以并发执行,一个进程的多个线程也可以并发执行;
  3. 拥有资源:进程始终是拥有资源的基本单位,线程只拥有运行时必不可少的资源,本身不拥有系统资源,但可以共享隶属进程的资源;
  4. 系统开销:操作系统在创建、撤销、切换进程时付出的开销显著大于线程;

2、引入进线程的目的?

引入进程的目的是为了能让多个程序并发执行
引入线程的目的是为了提高并发率

3、进程实体有哪几部分组成?

程序段、相关的数据段、PCB组成;

4、PCB(进程控制块)的作用?

PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构。作用是使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,成为能与其它进程并发执行的进程。OS是根据PCB对并发执行的进程进行控制和管理的。

5、进程的三种状态及转换的原因?

在这里插入图片描述

6、操作系统的三个基本类型

多道批处理系统、分时系统、实时系统

7、操作系统的概念及基本特征

概念:操作系统是一组控制和管理计算机硬件和软件资源,合理的对各类作业进行调度的、以及方便用户使用的程序集合。
基本特征

  1. 并发:同一时间段内多个程序执行
  2. 共享:系统中的资源可以被内存中多个并发的进程,线程共同使用
  3. 虚拟:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现将一个物理实体虚拟为多个
  4. 异步:系统中的进程是以一种走走停停的方式执行的,且以一种不可预知的速度推进。

8、并发与并行,及区别?

并发:在多道程序环境下,两个或多个事件,任务在同一时间间隔内发生;
并行:指两个或多个事件在同一时刻发生;

9、虚拟内存

虚拟内存是计算机系统内存管理的一种技术,它使得应用程序认为它拥有连续可用的内存空间,而实际上它通常被分隔为多个物理内存碎片,还有一部分存放在外部磁盘存储器上,在需要的时候进行置换。

10、操作系统的主要功能

  • 处理机管理:处理机分配都是以进程为单位,所以处理机管理也被看做是进程管理。包括进程控制,进程同步,进程通信和进程调度
  • 存储器管理(或者内存管理):内存分配,内存保护,地址映射,内存扩充
  • 设备管理:管理所有外围设备,包括完成用户的IO请求;为用户进程分配IO设备;提高IO设备利用率;提高IO速度;方便IO的使用
  • 文件管理:管理用户文件和系统文件,方便使用同时保证安全性。包括:磁盘存储空间管理,目录管理,文件读写管理以及文件共享和保护
  • 提供用户接口:程序接口(如API)和用户接口(如GUI)

11、进程间的通信方式

  • 管道(pipe)及命名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  • 信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  • 消息队列:消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息;
  • 共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;
  • 信号量:主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段;
  • 套接字:这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

12、进程的同步方式

原子操作、信号量机制、自旋锁管程、会合、分布式系统

13、线程的同步方式

  • 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

  • 互斥量 :为协调对一个共享资源的单独访问而设计,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

  • 信号量:为控制一个具有有限数量的用户资源而设计。它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

  • 事件(信号):用来通知线程有一些事件已发生,从而启动后继任务的开始保持多线程同步,也可方便的实现多线程优先级的比较操作

14、什么是缓冲区溢出?有什么危害?其原因是什么?

缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

造成缓冲区溢出的主原因是程序中没有仔细检查用户输入的参数。

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

死锁概念

所谓死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。

产生死锁的四个必要条件

  1. 互斥条件:一个资源只能被互斥的使用,其他进程申请该资源,只有等到该资源被其他进程释放才能使用;
  2. 请求与保持条件:进程在请求资源时,被阻塞了,自身所持有的资源不会被释放;
  3. 不可剥夺条件:进程已获得的资源在未使用完之前,不可强行剥夺;
  4. 循环等待条件:若干进程之间形成一种头尾相接等待资源的关系;

死锁的解除与预防

(1)死锁预防的思想:就是确保产生死锁的四个条件中至少有一个条件不成立,死锁就不会产生。

  • 互斥条件破坏,我们本身就是要确保资源被互斥的使用;
  • 破坏请求与保持条件:每次在分配资源时,一次性分配进程需要的全部资源,如果资源不足,则不分配;这种方式的缺点就是需要预先知道进程所需的资源,但大多数情况下,无法预知进程所需的资源,因为进程是动态执行的,降低了系统资源的利用率,降低了进程的并发性;
  • 破坏请求与保持条件:分配资源时,如果分配不到满足的全部资源,则将已经分配的资源释放,给其他进程使用;
  • 破坏循环等待条件:对资源进行编号,每次申请资源只能从小的编号然后以递增的顺序开始申请资源,这样就不会产生回路,预防了死锁;

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

    银行家算法:该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。这样申请者就可以很快完成其计算,然后释放它占用的资源,从而保证了系统中所有进程都能完成,所以可避免死锁的发生。

16、页面置换算法

最佳置换算法OPT:只具有理论意义的算法,用来评价其他页面置换算法。置换策略是将当前页面中在未来最长时间内不会被访问的页置换出去。

先进先出置换算法FIFO:简单粗暴的一种置换算法,没有考虑页面访问频率信息。每次淘汰最早调入的页面。

最近最久未使用算法LRU:算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。

时钟算法clock(也被称为是最近未使用算法NRU):页面设置一个访问位,并将页面链接为一个环形队列,页面被访问的时候访问位设置为1。页面置换的时候,如果当前指针所指页面访问为为0,那么置换,否则将其置为0,循环直到遇到一个访问为位0的页面。

改进型Clock算法:在Clock算法的基础上添加一个修改位,替换时根究访问位和修改位综合判断。优先替换访问位和修改位都是0的页面,其次是访问位为0修改位为1的页面。

LFU最少使用算法LFU:设置寄存器记录页面被访问次数,每次置换的时候置换当前访问次数最少的。

17、操作系统中进程调度策略有哪几种?

  • 先来先服务调度算法FCFS:队列实现,非抢占,先请求CPU的进程先分配到CPU,可以作为作业调度算法也可以作为进程调度算法;按作业或者进程到达的先后顺序依次调度,对于长作业比较有利;

  • 最短作业优先调度算法SJF:作业调度算法,算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行,平均等待时间最短,但难以知道下一个CPU区间长度;缺点:不利于长作业;未考虑作业的重要性;运行时间是预估的,并不靠谱 ;

  • 优先级调度算法(可以是抢占的,也可以是非抢占的):优先级越高越先分配到CPU,相同优先级先到先服务,存在的主要问题是:低优先级进程无穷等待CPU,会导致无穷阻塞或饥饿;

  • 时间片轮转调度算法(可抢占的):按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;队列中没有进程被分配超过一个时间片的CPU时间,除非它是唯一可运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就被抢占并放回就绪队列。

  • 高响应比算法HRN:响应比=(等待时间+要求服务时间)/要求服务时间;

  • 多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。

  • 多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。与多级队列调度算法相比,其允许进程在队列之间移动:若进程使用过多CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。

18、IO中同步与异步,阻塞与非阻塞区别

同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)
同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。


更多:
https://blog.csdn.net/c_philadd/article/details/107905305
https://blog.csdn.net/xiongluo0628/article/details/81461053
https://blog.csdn.net/justloveyou_/article/details/78304294

相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页