操作系统面试题总结

1 . 系统调用

用户态和系统态是操作系统的两种运行级别,内核态权限高,用户态权限低。
切换到内核的方式有:系统调用、发生异常、外围设备的中断。

  • 用户态:用户态运行的进程
  • 系统态:系统态运行的进程几乎可以访问计算机的任何资源,不受限制。
  • 我们所运行的程序基本都是运行在用户态,而与系统态级别相关的操作(文件管理,进程控制,内存管理)都必须系统调用的方式向系统提供请求。
  • 系统调用分为以下几类:
    设备管理。完成设备的请求或释放,以及设备启动等功能。
    文件管理。完成文件的读、写、创建及删除等功能。
    进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
    进程通信。完成进程之间的消息传递或信号传递等功能。
    内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
1. 并发和并行

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是使多个进程快速交替的执行。

2. 进程和线程的区别

这里我以java为例将进程与线程的区别:

  • 首先,进程是一个程序运行的实例,是一个资源分配的基本单位,而线程是程序独立运行的最小单位
  • 从资源方面看,进程有自己独立的寻址空间,而且一个进程可以有多个线程,多个线程共享进程的堆和方法区(JDK1.8后的元空间),但是每个线程也有自己的程序计数器、虚拟机栈、本地方法栈
  • 从安全性和健壮性方面比较,进程间是相互独立的,一个进程死掉不会影响其他的进程,而在多线程环境下,线程间极有可能相互影响,可能会存在死锁,线程不安全的情况。
  • 从系统开销方面看,由于线程资源共享,使用相同的地址空间,因此线程切换的系统开销小,但不利于资源的管理和保护,进程则相反。
  • 在通信方面,线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的呢?

  • 程序计数器私有是为了在多线程的情况下线程切换后能回到正确的执行位置。
  • 在方法执行时会创建一个栈帧,用于存储局部变量表,操作数栈和常量池引用,方法的创建到执行完毕的过程对应着栈的入栈出栈过程。虚拟机栈和本地方法栈私有是保证线程中的局部变量不被别的线程访问到。
  • 堆是线程中最大的一块内存,主要存放新建的内存;方法区主要存放已被加载的类信息、常量、静态变量和编译后的代码块。他们都是线程需要共享的资源。
3. 进程有哪几种状态
  1. 初始状态(new): 进程正在被创建,尚未进入就绪状态
  2. 就绪状态(ready): 进入准备运行状态,已经获得了除cpu以外的一切资源,等待分配到cpu时间片即可运行。
  3. 运行状态(running): 进程在cpu上运行
  4. 阻塞状态(wating): 进程等待某一事件或某一资源而暂停运行
  5. 结束状态(terminated): 进程正常结束或因为其他原因中断退出运行

对比java线程的状态:
在这里插入图片描述

4.进程间的通信方式
  1. 无名管道: 半双工,数据只能在一个方向流动,只存在于内存中,只能用于父子进程和兄弟进程间。
  2. 有名管道:半双工,以磁盘文件的形式存在,严格遵循先入先出原则(FIFO),数据读出时,FIFO管道同时清除数据,可实现本机任意进程间的通信。
  3. 信号:是一种较为复杂的通信方式,用于通知接收进程某一事件已经发生。
  4. 消息队列:是消息的链表,具有特定的格式,放在内存中并由消息队列标识符标识,它克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限的缺陷。 它可以根据自定义条件接收特定类型的消息,不一定要以先进先出的原则读取数据。
  5. 信号量:是一个计数器,用于多进程间共享数据的访问。用于实现进程间的同步。
  6. 共享内存:可以使多个进程访问同一块内存空间,它是最快的通信方式,通常它需要依靠某种同步操作,如互斥锁,信号量实现进程间的同步。
  7. 套接字:是用于客户端与服务器之间通过网络进行通信的一种机制,它是双方通信的一种约定,可以用套接字的相关函数完成通信。
