admin 管理员组

文章数量: 887021

这篇文章总结一下操作系统笔试和面试常考的一些问题,主要集中在进程和线程,以及线程的同步问题上。操作系统设计的核心就是进程和线程的管理。

零、序言

0.1 什么是操作系统?

  1. 用户与计算机硬件之间的接口
  2. 控制和管理计算机资源的软件

0.2 计算机由什么硬件组成?

  1. CPU
  2. 存储器
  3. 输入/输出设备
  4. 总线等

一、进程和线程

1.1 什么是进程?什么是线程?


注:
  1. 资源是指处理器CPU时间、存储器、文件、IO设备这四个
  2. 单进程,单线程:MS_DOS, 多进程,单线程:Unix, 单进程,多线程:JVM,多进程,多线程:Linux, Windows,Android,IOS.

1.2 进程和线程的区别?相比进程,线程有哪些好处?

  1. 一个进程可以有多个线程,多个线程可以并发,可以共享进程数据,拥有自己独立的栈空间和执行序列。
  2. 进程与线程是不同的系统资源管理方式。进程拥有独立的地址空间,而线程没有。一个进程崩溃后,在保护模式下,不会对其他进程造成影响;而线程只是进程的一个执行路径,没有自己独立的地址空间,一旦一个线程崩溃,整个进程就会崩溃。所以,多进程的程序比多线程程序更加健壮。
  3. 线程不占用系统资源,调度线程比调度进程开销更小,在线程间切换比在进程间切换效率高。
  4. 对于一些要求同时进行而又共享某些变量的并发操作来说,只能用多线程,不能用多进程。
使用线程有哪些好处?
  1. 创建线程比创建进程需要的时间更少
  2. 终止线程比终止进程时间更少
  3. 切换线程比切换进程更快
  4. 线程间通信无需调用内核即可实现。同一进程的线程共享进程的数据。

1.3 进程间通信的方式有哪些?

Windows 和 Linux操作系统有不同的进程间通信方式
windows和linux共有的进程间通信方式:
1. 消息(linux中叫做信号)
2. 共享内存
3. 邮槽
4. 管道
5. socket

1.4 线程同步方式有哪些?进程同步的方式有哪些?

问:什么是线程同步?
答:线程同步是指多线程通过特定的方式(如互斥量)来控制线程之间的执行顺序(同步),也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步那线程之间是各自运行各自的。
问:线程同步方式有哪些?
答:
  1. 互斥(信号)量,每个时刻只有一个线程可以访问公共资源。只有拥有互斥对象的线程才能访问公共资源,互斥对象只有一个,一个时刻只能有一个线程持有,所以保证了公共资源不会被多个线程同时访问。
  2. 信号量,允许多个线程同时访问公共资源。当时控制了访问资源的线程的最大个数。
  3. 事件 in windows(条件变量 in linux)。通过通知的方式保持多线程的同步,还可以方便的实现多线程优先级的比较
  4. 临界区。任意时刻只能有一个线程进入临界区,访问临界资源。
问:进程同步的方式有哪些?
答:
  1. 原子操作
  2. 信号量
  3. 管程
  4. 会合
  5. 分布式系统

1.5 临界区?

问:什么是临界区?
答:每个进程(线程)中,访问临界资源(不可共享的资源)的那段代码称为临界区。每次只允许一个进程(线程)进入临界区,进入后不允许其他进程(线程)进入。
问:如何解决临界区冲突?
答:
  1. 一次只允许一个进程(线程)进入临界区,如果有一个进程(线程)已经进入了自己的临界区,其他试图进入临界区的进程(线程)必须等待
  2. 进入临界区的进程(线程)要在有限的时间内退出临界区,以便于其他进程(线程)进入自己的临界区
  3. 如果进程(线程)无法进入自己的临界区,则应该让出CPU等资源,避免进程(线程)出现“忙等”现象。
问:实现临界区的方法有哪些?
答:
  1. 软件实现
  2. 中断屏蔽(关中断,开中断)
  3. 硬件指令方法

1.6 进程有几种状态?状态之间的转换是怎么样的?

  • 就绪。进程已经获得了除CPU以外的所有所需资源,等待分配CPU资源
  • 运行。已获得了CPU资源,进行运行。处于运行态的进程数<=CPU核心数
  • 阻塞。进程等待某些条件,在条件满足前无法执行

1.7 进程创建的过程?

  1. 给新进程分配一个唯一的标识符
  2. 给进程分配内存空间
  3. 初始化进程控制块PCB
  4. 将PCB放入就绪队列中,等待分配CPU资源

