操作系统常见面试题

操作系统常见面试题

概述

什么是操作系统

操作系统是一种特殊的软件,层次位于硬件之上,应用程序之下,为应用软件提供服务支撑。

什么是内核

内核是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等。是连接应用程序和硬件的桥梁。

操作系统的功能

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

操作系统的特点(并共虚异)

  1. 并发:同一段时间内多个程序执行
  2. 共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
  3. 虚拟:操作系统将硬件中的CPU虚拟化成进程,磁盘虚拟化为文件、内存虚拟化为地址空间,通过这种方式能够将一台物理机器虚拟为多台机器,让每个用户都觉得有一个计算机专门为他服务
  4. 异步:程序的执行不是一贯到底,而是走走停停的,但只要运行环境相同,就能保证程序运行的结果也相同

操作系统的演变过程

  • 无操作系统:人工操作,用户独占,CPU等待人工操作,资源利用率很低。
  • 批处理系统:批量输入任务,无需等待人工操作。
  • 多道程序设计:是指在计算机内存中同时存放多个程序,在计算机的管理程序之下相互穿插运行。
  • 分时系统:将系统处理机时间与内存空间按一定的时间间隔(如千分之一秒)划分时间片,采用轮转运行方式轮流地切换给各终端用户的程序使用,实现了多用户共享和人机交互。Linux系统就是一种典型的分时系统

进程与线程

进程和线程的区别

  • 调度:进程是资源管理的基本单位,线程是程序执行的基本单位。
  • 拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
  • 切换:线程上下文切换比进程上下文切换要快得多。

为什么有了进程,还需要线程

进程可以使多个程序并发执行,但仍然存在一些缺点:

  1. 进程在同一时间只能干一件事情;

  2. 进程在执行的过程中如果阻塞,整个进程就会被挂起,即使进程中有些工作不依赖与等待的资源,仍然不会执行。

因此操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时间和空间开销,提高并发性能

线程的分类

  • 内核级线程:创建、撤销和切换都依赖于内核实现。
  • 用户级线程:它仅存在于用户级中,不依赖于操作系统核心的,而是利用线程库来完成其创建和管理,速度比较快,而且额操作系统内核是无法感知用户级线程的存在。

进程与程序的区别

  • 进程是动态的,具有一定的生命周期,而程序是静态的;
  • 一个程序可以对应多个进程,但一个进程只能对应一个程序。
  • 进程和程序的组成不同。从静态角度看,进程由程序、数据和进程控制块(PCB)三部分组成,而程序是一组有序的指令集合。

协程与线程的区别

  • 线程和进程都是同步机制,而协程是异步机制。
  • 线程是抢占式,而协程是非抢占式的。需要用户释放使用权才能切换到其他协程。
  • 线程和进程都由操作系统内核管理,而协程是由程序控制的。
  • 协程能够保留上一次调用的状态

进程有哪些状态

  • 创建状态:资源尚未就绪
  • 就绪状态:进程获得了除CPU之外的一切所需资源,一旦得到CPU即可运行
  • 执行状态:进程正在CPU上运行
  • 阻塞状态:进程正在等待某一事件而暂停运行,比如等待某资源为可用或等待I/O操作完成
  • 终止状态:进程结束由系统清理或者归还PCB的状态

进程调度策略有哪几种

  • 先到先服务:非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。另外,对I/O密集型进程也不利,因为这种进程每次进行I/O操作之后又得重新排队。

  • 短作业优先:非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

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

  • 时间片轮转:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

    时间片轮转算法的效率和时间片的大小有很大关系:因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。 而如果时间片过长,那么实时性就不能得到保证。

  • 优先级调度:为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

并发和并行

  • 并发是指在一段时间内可以处理多个任务,但在某一时刻,只有一个任务在执行
    单核处理器可以做到并发。比如有两个进程ABA运行一个时间片之后,切换到BB运行一个时间片之后又切换到A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
  • 并行就是在同一时刻有多个任务在执行,需要多核处理器才能完成。

同步与异步

  • 同步:指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
  • 异步 :指进程不需要一直等待下去,而是继续执行下面的操作,当请求完成后会返回信息通知进程进行处理

阻塞与非阻塞

  • 阻塞 :结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  • 非阻塞 :是指即使调用结果没返回,也不会阻塞当前线程。

阻塞和非阻塞的概念与程序(线程)等待消息通知时的状态有关,而同步与异步是关注的是消息通知的机制

进程与线程的切换流程

进程切换分两步:

1、切换页表以使用新的地址空间,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。

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

线程切换不涉及虚拟地址空间的转换,即第1步是不需要做的,第2步是进程和线程切换都要做的。

为什么线程切换比进程切换快

每个进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,而页表查找是一个很慢的过程,通常的使用Cache来缓存常用的地址映射,来加速页表查找。

当进程切换后,原本的Cache缓存就失效了,这样就导致虚拟地址到物理地址的转换变慢。而线程切换不需要切换地址空间,不会导致Cache失效,所以线程切换比进程切换快

进程间的通信方式(IPC)