5. 线程间同步的方式
  1. 锁机制:
    互斥锁:以排他的方式防止数据被并发修改的方法
    读写锁:允许多个线程同时读共享数据,但对写操作互斥
    条件变量:以原子的方式阻塞进程,直到某个条件为真为止,条件变量常与互斥锁一起使用

  2. 信号量:允许同一时刻多个线程访问同一资源,但要控制同一时刻访问此资源的最大线程量

  3. 事件:(wait/notify)通过通知的方式来保持多线程同步,也可以方便实现多线程的比较操作

6. 进程调度算法:
  1. 先来先服务(FCFS,First-Come-First-Served):按照进程进入就绪队列的先后次序来选择进程。
  2. 短作业优先(SJF,Shortest Process First):从就绪队列中选择估计运行时间最短的进程为之分配资源
  3. 时间片轮转调度:首先将进程按 FCFS 的原则放在就绪队列中,给每个进程分配一个时间片,即该进程运行的时间,每次调度时,把 CPU 时间片分配给队首,当一个进程的时间片用完时,将它放入就绪队列队尾,再把cpu时间片分配给队首进程。
  4. 优先级调度:按照进程优先级大小来调度,高优先级的进程先执行。
  5. 高响应比优先调度:选择就绪队列中响应比高的进程先调度。响应比=(等待时间+要求运行时间)/要求运行时间
  6. 多级反馈队列调度:看成是时间片轮转调度算法和优先级调度算法的结合。它满足多种类型进程的要求,既能使高优先级作业得到响应,又能使短作业得到迅速完成,是公认的一种比较好的调度算法。
7. 操作系统内存管理

操作系统的内存管理主要负责内存的分配与回收,以及地址转换(将逻辑地址转换为相应物理地址)
内存管理方式:

连续分配管理方式:给一个进程分配连续的内存空间

  1. 块式管理:将内存分为固定大小的块,每个块中只包含一个进程,程序运行时,进程一次性全部加载到内存中,如果进程只需很小空间则会造成内存浪费,并且产生内存碎片,如果进程太大则无法运行。

非连续分配管理方式:允许一个进程所占用的内存分布在离散的内存空间中

  1. 页式管理:将虚拟地址空间划分为固定相等大小的页,同时内存空间也相应划分为大小相等的块,系统维护了一个页表,用来实现由页号到物理块号的地址映射。可将程序的任一页放在物理内存的任一块中,即分配的内存块之间不一定连续。它提高了内存利用率,减少了内存碎片
  2. 段式管理:把地址空间划分为若干大小不等的段,每段空间比页小很多,相比于页,它是有实际意义的,每段定义了一组逻辑信息,如主程序段main,子程序段x,数据段D,栈段S等。另外,段在内存中也是离散分配的
  3. 段页式管理:结合了段式管理和页式管理的优点,将地址空间分为若干逻辑分段,每段又分为大小相等的若干页,对于内存空间也划分为大小相等的页。

比喻:

打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。

第一种是,你从本子的第一张纸开始用,并且事先在本子上做划分:第2张到第30张纸记语文笔记,第31到60张纸记数学笔记,第61到100张纸记英语笔记,最后在第一张纸做个列表,记录着三门笔记各自的范围。这就是分段管理,第一张纸叫段表。

第二种是,你从第二张纸开始做笔记,各种课的笔记是连在一起的:第2张纸是数学,第3张是语文,第4张英语……最后呢,你在第一张纸做了一个目录,记录着语文笔记在第3、7、14、15张纸……,数学笔记在第2、6、8、9、11……,英语笔记在第4、5、12……。这就是分页管理,第一张纸叫页表。你要复习哪一门课,就到页表里查寻相关的纸的编号,然后翻到那一页去复习

8. 快表和多级页表

多级页表:为了提高内存的空间性能,引入多级页表,避免把全部页表一直放在内存中占用过多的空间,把不需要用到的页表不保存在内存中,以牺牲时间性能换取空间性能。
快表:为了提高时间性能,提出快表概念,它实质上是一个高速缓冲存储器,其中的内容是页表的一部分内容,快表的作用与页表相似,但是提高了访问效率。