1.8 什么是进程控制块PCB?PCB保存了哪些信息?

  1. 是进程存在的唯一标识
  2. 创建一个进程就会创建一个PCB,当进程撤销时,系统回收它的PCB
  3. 系统对进程的控制根据PCB进行,对进程的管理通过管理PCB实现
  4. 能实现间断性的运行方式
  5. 提供进程间通信管理所需的资源
  6. 提供进程调度所需的信息
PCB中保存了
  1. 进程的标识信息
  2. 进程的状态信息(就绪、运行、阻塞)
  3. 进程的控制信息

1.9 进程和程序的区别?

  1. 程序是计算机指令的集合,以文件的形式存放在磁盘上,是静态的文本。不使用系统资源,不能申请资源,不能被调度,不能作为运行的单位。
  2. 进程是程序的运行实体,包含了程序段、数据段、PCB,是程序在其地址空间中的执行活动,是系统分配资源的基本单位。使用系统资源,可以运行。

1.10 进程(线程)调度的几种算法?

  1. 时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
  2. 先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
  3. 优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
  4. 多级反馈队列调度算法:将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
  5. 高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。

1.11 缓冲区溢出?

问:什么是缓冲区溢出?
答:当前计算机向缓冲区填充数据时,超出了缓冲区自身的容量,溢出的数据覆盖在合法的数据上。
问:缓冲区溢出的危害?
答:
  1. 程序崩溃,导致拒绝服务
  2. 跳转并执行一段恶意代码
问:缓冲区溢出的原因是什么?
答:程序没有在填充前检查用户的输入长度。

1.12 进程调度和线程调度的关系?

  1. 进程和线程都有三种状态(就绪、运行、阻塞)
  2. 如果一个线程进行了系统调用,则整个进程阻塞(系统调用会使进程阻塞,而线程还是处于运行态,不会阻塞),控制权从程序转移走,但在线程角度看,此线程还在运行态。而进程已经到了阻塞态。
  3. 当线程A等待线程B的某些事件时,A被阻塞,控制权从A移到B。

1.13 线程实现的两种方式?各有什么优缺点?

  1. 用户级线程(Linux)
  2. 内核级线程(Windows)

1.14 死锁?

问:什么是死锁?
答:在两个以上的并发进程中,如果每个进程都持有某种资源而又等待其他进程释放他们持有的资源,在未改变这种状态前,谁都无法推进,则发生了死锁。所有进程无限期等待,且循环等待,都处于阻塞态。
问:死锁产生的四个必要条件?
  1. 互斥。一个资源一次只能被一个进程占有
  2. 请求与保持。一个进程因为请求资源而阻塞时,不释放自己持有的资源
  3. 非剥夺。无法在进程结束前剥夺它对资源的所有权
  4. 循环等待。若干进程收尾相接形成环形等待关系
问:死锁处理的策略?
答:
  1. 预防死锁。破坏后三个条件中的一个即可(互斥是非共享设备的特性,无法更改):
    1. 破坏请求与保持条件。规定一个进程开始前,必须申请所有需要的资源。
    2. 破坏非剥夺条件。当无法得到需要的资源时,释放自己持有的资源,等需要时再重新申请。
    3. 破坏循环等待条件。将所有资源按类型线性排队,并赋予不同的编号,所有进程请求资源时,必须按照资源递增顺序,以防出现环路。如果一个进程已经分配到了R资源,那么它再申请时,只能申请排在R后面的资源,而不能申请前面的资源。
  2. 死锁避免。避免死锁并不是事先采取某种限制措施破坏死锁的必要条件,而是再资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁:
    1. 银行家算法
    2. 系统安全状态
    3. 安全性算法
  3. 死锁的检测与解除
    1. 资源分配图
    2. 死锁定理
    3. 死锁解除

1.15 线程(进程)同步与PV操作

PV是线程同步的基本操作,P表示proberen(测试),V表示verhogen(增加),是荷兰语,这是在计算机术语中不是用英 语表达的极少数的例子之一。PV也可以用semWait和semSignal表示,注意对应关系。
三个经典的线程同步问题(读写,哲学家,生产消费)
  • 读者-写着问题
  • 哲学家就餐问题
  • 生产者-消费者问题
读者-写者问题
  1. 任意多的读进程可以同时读文件
  2. 一次只有一个写进程可以写文件
  3. 如果有进程在写,则不可以读
说明了
  1. 读进程不需要排斥其他读进程
  2. 写进程需要排斥其他所有进程包含读写