什么是通信:通信就是数据传输,数据存在两块不同的内存区域。通过某种方式互相传递

  • 管道:管道可以分为匿名管道和命名管道。匿名管道是单向的,只能在有亲缘关系的进程间通信;命名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

  • 信号 : 信号可以在任何时候发给某一进程,而无需知道该进程的状态。

  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

  • 消息队列:消息队列是消息的链接表,克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

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

  • Socket:可用于不同机器间的进程通信。

优缺点:

  • 管道:速度慢,容量有限;

  • Socket:任何进程间都能通讯,但速度慢;

  • 消息队列:容量有限,且要第一次读的时候要考虑上一次没有读完数据的问题;

  • 信号量:不能传递复杂信息,只能用来同步;

  • 共享内存区:能够很容易控制容量,速度快,但要保持同步。

进程 / 线程间的同步方式

什么是同步:同步就是数据保持一致,无论是进程还是线程,都是实现了代码执行流程的分支,多个分支同时进行。多个分支互不干扰,但是又有些数据需要共享,让这些数据对所有分支保持一致即为同步

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

    在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

  • 互斥量:只有拥有互斥对象的线程才具有访问资源的权限。

    因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享

  • 信号量:允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

    互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了

  • 事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .

什么是临界区,如何解决冲突

临界资源是指一次仅允许一个进程访问的共享资源,比如打印机,消息队列,变量,数组,缓冲区。每个进程中访问临界资源的那段程序称为临界区

解决冲突的办法:

  • 若有若干进程要求进入空闲临界区,一次仅允许一个进程进入
  • 若已有进程进入临界区,其他进程必须等待
  • 进入临界区的进程必须在有限时间内退出
  • 如果进程不能进入临界区,则必须让出CPU

死锁及其产生的条件,如何处理死锁

在两个或者多个并发进程中,如果每个进程持有某种资源,又等待其他进程释放它目前持有的资源,在未改变这种状态之前,都不能向前推进的情况情况被称作死锁。

死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)

  • 互斥条件:一个资源一次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对自身拥有的资源保持不放
  • 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系

如何处理死锁问题

  • 预防死锁:通过破除死锁四个必要条件之一,来防止死锁产生
  • 避免死锁:动态检测资源分配状态,确保循环等待条件不成立,使系统处于安全状态
  • 解决死锁:包括进程终止和资源抢占

存储管理

什么是虚拟内存

虚拟内存是指将物理主存扩展到磁盘外存这一容量更大、单位存储成本更低的存储介质上,使主存在某种程度上成为了磁盘的缓存

什么是分页

分页机制的核心在于将物理内存与虚拟内存划分为大小相等且固定的块,作为主存的基本单位。同时使用页表来记录页号到物理块号的映射关系

什么是分段

分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。

在分段内存管理中,程序的地址空间被若干段,如代码段、数据段、堆栈段,其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。每个进程有一个二维地址空间,一维是段号,二维是段内地址

分页和分段的区别

  • 目的不同:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段是由于用户的需要,需要程序员显式划分每个段。
  • 大小不同:页的大小固定;段的大小可以动态改变
  • 地址空间不同:分页的地址空间是一维地址空间;分段是二维的
  • 信息共享:页的保护和共享收到限制;段利于存储保护和信息共享
  • 内存碎片:分页没有外碎片,但有内碎片;分段没有内碎片,但有外碎片

什么是交换空间

当内存资源不足时,操作系统会把某些页的内容转移至硬盘上的一块空间上,以释放内存空间。硬盘上的那块空间叫做交换空间(swap space),而这一过程被称为交换(swapping)。

物理内存和交换空间的总容量就是虚拟内存的可用容量。

用途:

  • 物理内存不足时一些不常用的页可以被交换出去,腾给系统。
  • 程序启动时很多内存页被用来初始化,之后便不再需要,可以交换出去。

页面替换算法有哪些

在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。

  • 最优页面置换算法:选择未来最长时间不访问的页面进行置换。是理想情况,在实际系统中无法实现,但是可以作为评价其他置换算法性能的依据
  • 先进先出:选择在内存中驻留时间最长的页面进行置换
  • LRU最近最久未使用算法:选择最长时间没有被引用的页面进行置换,该算法依据的是过去使用情况,对比与最优算法考虑的是未来的使用情况。
  • 时钟置换算法:时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。它将整个环形链表的每一个页面做一个标记,如果标记是0,那么暂时就不会被替换,然后时钟算法遍历整个环,遇到标记为1的就替换,否则将标记为0的标记为1

缓冲区溢出及其危害

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。

危害:

  • 程序崩溃,导致拒绝服务
  • 跳转并且执行一段恶意代码

其他

动态链接和静态链接

  • 静态链接是指把要调用的函数或者过程链接到可执行文件中,这样文件包含了运行时所需的全部代码

    优点是程序可以独立执行,缺点是体积可能会相对大一些。

  • 动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,再由操作系统才转去执行动态链接库中相应的函数代码。

    优点是多个程序可以共享同一段代码,缺点是由于是运行时加载,可能会影响程序的前期执行性能

中断和轮询的区别

  • 轮询:CPU对特定设备轮流询问,效率低等待时间长,CPU利用率不高。
  • 中断:通过特定事件提醒CPU,容易遗漏问题,CPU利用率不高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值