9. 分页机制和分段机制共同点和区别

共同点:

  • 都是为了提高内存利用率,较少内存碎片
  • 页和段都是离散存储的,但每个页和段中的内存是连续的

区别:

  • 页是信息的物理单位,分页是为了解决内存碎片问题,或者说分页是由于系统管理的需要.
  • 段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地满足用户的需要.
  • 页的大小固定,由系统确定,将逻辑地址划分为页号和页内地址,是由机器硬件实现的.
  • 而段的长度却不固定,决定于用户所编写的程序,编译时根据信息的性质来划分.
10. 为什么需要虚拟地址空间

逻辑地址和物理地址的区别:我们一般的编程都是和逻辑地址打交道,比如说C语言中指针存储的数值就是逻辑地址和,它由操作系统决定。物理地址是内存地址寄存器中的地址,是内存单元真正的地址。
首先虚拟寻址的概念是:cpu通过内存管理单元(MMU)将虚拟地址转换为物理地址。

  • 如果没有虚拟地址空间,程序都是直接访问和操作物理内存,直接把物理地址暴露出来会造成很多严重的问题:
    比如说,用户程序可以访问任意内存,容易破坏操作系统,造成系统崩溃。
    另外,同时运行多个程序会出错,比如一个程序给一个内存地址赋值后,另一程序同样给这一内存赋值,会造成数据覆盖,可能会出现程序崩溃。
  • 而通过虚拟地址空间,它可以有很多好处。
  • 程序可以使用一些相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  • 可以用一些相邻的虚拟地址访问大于可用物理内存的内存缓冲区。当物理内存不够用的时候,内存管理器会想物理内存页保存在磁盘文件中,数据或代码页会根据需要在物理内存和磁盘间移动。
  • 不同进程使用的虚拟地址彼此隔离。
11. 虚拟内存

虚拟内存可以让程序拥有超过系统物理内存大小的可用空间,它定义了一个连续的虚拟地址空间,并且把内存扩展到磁盘空间

局部性原理:

  • 时间局部性:由于程序中存在大量的循环操作,则程序中某一数据被访问,不久后可能再次被访问。
  • 空间局部性:程序一段时间内访问的地址可能集中在一定的范围内,由于程序顺序执行,且数据一般以数组,链表等形式存储的。

我们可以利用局部性原理实现高速缓存,比如基于时间局部性,我们可以将近来使用的指令和数据保存到高速缓存中,并使用高速缓存的层次结构实现;基于空间局部性,使用较大的高速缓存,并将预取机制集成到高速缓存逻辑控制中实现。

12. 如何实现虚拟内存技术

虚拟内存技术建立在离散式内存管理方式基础上

  1. 请求页式存储管理:建立在分页管理之上,为了增加虚拟存储器功能,增加了请求调页功能页面置换功能。程序开始执行时,只把当前要执行的那部分页装入内存中,当发现要访问的页面不存在时,则使用页面置换功能将相应页调入内存,将暂时不用的页面调入外存中。
  2. 请求分段存储管理:建立在分段管理之上,为了增加虚拟存储器功能,增加了请求调段功能分段置换功能
  3. 请求段页式存储管理
13 .页面置换算法

当需要访问的页面不存在内存中时,发生缺页中断。当内存中没有空闲空间时,系统必须将内存中的一个页面移出,选择淘汰哪一页的算法叫页面置换算法。

  1. 最佳页面置换算法:选择以后永远不用的,或者长时间不被访问的页面作为淘汰页面。
  2. 先进先出页面置换算法:淘汰最先进入内存的页面,即在内存中留存时间最久的页面。
  3. 最近最久未使用页面置换算法:赋予每一页一个访问字段,记录自上次以来被访问经历的时间T,选择T最大的淘汰。
  4. 最少使用页面置换算法:选择之前时期最少使用的页面淘汰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值