读者写者问题有两种实现,即读者优先和写者优先 (1)读者优先 读进程拥有优先权,当一个读进程开始读时,就为读进程保持所有权,知道它们都读完,写进程会饥饿。
(2)写者优先 当一个写者想写时,不允许新的读进程访问数据区
哲学家就餐问题
五名哲学家围坐在一张圆桌旁,没人手边有两把叉子,每个人吃面都需要两把叉子,如何设计,能免死锁和饥饿?即没有两位哲学家同时用同一把叉子。
解决方法是用一个信号量,每次只允许4名哲学家同时进餐,由于最多只有4人同时吃面,一定有一个哲学家可以等到两把叉子,不会出现死锁和饥饿。
生产者-消费者问题
一个生产者负责生产,一个消费者负责消费。需要注意的是 消费者不能读空缓冲区,生产者不能向满缓冲区加数据。且生产者和消费者对缓冲区的访问互斥。
打印机问题
一个进程负责把内容放入缓冲区,另一个进程负责打印缓冲区的内容

1.16 互斥量、信号量

  1. 互斥量是一种特殊的信号量,对一个互斥量的PV操作都在一个线程中,是一种对临界区的封锁方法。互斥量总是初始化为1。
  2. 信号量是线程间通信的一种方法,PV操作在两个线程中,通常由一个线程释放信号量,另一个线程在信号量上排队。初始化值为非负数(0~n)。
  3. 互斥量和信号量的原语是一样的。

  1. semWait使信号量减一,若为负数,则此线程阻塞,加入阻塞队列,否则继续执行
  2. semSignal使信号量加一,若<=0,则从信号量的阻塞队列中拿出队首,加入就绪队列
  3. 信号量负数的绝对值n表示了有多少个线程在此信号量上排队,一共n+1个线程,但是只有一个在运行,其余在排队(阻塞队列中)。比如-4表示有4个线程在此信号量上排队。正数的绝对值表示可用资源数,负数的绝对值表示欠缺资源数也表示排队的线程数。
  4. 互斥量的变化范围是 1 ~ -(n-1), n表示共有n个线程尝试访问公共资源

1.17 互斥锁

互斥锁就是用互斥量(被初始化为1的信号量)来封锁,PV操作在一个线程内成对出现。互斥是为了让一次只有一个线程可以访问公共资源。互斥锁是一种很简单的线程同步方法。

1.18 同步信号量和互斥信号量

  1. 同步信号量和互斥信号量都是信号量,操作都是PV操作。
  2. 同步信号量初始化为非负数,而互斥信号量总是初始化为1.
  3. 同步信号量实现了线程间的同步,互斥信号量实现了对公共资源的互斥访问

1.19 互斥量和临界区的区别

  1. 两者都可以实现对互斥资源的互斥访问
  2. 临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
  3. 临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
  4. 临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用。

二、内存管理

2.1 什么是物理内存?什么是虚拟内存?区别与联系?

http://blog.csdn/li187li/article/details/52802127
http://wwwblogs/dyllove98/archive/2013/06/12/3132940.html


虚拟内存存在的意义?
  1. 既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
  2. 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
  3. 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片。

2.2 内存分区的四种方法?

  1. 固定分区。产生内零头(内部碎片)
  2. 动态分区。产生外零头(外部碎片)
  3. 分页
  4. 分段

2.3 动态分区的三个适配算法?

  1. 最佳适配。选择与需求大小最接近的块
  2. 首次适配。从第一个开始,选择第一个满足大小的空闲块。
  3. 下次适配。从上次放置的位置开始,选择第一个满足大小的空闲块。

2.4 伙伴系统

是一种堆结构。

2.5 分段和分页的区别?

  1. 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的 ;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
  2. 段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定
  3. 段向用户提供二维地址空间;页向用户提供的是一维地址空间
  4. 段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。

2.6 malloc实现原理

  1. 可以基于伙伴系统实现,也可以使用基于链表的实现
  2. 将所有空闲内存块连成链表,每个节点记录空闲内存块的地址、大小等信息
  3. 分配内存时,找到大小合适的块,切成两份,一分给用户,一份放回空闲链表
  4. free时,直接把内存块返回链表
  5. 解决外部碎片:将能够合并的内存块进行合并

2.7 使用mmap读写文件为什么比普通读写函数要快?

mmap函数:可以将文件映射到内存中的一段区域,普通函数读写文件:用户空间buffer内核空间buffer磁盘;mmap映射之后:用户空间buffer进程内存空间,省掉了拷贝到内核空间的时间?

三、I/O管理和文件系统

3.1 I/O子系统的四个层次

分别是:用户级I/O软件、设备无关软件、设备驱动程序、中断处理程序。

3.2 磁盘IO

磁盘设备的I/O控制主要是采取  DMA方式。

本文标签: 要点 操作系统