操作系统(基础)笔记与总结

前言

你好,我是苏青羽,是一名默默无闻的计算机爱好者。

本笔记是我在学习操作系统时所总结的学习笔记,主要记录了操作系统的一些基础知识点,在这里分享给大家,希望通过该笔记能帮助更多的人去理解操作系统。

笔记中参考了网上的很多博客、公众号、网课、面经等等,这些均在笔记末尾的参考资料中有所展示,大家可自行查看,做更深入的了解。

本笔记主要用于在学习上的复盘,并不适合初学者学习。如果在笔记中遇到了不懂的知识点,一定要去自己看书或者上网查询相关知识点!

如果发现本文有较大的硬性错误、或者是某些内容存在侵权、以及有什么想补充的问题和内容,请点击“关于”,通过里面预留的联系方式同我联系!

本笔记正在实时更新中,若是想获取笔记的最新PDF版以及了解关于我的更多信息,可扫描下方二维码,或微信搜索公众号“苏青羽”关注我!

前提基础

学习本笔记前,请事先掌握以下基础知识

  • C语言基础(或C++基础)
  • 数据结构与算法

操作系统概述

1. 操作系统是什么?

(1) 系统资源(软件+硬件)的管理者,包括处理机管理、存储器管理、文件管理、设备管理

(2) 向上层提供简便易用的服务,使得用户无需关心底层硬件的原理,只需要对操作系统发出指令即可使用计算机。操作系统提供的服务有两种,一种是面向用户,用户可直接使用的命令接口(交互式命令接口和批处理命令接口)。另一种是面向程序,由程序请求操作系统服务的系统调用(广义指令)

(3) 最接近硬件的一层软件,将CPU、内存、硬盘等硬件合理的组织起来,让各种硬件能够相互配合,实现更多复杂的功能。

2. 操作系统的体系结构了解吗?

(1) 指令:处理器(CPU)能识别、执行的最基本命令。分为特权指令(不允许用户程序使用)与非特权指令

(2) 处理器状态:分为用户态(目态)和核心态(管态),目态只能使用非特权指令,管态则全都能使用。

(3) 程序:分为内核程序(运行在管态)和用户程序(运行在目态)

(4) 内核:计算机上的底层软件,是操作系统最基本、最核心的部分,实现内核功能的程序是内核程序。最基本的内核功能有:时钟管理、中断处理、原语、系统控制的数据结构及处理(纯软件,包含各类链表、缓冲区)

3. 操作系统具有什么特征?

操作系统具有并发、共享、虚拟、异步四大特征。

(1) 并发:指多个事件在同一时间间隔内发生,这些事件在宏观上是同时发生的,在微观上是交替发生的,对于并发要注意以下几点。

① 与并行区分,并行指的是多个事件在同一时刻同时发生

② 单核CPU同一时刻只能执行一个程序,各个程序只能并发执行

③ 多核CPU同一时刻可以同时执行多个程序,多个程序可以并行执行

(2) 共享:系统中的资源可供内存中多个并发执行的进程共同使用。具有两种共享方式。

① 互斥共享方式:一个时间段内只允许一个进程访问该资源

② 同时共享方式:一个时间段内允许多个进程“同时”(微观上交替)访问该资源

(3) 虚拟:把一个物理上的实体变为若干个逻辑上的对应物。操作系统中有两种虚拟技术。

① 虚拟存储器技术(空分复用):用户只有4G运行内存,但可以运行总内存大于4G的多个软件

② 虚拟处理器技术(时分复用):单核CPU可以同时运行多个程序 (微观上交替)

(4) 异步:进程的执行并不是一贯到底的,而是走走停停,以不可知的速度向前推进。需要注意的是并发与共享互为存在条件。而并发与共享是操作系统最基本的两个特征,没有这并发与共享就谈不上虚拟与异步。

4. 操作系统的发展?

操作系统的发展分为这几个阶段:手工操作阶段,单道批处理系统,多道批处理系统,分时操作系统,实时操作系统

(1) 手工操作阶段:人机矛盾,资源利用率极低

(2) 单道批处理系统:引入脱机输入/输出技术(用外围机 + 磁带完成)。缓解了一定程度的人机速度矛盾,资源利用率有所提高。内存中只能有一道程序运行,下一道程序只有等待该程序运行结束之后才可运行,CPU有大量的时间在等待I/O完成,资源利用率仍然较低

(3) 多道批处理系统:操作系统正式诞生,用于支持多道程序并发执行,共享计算机的资源,资源利用率大幅提升。没有人机交互功能 (用户不能在中间控制程序的执行,只能等待计算机处理完成)。

(4) 分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,用户可通过终端与计算机交互。解决了人机交互问题,允许多个用户使用同一台计算机,且各用户之间互相独立。不能优先处理一些紧急任务,操作系统对各个用户/作业完全公平

(5) 实时操作系统:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。实时操作系统分为两种:硬实时和软实时

① 硬实时操作系统:规定某个动作必须在规定的时刻内完成或发生,比如军工系统、火箭系统。

② 软实时操作系统:虽然不希望偶尔违反最终的时限要求,但是仍然可以接受。比如数字音频、多媒体、手机都是属于软实时操作系统。

5. 中断和异常了解吗?

(1) 中断是操作系统最基本的机制,如果没有中断机制,CPU会一直运行某个程序,无并发可言。同时也是让操作系统内核夺回CPU使用权的唯一途径

(2) 中断是由操作系统+硬件完成的,硬件负责中断隐指令(保存PC和PSW),操作系统负责后续部分。

(3) 中断分为外中断和内中断

① 外中断一般称为“中断”,外中断的信号来自于CPU外部,与当前执行的指令无关,常见的外中断有时钟中断、I/O中断。

② 内中断一般称为“异常”,内中断的信号来自于CPU内部,与当前执行的指令有关,内中断分为三类:陷阱、故障、终止

陷阱(trap):由陷入指令引发,是应用程序故意引发的。

故障(fault):由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。如:缺页故障。

终止(abort):由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0,内存越界。

6. 处理器如何修改自身状态?

(1) 核心态 → 用户态:执行一条特权指令,即修改PSW(程序状态寄存器)的标志位为用户态,表示操作系统让出CPU使用权。

(2) 用户态 → 核心态:由中断引发,中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理。中断也是从用户态转到核心态的唯一路径

(3) 在状态切换时,CPU可能会将用户堆栈切换为系统堆栈,但该系统堆栈也属于进程

7. 说说访管指令?

(1) 访管指令又称陷入指令、trap指令,用户程序可以用它来发起系统调用,请求操作系统提供服务。

(2) 访管指令可以将cpu状态由用户态转到核心态,实际上访管指令的背后会发起中断,这时候的中断被称为访管中断,因此它的cpu状态转换仍然是由中断发起的。

(3) 访管指令将用户态转到核心态,故只能在用户态被使用,它不可能为特权指令,但是由访管指令发起的系统调用是在内核态执行的,请注意区分两者!

8. 说说操作系统引导?

(1) 激活CPU:读取ROM中的boot程序,它是一种引导程序(自举程序),用于启动具体的设备,然后开始执行BIOS指令

(2) 硬件自检

(3) 加载带有操作系统的硬盘:硬盘分为引导硬盘和非引导硬盘,只有引导硬盘才可以加载操作系统。

(4) 加载主引导记录MBR:MBR存在于硬盘的第一个扇区中,MBR可以告诉CPU去硬盘哪个分区找操作系统

(5) 扫描硬盘分区表:第一个扇区中不仅包含MBR,还包含了一个硬盘分区表,硬盘分区分为活动分区和非活动分区,CPU需要找到活动分区以加载操作系统

(6) 加载分区引导记录PBR:PBR是活动分区中的第一个扇区,它里面包含了一个引导程序(启动管理器),用于引导操作系统。注意要与boot程序区分开!

(7) 加载启动管理器

(8) 加载操作系统:启动管理器读取内核文件并加载操作系统,操作系统内核会常驻内存

9. 一台计算机能安装多个操作系统吗?

可以的。操作系统总是会被安装到引导磁盘中的活动分区,但并没有限制活动分区的数量。我们可以设置多个活动分区,在每个活动分区中安装操作系统,而在计算机启动时交由用户决定最终启动哪个操作系统。

10. 说说宏内核和微内核?

(1) 宏内核将系统的主要功能模块都作为一个整体运行在核心态,具有无可比拟的性能优势。随着操作系统的发展,需要操作系统提供的服务越来越复杂,宏内核也变得越来越臃肿。目前主流的操作系统,包括Windows、Linux、IOS都是基于宏内核的架构。

(2) 微内核将内核中最基本的功能都保留在内核,包括进程(线程)管理、中断、页表机制等,而将其他功能移到用户态执行,这样添加和修改系统服务不必修改微内核。微内核架构具备以下特点:内核足够小、基于C/S模式、机制与策略分离、面向对象。微内核的主要问题是效率低下,因为需要频繁地进行核心态和用户态的切换。

进程与线程

1. 了解进程吗?

(1) 操作系统中的进程是一个非常重要的概念,需要与程序区分开。

① 程序:是静态的,是可执行文件,是一系列的指令集合

② 进程:是动态的,是程序的一次执行过程

(2) 进程由程序段、数据段、PCB三部分组成:

① 程序段:程序代码(指令序列)

② 数据段:运行过程中产生的各种数据

③ PCB:即Process Control Block(进程控制块)。

(3) 操作系统需要对各个并发执行的进程进行管理,为了方便管理,需要进程提供自己的相关信息,如进程描述信息、进程控制和管理信息、资源分配清单、处理机相关信息,都会被保存在各个进程自己的PCB中。同时,PCB也是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,进程结束时,操作系统会回收其PCB。

2. 进程的基本特征是什么?

(1) 动态性、并发性、独立性、异步性、结构性

(2) 在多进程环境下,进程会失去封闭性,因为支持资源共享,进程的执行结果与他们的执行速度相关。

3. 进程的状态有哪几种?

(1) 进程具备三种基本状态:运行态、就绪态、阻塞态

① 运行态:占有CPU,并在CPU上运行。

② 就绪态:具备运行条件、但没有空闲CPU,暂时不能运行。

③ 阻塞态:等待某一事件而暂时不能运行。

(2) 进程还具备两种其他状态:创建态和终止态。下图即进程的五状态模型。

(3) 在引入了内存交换机制后,进程的状态还新增了就绪挂起和阻塞挂起。所谓的挂起状态指的是暂时调到外存等待的进程,但PCB不会调到外存,而是常驻内存

4. 进程的组织方式?

(1) 操作系统中有许多的PCB,为了对PCB进行管理,应当使用适当的方式将其组织起来。

(2) 进程有两种组织方式:链接方式和索引方式

① 链接方式:按进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针。

② 索引方式:按进程状态创建多个索引表,操作系统持有指向各个索引表的指针。

5. 进程状态怎么转换?

(1) 进程状态的转换,即进程控制。操作系统使用原语实现进程控制。原语具有原子性,原语的执行是一气呵成的。原语用开/关中断实现。

(2) 无论什么样的进程控制,所要做的事情有三个:更新PCB中的信息、将PCB插入到合适的队列、分配/回收资源

6. 进程之间如何通信?

进程通信指的是进程之间的信息交换。各进程的内存地址空间相互独立,一个进程不能直接访问另一个进程的地址空间,操作系统提供了进程之间信息交换的一些方法,包括管道通信、消息传递、共享存储、信号量、信号、socket。

(1) 管道通信:管道是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件(管道文件)。进程采取字符流的形式往管道文件中写入和读取数据,以完成进程通信。管道只能采取半双工通信,要想实现全双工必须定义两个管道。管道的特点是若数据被读空,则读进程阻塞,若缓冲区写满,则写进程阻塞

(2) 消息传递:进程间的数据交换以格式化的消息(Message)为单位,进程通过发送消息和接收消息两个原语进行数据交换,隐藏了通信实现细节,是当前应用最广泛的进程间通信机制,可以很好地支持多处理器、分布式、计算机网络。在微内核架构中,微内核与服务器之间的通信就采用了消息传递机制

① 直接通信方式:进程之间利用消息直接进行接受和发送

② 间接通信方式:进程之间的消息传递需要用到某个中间实体(信箱),该方式被广泛应用在计算机网络中。

(3) 共享存储:通信的进程之间存在一块可以直接访问的共享空间,目前的共享存储有基于数据结构的共享和基于存储区的共享(共享内存)。在对共享空间进行读写操作时需要使用同步互斥工具。

(4) 信号量:信号量实际上是一种进程同步机制,信号量表示了某个系统资源的数量,当然也可以以此来进行进程通信,只不过信息量较少。

(5) 信号:信号是一种比较复杂的通信方式,主要用于通知进程某个事件已经发生

(6) Socket:通信机制中唯一一个可以跨网络通信的机制

7. 说说进程通信机制的应用场景和优缺点?

(1) 管道通信:

① 优点:简单方便

② 缺点:只能单双工通信,缓冲区有限、效率低下

(2) 消息传递:

① 优点:可以实现任意进程间的通信,并通过原语来实现消息发送和接收之间的同步,无需考虑同步问题,方便。

② 缺点:信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

(3) 共享存储:

① 优点:使用共享内存进行进程间的通信非常方便,而且函数的接口也简单,数据的共享使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。

② 缺点:需要提供同步机制,只能让同一个计算机系统中的诸多进程共享,不方便多个计算机的进程进行网络通信。

8. 了解线程吗?

(1) 一个进程有多个线程,从属于同一进程的各个线程共享进程的资源。

(2) 进程是资源分配的基本单位,线程是CPU调度的基本单位

(3) 进程切换开销大,线程切换开销小。

(4) 线程也有运行态、就绪态、阻塞态

(5) 线程几乎不拥有资源,只有极少量的资源(线程控制块(TCB)、少量寄存器和线程栈)

(6) 线程的引入可以提升系统的并发度和资源利用率

9. 用户级线程(协程)和内核级线程(线程)了解吗?

(1) 用户级线程是从用户角度能看到的线程,操作系统看不到线程的存在,线程切换在用户态下即可完成,无需操作系统干预。

(2) 内核级线程是从操作系统内核能看到的线程,线程的切换必须在核心态下才能完成。

(3) 因为操作系统只看得到内核级线程,因此内核级线程才是CPU调度的基本单位

10. 进程、线程、协程之间的差异?

11. 多线程模型了解吗?

多线程模型是针对用户级线程和内核级线程之间关系的一种模型。

(1) 多对一模型:

① 多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

② 优点:用户级线程的切换在用户态即可完成,线程管理的系统开销小,效率高

③ 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。

(2) 一对一模型:

① 一个用户级线程映射到一个内核级线程,进程拥有与用户级线程数量相等的内核级线程。

② 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。

③ 缺点:线程切换需要切换到核心态,因此线程管理的成本高,开销大。

(3) 多对多模型:

① n个用户级线程映射到m个内核级线程(n >=m)。

② 克服了多对一模型并发度不高以及一对一模型中线程切换开销太大的缺点。

12. IO密集型线程和CPU密集型线程了解吗?

(1) IO密集型线程(IO Bound Thread) :频繁等待I/O的线程

(2) CPU密集型线程(CPU Bound Thread) :频繁进行大量计算,很少等待的线程

(3) 通常情况下,IO密集型线程总是比CPU密集型线程容量得到优先级的提升

13. 多进程和多线程的区别是什么?什么时候该用多线程,什么时候该用多进程?

(1) 需要频繁创建和销毁的任务优先使用多线程。

(2) 需要频繁切换的任务优先使用多线程。

(3) 任务间相关性比较强的用多线程。因为线程之间的数据共享和同步比较简单。

(4) 实际开发中更常见的是多进程加多线程的结合方式,并不是非此即彼的

14. 了解调度吗?

调度就是从任务队列中按照一定的算法选择一个任务并将资源分配给它。调度有三个层次:高级调度、中级调度、低级调度。

(1) 高级调度(作业调度):从外存中选择作业,为它分配资源(内存、PCB),建立相应的进程,使他们获得竞争处理机的权利。注意:高级调度主要是指调入的问题,只有调入的时机需要操作系统确定,调出的时机必然是等作业运行结束,每个作业只调入一次,调出一次。

(2) 中级调度(内存调度):决定将哪个处于挂起状态的进程重新调入内存。注意:中级调度发生的频率比高级调度高。

(3) 低级调度(进程调度):按照某种算法从就绪队列中选取一个进程,将处理机分配给它。注意:低级调度是操作系统最基本的一种调度,频率最高。

15. 进程调度的时机?

(1) 发生进程调度的时机即某进程放弃CPU资源的时候,此时有两种情况需要分别讨论:进程主动放弃、进程被动放弃。

① 进程主动放弃:经常会发生在进程正常终止、运行过程中发生异常而终止、进程主动请求阻塞(如等待l/O)。

② 进程被动放弃:分给进程的时间片用完、有更紧急的事需要处理(如I/o中断)、有更高优先级的进程进入就绪队列

(2) 不能发生进程调度的情况有三种:处理中断、进程在操作系统内核程序临界区、原语操作。这三种情况因为不可发生中断,所以不可进行进程调度。

16. 进程调度的方式有哪种?

(1) 非剥夺调度方式:又称非抢占方式,只允许进程主动放弃处理机,在运行过程中即使有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动请求进入阻塞态

(2) 剥夺调度方式:又称抢占方式,当一个进程正在处理机上执行时,如果有更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更紧迫的进程

17. 怎么实现调度?

进程的调度由调度程序实现,调度程序由三部分组成:

(1) 排队器:将进程按照一定策略排成一个或多个队列,以便于调度程序选择

(2) 分派器:依据调度程序选择的进程,将其从就绪队列中取出

(3) 上下文切换器:对原有进程信息的保存和新进程信息的加载(PCB切换),只能发生在内核态。

请注意调度和切换的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为,切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换,一个调度程序是包含调度行为和切换行为的。

18. 上下文切换与模式切换的区别?

(1) 模式切换指的是cpu由用户态到内核态之间的切换,模式切换后,cpu逻辑上可能还在执行同一进程。

(2) 上下文切换是改变当前运行进程的一种行为,只能发生在内核态,是多任务操作系统中的一个必需的特性。

19. 进程调度算法有哪些?

(1) 先来先服务(FCFS):按照进程到达的先后顺序调度,默认非抢占模式

(2) 短作业优先(SJF):每次调度时选择当前已到达且运行时间最短的作业/进程,默认非抢占模式

(3) 高响应比优先(HRRN):调度时计算所有就绪进程的响应比(响应比 = (等待时间 + 要求服务的时间) / 要求服务的时间),选择响应比最高的进程上处理机,默认非抢占模式

(4) 时间片轮转(RR):轮流让就绪队列中的进程依次执行一个时间片,默认为抢占模式,且无法为非抢占式。每次选择的上处理机的进程都是排在就绪队列队头的进程。一个进程执行完会移动到就绪队列的尾部。新进程先到达就绪队列的尾部。注意:若时间片太大,使得每个进程都可以在一个时间片完成,此算法会退化为先来先服务算法。若时间片太小,进程切换过于频繁,开销过大。

(5) 优先级调度:每次调度时选择优先级最高的进程。默认为抢占模式

(6) 多级反馈队列调度(默认为抢占模式):

① 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大

② 新进程到达时先进入第一级队列,按FCFS原则排队等待被分配时间片,若用完时间片后该进程还未结束,则进程进入下一级队列队尾,如果此时已经在最下级的队列,则重新放回最下级队列的队尾

③ 只有第K级队列为空时,才会为第K + 1级队列队头的进程分配时间片

④ 被抢占处理机的进程重新放回原队列队尾

20. 进程互斥了解吗?

进程互斥指的是当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待, 在当前访问临界资源的进程访问结束并释放该资源后,另一个进程才能去访问临界资源。进程的互斥是一种竞争关系。

21. 临界区和临界资源的区别?

临界资源:一个时间段内只允许一个进程使用的资源

在访问临界资源时,从代码逻辑上可分为四部分:

(1) 进入区:负责检查是否可进入临界区,若可进入,则应设置正在访问临界资源的标志(可理解为”上锁”),以阻止其他进程同时进入临界区

(2) 临界区:访问临界资源的那段代码

(3) 退出区:负责解除正在访问临界资源的标志(可理解为“解锁”)

(4) 剩余区:做其他处理

22. 访问临界资源的四大原则是什么?

(1) 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区

(2) 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待

(3) 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区 (保证不会饥饿)

(4) 让权等待:当进程不能进入临界区,应当立即释放处理机,防止进程忙等待。不应该让他占用处理机 一直执行循环无法前进。在得知无法进入临界区时不执行循环,直接切换进程。

23. 进程互斥的实现方法?

进程互斥有软件法、硬件法、信号量三种实现方法。

(1) 软件法:

① 单标志法:一个进程访问完临界区后会把使用临界区的权限交给另一个进程,即每个进程进入临界区的权限只能被另一个进程赋予。缺点:违背空闲让进原则

② 双标志先检查法:先检查后上锁。缺点:违背忙则等待原则。

③ 双标志后检查法:先上锁后检查。缺点:违背了空闲让进和有限等待原则。

④ Peterson算法:主动争取、主动谦让、检查对方。缺点:违背了让权等待原则。该方法不会导致饥饿。

(2) 硬件法:中断屏蔽方法、TS指令、swap指令

(3) 互斥锁:操作系统提供了原子操作acquire()获得锁,release()释放锁。互斥锁通常采用硬件机制实现。互斥锁的主要缺点是忙等待,无法让权等待,因此互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行

(4) 信号量:不管是硬件法还是软件法都无法实现让权等待原则,因此引入了信号量机制。信号量就是一个变量,表示系统中某种资源的数量。用户进程可以通过使用一对低级进程通信原语来对信号量进行操作。即wait(S)原语和signal(S)原语,S是信号量。通常又把wait(S)称为P操作,代表资源数减一,将signal(S)称为V操作,代表资源数加一。信号量在资源数不够时会主动让进程进入阻塞态,资源数有空余时又会主动唤醒进程。

24. 进程同步了解吗?

进程同步指的是协调多个并发进程,控制他们在执行过程中某个位置处的先后次序。进程的同步是一种协作关系

25. 进程同步的方法?

进程同步通常用信号量或者管程实现。

(1) 信号量:见上文。

(2) 管程:使用信号量实现进程同步有诸多缺点,如程序易读性差、程序不利于修改和维护、正确性难以保证,因此引入了管程机制。管程以面向对象的设计,把对共享资源的操作封装起来,即把信号量和相应的PV操作封装在一个管程内,并且每次仅允许一个进程进入管程,从而实现进程互斥。

(3) 条件变量:

① 在操作系统中运行的进程可能会因为某种原因而被阻塞,我们可以把这个阻塞原因定义为条件变量。每个条件变量保存了一个等待队列,用于记录因该条件变量而阻塞的所有进程。

② 操作系统提供了对条件变量的两种操作:wait和signal。进程调用wait会把自己插入到某个条件变量的等待队列,进程被阻塞。进程调用signal可以唤醒由于条件不满足而阻塞的进程。

③ 条件变量的wait和signal类似于信号量的PV操作,可以实现进程的阻塞与唤醒。条件变量是没有值的,仅实现了排队等待功能,而信号量的值反映了剩余资源数。

④ 简单来说,条件变量是一种可以让进程排队等候和唤醒的机制,程序员可以检查某个进程是否满足某个条件,然后通过条件变量来让进程阻塞或唤醒。

26. 死锁、饥饿、死循环的区别?

(1) 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进。在多进程环境下才会发生。处于死锁状态的进程必定是阻塞进程。

(2) 饥饿:长期得不到想要的资源,某进程无法向前推进。多进程或者单进程环境下都有可能发生。处于饥饿状态的进程可能是一个就绪进程。

(3) 死循环:某进程执行过程中一直跳不出某个循环。多进程或者单进程环境下都有可能发生,一般是编码者故意为之,如while(1)。

27. 死锁产生的必要条件?

产生死锁必须同时满足以下四个条件,若有一个不满足,死锁就不会发生

(1) 互斥条件:对互斥资源的争夺才会导致死锁

(2) 不剥夺条件:进程获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放

(3) 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放

(4) 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求

28. 怎么处理死锁?

(1) 预防死锁:事先破坏死锁产生的四个必要条件中的一个或几个。

(2) 避免死锁:在系统运行过程中,用某种方法防止系统进入不安全状态,从而避免死锁。

(3) 死锁的检测和解除:允许死锁的发生,操作系统检测出死锁后,会采取措施解除死锁。

29. 预防死锁的具体实现?

(1) 预防死锁是一种静态方法,通过破坏死锁产生的四个必要条件中的一个或几个来避免发生死锁。如:

① 申请的资源得不到满足时,立即释放拥有的所有资源(不剥夺条件)

② 运行前分配好所需要的资源,之后一直保持(请求和保持条件)

③ 采用顺序资源分配发,给系统中的资源编号,限制用户申请资源的顺序,每个进程必须按编号递增的顺序请求资源。(破坏循环等待条件)

(2) 预防死锁的方法大多实现起来较为复杂、容易导致资源利用率低,可行性不高

30. 避免死锁的具体实现?

(1) 安全序列:如果按照某种序列分配资源,可以让每个进程都能顺利完成,则称该序列为安全序列。

(2) 安全状态:在分配资源的过程中,只要能找出一个安全序列,系统就是安全状态 (安全序列可能有多个)。

(3) 不安全状态:如果分配了资源以后,系统中找不出任何一个安全序列,系统就进入了不安全状态,这就意味着之后可能所有进程都无法顺利的执行下去。

(4) 不安全状态与死锁的关系:如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁。 处于不安全状态未必会发生死锁,但发生死锁时一定处于不安全状态。

(5) 通常采用银行家算法实现避免死锁,银行家算法指的是在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,由此决定是否答应资源分配请求,是一种动态方法

(6) 死锁避免并不限制进程申请资源的顺序,只会限制进程某次申请资源的请求。

31. 死锁的检测与解除?

该方法是一种动态方法,主要分为检测、解除两个步骤。

(1) 死锁检测:资源分配图保存资源的请求和分配信息,用圆圈代表进程,矩形框代表一类资源,从进程到资源的有向边称为请求边,从资源到进程的边称为分配边。提供一种算法,利用上述信息检测系统是否进入死锁状态。

(2) 死锁定理:死锁的条件是当且仅当资源分配图是不可安全简化的(无法完全消去资源分配图的所有边),该条件为死锁定理

(3) 死锁解除:发生死锁后,需要进行死锁解除,死锁解除有以下几个方法:

① 资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程;但是应防止被挂起的进程长时间得不到资源而饥饿

② 撤销进程法:强制撤销部分甚至全部死锁进程,并剥夺这些进程的资源

③ 进程回退法:让死锁进程回退到足以避免死锁的地步 (这就要求系统记录历史信息、设置还原点)

32. 多线程的用途,实际举例说明下?

(1) 多线程可以提高CPU密集型程序的执行效率。大型网络3D游戏,往往需要尽可能快地显示游戏画面,那么就可以用一个线程负责背景、一个线程负责人物、一个线程负责特效渲染,最后在游戏进程中将这些数据共同显示出来。

(2) 多线程可以提高IO密集型程序的用户体验。比如迅雷的边下边播,一个线程下载资源,一个线程通过已下载的资源播放视频,不必等待全部资源下载完毕。

(3) 以上都是任务间相关性比较强的程序,各个任务之间需要资源共享,此时使用多线程显然比多进程来得更方便高效。

33. 多线程的缺点?

(1) 程序健壮性降低,一个线程崩溃会导致整个进程崩溃。因为所有线程共享进程地址空间,线程之间是完全透明的,某个线程崩溃就说明该线程已经出现了不可逆转的错误,极有可能破坏掉进程的地址空间,所以操作系统为了安全起见,会终止进程运行。

(2) 缺乏访问控制,容易破坏数据一致性。 线程是没有独立性的,在对一些进程的全局数据做出修改时,可能会影响进程内另一线程的运行。

(3) 编程难度高。编写和调试一个多线程程序比单线程程序要困难得多,而且在程序崩溃后,由于多线程的复杂性,也很难找出崩溃原因。

(4) 线程过多会有额外的性能损失,CPU需要频繁地在多个线程间来回切换(多进程也有)。

内存管理

1. 内存管理了解吗?

内存管理包括:内存空间的分配与回收,内存空间的扩充、内存共享、地址转换、存储保护。

2. 源代码转换为进程的过程?

将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:

(1) 编译:将用户源代码编译成若干目标模块

(2) 链接:将各个目标模块链接在一起,形成完整的装入模块。

(3) 装入:将装入模块装入内存运行。

3. 程序链接的方式?

程序的链接有三种方式:

(1) 静态链接:在程序运行之前,先将各目标模块及它们所需要的库函数链接成一个完整的装配模块。

(2) 装入时动态链接:不事先链接,在装入内存时,采用边装入边链接的方式,便于修改和更新以及实现目标模块的共享。

(3) 运行时动态链接:在程序运行过程中需要该目标模块才将该模块装入内存并进行链接,能加快程序的装入过程,节省大量的内存空间。

4. 程序装入的方式?

(1) 绝对装入:只适用单道程序环境,编译链接时就决定好程序装入内存的绝对地址。

(2) 可重定位装入(静态重定位):编译和链接产生的程序地址均为相对地址(程序起始地址为0),在装入时对目标程序的地址进行修改(重定位),产生绝对地址。该地址变换上在程序转入时一次完成的。作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。

(3) 动态运行时装入:程序被装入内存是不立即把相对地址转换为绝对地址,而是推迟到运行时,由重定位寄存器辅助进行地址转换。可以把程序分配到不连续的存储区,在程序运行之前只装入部分代码即可运行。

5. 什么是虚拟地址和物理地址?

(1) 在进行编译和链接时产生的程序地址均为虚拟地址(相对地址、逻辑地址),从0号单元开始,如果是32位系统,虚拟地址的范围是0~232-1,即每个程序/进程都认为自己占据了整个内存空间,且这个内存空间的大小为系统位数支持的最大大小。用户程序和程序员都只能看到虚拟地址,内存管理的具体机制是完全透明的,不同进程可以有相同的虚拟地址,相同的虚拟地址可以映射到主存的不同位置。

(2) 物理地址是内存的真实地址,它是地址转换的最终地址,进程要访问数据最后都要通过物理地址从主存中存取。虚拟地址到物理地址的转换被称为地址重定位

(3) 操作系统通过内存管理部件(MMU,被集成到CPU中)来进行地址转换,它的实现原理就是页表机制。

6. 进程的内存分区?

(1) 代码段:存放程序的二进制代码,代码段是只读的,可以被多个进程共享。

(2) 数据段:程序运行时所需要的数据,包括全局变量和静态变量

(3) 内核区:操作系统内核区,用户代码不可见,存放PCB和一些重要的内核数据

(4) 堆:存放动态分配的变量

(5) 栈:实现函数调用。

7. 内存保护的实现/地址访问是否越界?

(1) 在CPU中设置一对上下限寄存器,保存用户作业在主存中的上下限地址,访问地址时需要同这两个寄存器进行比较,判断是否越界。

(2) 在cpu中设置重定位寄存器和界地址寄存器,重定位寄存器包含最小的物理地址值,界地址包含最大的逻辑地址值,每次地址转换前都需要同界地址寄存器进行比较,判断是否越界,再通过重定位寄存器进行地址转换

8. 覆盖和交换的区别?

(1) 覆盖技术:将程序分成多个段,常用的段常驻内存的固定区,不常用的段放在外存,在需要的时候调入内存的覆盖区。缺点:能放在覆盖区的段必须由程序员指明,对用户不透明,增加编程负担。

(2) 交换技术:内存空间紧张时,系统将内存中某些进程暂时换出外存。内存空间有多余时,把外存中某些已具备运行条件的进程换入内存,使用中级调度来完成。外存一般分为交换区和文件区,换出的进程会存放在交换区中。

(3) 覆盖与交换的区别:覆盖是在同一个程序或进程中的。交换是在不同进程之间的。

9. 在发生内存交换时,有些进程是被优先考虑的?

(1) 优先换出阻塞进程

(2) 优先换出优先级低的进程;

10. 内存分配管理方式了解吗?

内存分配管理方式主要分为连续分配管理方式和非连续分配管理方式。

11. 什么是可重入代码?

可重入代码又称纯代码,是一种允许多个进程同时访问但不允许被任何进程修改的代码。

12. 外部碎片和内部碎片的区别?

(1) 外部碎片:指内存中的某些空闲分区由于太小而难以被进程利用,闲置在内存中。

(2) 内部碎片:指分配给某进程的内存区域中,有些部分没有用上。

13. 解决外部碎片的方法?

拼凑技术:将原本不相邻的空闲分区合并成一个更大的空闲分区,用于解决碎片分区不满足进程的需求的问题。

14. 说说内存的连续分配管理方式?

(1) 单一连续分配:内存被分为系统区和用户区;系统区存放操作系统相关数据,用户区用于用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区。优点:实现简单,无外部碎片。缺点:只能用于单用户、单系统的操作系统中,有内部碎片。

(2) 固定分区分配:将整个用户区划分成若干个固定大小的分区,在每个分区中只装入一道作业,某个作业独占一个固定分区,这些分区之间的大小可以相等也可以不等。优点:无外部碎片。缺点:有内部碎片,需要使用分区说明表实现各个分区的分配与回收。

(3) 动态分区分配:不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要,因此系统分区的大小和数目是可变的。优点:无内部碎片。缺点:有外部碎片。

15. 动态分区分配算法有哪些?

由于动态分区分配需要动态地建立分区,因此系统使用空闲分区表和空闲分区链记录内存的使用情况,并使用合适的动态分区分配算法进行分配。动态分区分配算法有:首次适应算法、最佳适应算法、最坏适应算法、邻近适应算法。

(1) 首次适应算法:空闲分区以地址递增的次序排列,每次分配内存空间时顺序查找空闲分区表/链,找到大小能满足要求的第一个空闲分区。链表中的结点即使大小发生变化后,结点顺序依旧不变,因为结点只按照地址排序。

(2) 最佳适应算法:空闲分区以容量递增的次序排列,每次分配内存空间时顺序查找空闲分区表/链,找到大小能满足要求的第一个空闲分区。链表中的结点当大小发生变化之后,需要调整结点顺序。

(3) 最坏适应算法: 空闲分区以容量递减的次序排列,每次分配内存空间时顺序查找空闲分区表/链,找到大小能满足要求的第一个空闲分区。链表中的结点当大小发生变化之后,需要调整结点顺序。

(4) 邻近适应算法:与首次适应算法一样,空闲分区以地址递增的次序排列,但每次分配内存空间时从上次查找结束的位置开始查找空闲分区表/链,找到大小能满足要求的第一个空闲分区.

下图为四种分区分配算法的优缺点

16. 说说内存的非连续分配管理方式?

连续分配管理方式为进程分配的是连续的内存空间,往往会导致内存利用率较低。因此引入了非连续分配管理方式,即为进程分配的是分散的内存空间,可以将进程分成几个部分,分散的放入空闲区

非连续分配管理方式有三种:基本分页存储管理、基本分段存储管理、段页式管理方式

(1) 基本分页存储管理:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位,被称为页框。每个进程也以块为单位进行划分,进程中的块被称为进程以页为单位申请主存中的页框,页和页框有一一对应的关系,这些关系被保存在页表中。注意:页框太大会产生过多的页内碎片,太小又会使进程的页表过长。优点:不会产生外部碎片。缺点:需要进行页面-页框地址转换,增加了运行时开销。

(2) 基本分段存储管理:进程按照自身的逻辑关系划分为若干个段,每段都有一个段名。内存以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。与分页类似,进程的段与内存中的段会建立一一对应的关系。同样也需要为每个进程建立一张段表。优点:不会产生内部碎片。缺点:需要进行逻辑段——物理段地址转换,增加了运行时开销。

(3) 段页式管理方式:分段与分页有各自的优缺点,如下图所示。

① 为了综合这两种方式的优点,引入了段页式管理方式,即分段 + 分页。具体方式为将进程按照自身逻辑分段,再将各段分页,将内存空间划分成多个页框,将进程的各页面分别装入对应的页框中。简单来说即从逻辑上分段,从物理上分页,如下图所示。

② 因为结合了这两种方式,所以其逻辑地址到物理地址的转换方式不能只倚靠一张表解决,需要同时建立一个段表与多个页表,如下图所示。

17. 为什么说分段管理的地址空间是二维的?

在分页管理下,一个虚拟地址被分为页号和页内偏移两部分,由于每个页都是固定大小,因此在进行地址转换时只需判断页号是否越界即可,页内偏移不可能越界,因此分页管理的地址空间是一维的。而分段管理下的虚拟地址被分为段号和段内偏移,由于段的大小不一,我们需要判断段号和段内偏移是否越界,因此必须显式给出这两个属性,因此我们说分段管理的地址空间是二维的。

18. 时间局部性原理和空间局部性原理了解吗?

(1) 时间局部性:如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)

(2) 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)

19. 快表是什么?

(1) 不管是分段还是分页,都需要逻辑地址到物理地址的转换,即需要倚靠表机制进行查询。但表机制在访问某个逻辑地址时需要两次访存,以页表为例,第一次访存为访问内存中的页表,通过映射转换获取物理地址。第二次访存则访问该物理地址对应的内存单元

(2) 为了减少访存次数,利用了时间局部性原理和空间局部性原理,引入了快表机制。快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表

(3) 在有了快表机制后,通常会先访问快表,若快表命中,则访问某个逻辑地址仅需一次访存即可。在快表未命中的情况下才会去查询慢表。(有些处理器会同时查询快表和慢表,若快表命中则终止慢表的查找)

20. 虚拟内存是什么?

(1) 传统的内存分配管理(连续和非连续)中都存在一些缺点:

① 一次性:作业必须一次性全部装入内存后才能开始运行

② 驻留性:一旦作业被装入内存,就会一直驻留在内存中直至作业运行结束。

(2) 我们可以利用局部性原理来克服这些缺点,为此引入了虚拟内存。

① 虚拟内存创建了一个虚拟的、比实际内存大得多的内存,实际上物理内存大小并未改变,只是在逻辑上进行了扩充

② 在程序装入物理内存时,可以将程序中很快会用到的部分装入物理内存,暂时用不到的部分留在外存

③ 在程序运行过程中,所要访问的信息不在物理内存时,由操作系统负责将所需信息从外存调入物理内存,然后继续执行程序。

④ 若物理内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存

⑤ 虚拟内存的大小只由计算机的地址结构决定,即计算机的地址最大位数

(3) 虚拟内存的特征:多次性、对换性、虚拟性

(4) 虚拟内存的实现必须依赖中断,才能在指令执行过程中产生缺页中断

21. 内存请求分页管理方式了解吗?

(1) 在引入了虚拟内存后,请求分页管理方式也就随之诞生。请求分页管理方式与基本分页管理的主要区别在于增加了请求调页和页面置换两个功能。

(2) 请求调页:操作系统需要通过状态位知道每个页面是否已经调入内存;如果还没有调入,也需要知道该页面在外存中存放的位置。

(3) 页面置换:内存不足时,操作系统需要决定将哪个页面换出到外存:有的页面没有被修改过就不必浪费时间写回外存;有的页面被修改过,就需要将外存中的旧数据覆盖;因此,操作系统还需要记录每个页面是否被修改过的信息。

(4) 为了实现这请求调页和页面置换两个功能,请求分页相比起基本分页,页表更加复杂,如下图所示。

22. 缺页中断是什么?

(1) 缺页中断是请求分页管理中的一个重要机制。 在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断;此时缺页的进程阻塞,放入阻塞队列中,调页完成后再将其唤醒,放回就绪队列。

(2) 如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。

如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰。若该页面在内存期间被修改过,则要将其写回外存;未修改过的页面不用写回外存。

23. 页面置换算法有哪些?

(1) 最佳置换算法(OPT):每次选择淘汰的页面是以后永不使用或者最长时间内不再被访问的页面,以保证最低的缺页率。该算法性能最好,但由于操作系统无法预判页面访问顺序,故最佳置换算法无法实现。

(2) 先进先出置换算法(FIFO):每次向内存中调入页面时,将页面添加到一个队列的队尾,需要换出页面时换出队头的页面即可,队列的最大长度取决于内存块的个数。FIFO算法会产生Belady异常,即为进程分配的内存块增多时,缺页次数不减反增的现象,因此,FIFO算法性能较差。

(3) 最近最久未使用置换算法(LRU):每次选择淘汰的页面是最近最久未使用的页面。LRU性能好,但需要硬件支持,算法开销大。LRU是堆栈类算法,不可能出现Belady异常。

(4) 时钟置换算法:较复杂,建议看书。简单来说就是将内存中的所有页面视为一个循环队列,并有一个替换指针与之相关联,它会循环地检查各个页面的使用情况。它可以用比较小的开销而接近LRU算法的性能。

24. 抖动你知道吗?

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

25. 什么是驻留集?

(1) 给一个进程分配的物理页框的集合就是这个进程的驻留集。

(2) 分配给一个进程的页框越少,驻留在主存中的进程就越多,从而可提高cpu的利用率

(3) 若一个进程在主存中的页面过少,尽管有局部性原理,缺页率仍相对较高

(4) 若分配的页框过多,由于局部性原理,缺页率没有太大影响

26. 什么是工作集?

工作集是指在某段时间间隔内,进程所访问的页面集合。对于局部性良好的程序,工作集一般会比驻留集小很多,因为进程所访问的页面会发多次重复,导致实际访问的页面集合并没有达到驻留集的大小。

27. 说说内存分配策略?

在请求分页系统中,可采取两种内存分配策略:固定和可变分配策略。在进行置换时,也可采取两种策略:全局和局部置换。它们之间可进行组合。

(1) 固定分配局部置换:为每个进程分配一定的物理页框,在运行期间不改变,页面置换只会选择被分配的页进行置换。这种策略难以确定每个进程的物理页框数,太少会频繁出现缺页中断,太多会降低CPU利用率。

(2) 可变分配全局置换:为每个进程分配一定的物理页框,在运行期间会发生变化,页面置换会从整个物理内存中选择页进行置换。这种方法更加灵活,但会盲目地给进程增加物理页框,导致系统并发度下降。

(3) 可变分配局部置换:为每个进程分配一定的物理页框,当缺页率特别高或者特别低才会进行页框数量的重新分配,页面置换只会选择被分配的页进行置换。它的实现比较复杂,但可以显著提升系统的并发度,又保证较低的缺页率。

(4) 固定分配全局置换:不存在这种策略

28. 说说调页策略?

外存可被分为两部分:存放文件的文件区和存放对换页面的对换区。对换区采取连续分配方式,文件区采取离散分配方式,因此对换区的磁盘I/O速度更快。

(1) 系统拥有足够的对换区空间:发生调页时全部从对换区调入所需页面。

(2) 系统缺少足够的对换区空间:仅将可能被修改的页放入对换区,需要时再从对换区调入。

(3) UNIX方式:未运行过的页面从文件区调入,运行过的页面调出时会被放入对换区,下次调入时会从对换区调入。

29. 什么是内存映射文件?

(1) 内存映射文件(Memory-Mapped Files)是一种特殊机制,它将磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关系,进程可直接访问被映射的文件,而不必再执行文件的I/O操作,也无需对文件内容做缓存处理,方便随机读写操作,尤其适合大文件

(2) 大文件的某次I/O操作(read和write)在底层可能会导致频繁的磁盘I/O,这非常影响性能,使用内存映射文件是个不错的选择。

(3) 使用内存映射文件所进行的所有操作都是在内存运行的,当进程退出或解除文件映射时,所有被改动的页面会一并写回磁盘空间。

(4) 内存映射文件也是一种进程间数据共享的机制,它相当于是一个共享内存,多个进程可对它进行访问,当一个进程在文件中完成了写操作,另一个进程立即就能看到写操作的结果。

30. 说说虚拟内存性能的影响因素?

(1) 页面大小:页面较大则缺页率较低,页面较小则缺页率较高。

(2) 驻留集大小:驻留集越大缺页率越低,但有个上限,过度地加大对缺页率的改善不明显

(3) 页面置换算法:选择好的页面置换算法可减少缺页率

(4) 写回磁盘的频率:可以在系统中建立一个链表,用以暂时保存被换出的页面,而不必立即写回磁盘,当链表保存的页面达到阙值时才一起写回磁盘,这样可以减少磁盘I/O次数。

(5)程序的局部化程度:程序局部化程度越高,缺页率就越低

文件管理

1. 一个文件有哪些属性?

一个文件除了文件数据,操作系统还会保存与文件相关的信息,如文件名称、文件大小、文件位置、所有者、创建时间等信息。

2. 什么是FCB?

文件控制块(FCB)类似于进程的PCB,用来保存文件的元属性,包括各种基本信息,存取权限等,通过FCB我们就可以对文件进行各种操作。

3. 文件目录是如何组织的?

(1) FCB的有序集合被称为文件目录,一个FCB和它所对应的文件名就是一个文件目录项,在目录中我们可以通过文件名找到它所对应的FCB,进而对文件进行读写操作。

(2) 一个文件目录也被视为一个文件,称为目录文件。简单来说,一个目录文件中保存了文件目录,而文件目录就是一个一个文件目录项的集合。目录文件是一种典型的有结构文件(记录式文件)。

(3) 目录结构:单级目录结构(不允许文件重名)、两级目录结构(分为主文件目录和用户文件目录,缺乏灵活性)、树形目录结构(应用最广泛)、无环图目录结构(系统管理复杂)

4. 说说文件的打开和关闭/文件描述符/文件句柄?

(1) 当用户对文件进行操作时,每次都要从检索目录开始。为了避免多次重复检索目录,大多数操作系统要求,在文件使用之前都需要通过系统调用open被显式地打开。

(2) 所谓的打开,是指open会根据文件名搜索目录,将文件名对应的FCB从外存复制到内存,操作系统会在内存中维护一个打开文件表,保存所有被打开文件的FCB,并将表项的索引返回给用户。

(3) 在多进程环境下,系统中通常会采用两级表,每个进程维护独有的进程表和系统维护的唯一系统表。一旦有进程打开一个文件,相应的系统表和进程表会增加该文件的表项,当另一个进程打开同样的文件,只会在其进程表中增加表项并指向系统表的对应表项。

(4) 这个表项索引在Linux中被称为文件描述符,而在Windows中称为文件句柄。因此对文件的所有操作都可以通过该索引进行操作,而不必再使用文件名。

5. 什么是文件的逻辑结构?

文件的逻辑结构是用户可以看到的文件的组织形式,是文件的逻辑表示,与具体的物理存储介质无关。文件按逻辑结构可以分为无结构文件、有结构文件两种。

(1) 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows中的.txt 文件。

(2) 有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如目录文件、数据库文件。

6. 文件如何存放在外存上?

类似于内存分为一个个“内存块”,外存会分为一个个“块/磁盘块/物理块”。操作系统以“块”为单位为文件分配存储空间。

7. 什么是文件的物理结构?

文件的物理结构指的是在操作系统看来,文件的数据在外存中是如何分布和组织的。

(1) 连续分配:每个文件在磁盘上占有一组连续的块,FCB保存文件第一个磁盘块的地址和文件的大小。优点是简单快速,适合随机存取。缺点是文件的增删效率低下。

(2) 链接分配:采用离散分配的方式,文件不必占据连续的块。

① 隐式链接:采取链表式存储,FCB保存文件的第一块指针和最后一块的指针,每个磁盘块保存有下个磁盘块的指针。优点是增删效率高,缺点是只适合顺序访问。

② 显式链接:在磁盘中唯一地设置一张文件分配表(FAT),FAT在系统启动时就会被读入内存。FAT每个表项保存了某个磁盘块号链接的下一个磁盘块号(指针),FCB保存文件的第一次磁盘块号,后续的磁盘块都可通过FAT找到。优点:支持随机访问。缺点:FAT占用较大的内存空间,因为它保存了所有磁盘块的信息。

(3) 索引分配:每个文件设置一个单独的索引块,它保存了文件中所有磁盘块的索引指针。优点:支持随机访问。缺点:访问文件需要两次访存,先读取索引块,再读取文件数据。

8. 文件系统是什么?

文件系统一种专门负责管理文件的系统,它负责对文件进行组织分配、空间管理、权限保护等,同时对于用户来说,文件系统负责实现了文件的按名存取。

9. 说说外存空闲空间管理?

对于外存中的空闲块,我们也应该对它们进行有序的组织,方便操作系统使用,因此引入了几种外存空闲空间管理方式。

(1) 空闲表法:系统为外存上的所有空闲区建立一张空闲盘块表,每一个表项记录了空闲区的起始盘块号和盘块数。该方法只适用于文件的连续分配方式,文件只能占据连续的磁盘块。

(2) 空闲链表法:所有的空闲盘去拉成一条空闲链,分为空闲盘块链以及空闲盘区链(每个盘区包含若干个盘块)。

(3) 位示图法:利用二进制的一位来表示磁盘中一个盘块的使用情况。0表示盘块空闲,1表示已分配。

(4) 成组链接法:把一组空闲盘块号保存在一个磁盘块中,这个磁盘块被称为成组链接块。在成组链接块的最后一个位置处存放一个指针,指向保存另一组空闲盘块号的成组链接块,如此继续,直至所有空闲盘块均链接。系统只需保存第一个成组链接块的指针即可。

I/O管理

1. I/O设备的概念与分类?

(1) I/O设备:将数据输入输出计算机的外部设备。

(2) 按信息交换的单位可分为:

① 块设备:传输快,可寻址。如磁盘。

② 字符设备:传输慢,不可寻址,常采用中断驱动方式。如打印机、键盘。

(3) 按设备的分配方式可分为:

① 独占式使用设备:进程独占设备,其他进程直至进程释放设备前不可使用,如打印机、磁带机

② 分时式共享使用设备:可同时分享给多个进程,通过分时共享使用,如磁盘

③ 虚拟设备:通过SPOOLing技术将一个独占设备转换为若干逻辑设备,供多个进程使用。

2. I/O接口和I/O端口的区别?

(1) I/O接口:设备控制器,位于CPU与设备之间,可以同CPU和设备进行通信,主要由三部分组成:设备控制器与CPU的接口、设备控制器与设备的接口、I/O逻辑

(2) I/O端口:设备控制器中可被CPU直接访问的寄存器,包括数据寄存器、状态寄存器、控制寄存器

(3) 简单来说,I/O端口是I/O接口的一部分,面向CPU通信,被集成在I/O接口中

3. I/O控制方式有多少种?

I/O控制方式是指操作系统用什么样的方式来控制I/O设备的数据读/写。

(1) 程序直接控制方式:CPU从头到尾需要对数据传输进行干涉,CPU与I/O设备只能串行工作,CPU利用率较低。以字为单位进行传输

(2) 中断驱动方式:CPU发出I/O指令后可转去执行其他程序,当I/O就绪时I/O接口会发起中断,由CPU完成数据的传输(I/O接口到内存)。CPU与I/O设备可并行工作,但效率较低。以字为单位进行传输。

(3) DMA方式:CPU发出I/O指令后可转去执行其他程序,DMA控制器会执行I/O操作并完成数据传输(I/O接口到内存),数据传输完成后再发起中断通知CPU做接下来的处理。以块为单位进行传输

(4) 通道控制方式:通道是一种硬件,可以理解为”性能较差的CPU”,可识别并执行通道指令(通道指令保存在内存中)完成I/O操作。数据的传输均由通道指令控制通道执行,CPU干涉频率最低,而且一个通道可同时与多台I/O设备进行通信。

4. 说说I/O软件层次结构?

(1) 用户层I/O软件:与用户交互的接口,包含一些语言提供的I/O库函数

(2) 设备独立性软件:提供I/O设备的统一操作接口,即系统调用

(3) 设备驱动程序:与硬件直接相关,负责对具体的I/O设备发出指令,向上层提供一组标准操作接口。每类设备都应配置一个设备驱动程序,由设备生产厂商制作,不管背后的实现原理,只需满足能被操作系统使用的标准接口即可。

(4) 中断处理程序:处于操作系统内核,负责中断处理。

(5) 硬件:I/O设备。

5. 什么是高速缓存和缓存区?

高速缓存和缓存区都是介于高速设备和低速设备之间的一段数据存取区,他们的特点如下

(1) 高速缓存:高速缓存存放低速设备上某些数据的副本,高速缓存上有的,低速设备上必然有。其目的主要是为了提高高速设备去读取经常访问的数据的速度,若数据不在高速缓存,则会去访问低速设备。

(2) 缓冲区:缓冲区存放低速设备发送给高速设备的数据,这些数据在低速设备上不一定有备份。低速设备发送高速设备的数据必然经过缓冲区,而且高速设备永远不会直接访问低速设备。

6. 什么是逻辑设备名和物理设备名?

(1) 物理设备名是指I/O设备的物理名称,可唯一地标识一个I/O设备。

(2) 为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备,在用户和进程的视角中只能看到逻辑设备名。

(3) 进程在利用逻辑设备请求操作时,系统会通过查找逻辑设备表(LUT)来寻找相应的物理设备和驱动程序。

(4) LUT在系统中有两种方式设置:

① 在整个系统中只设置一张LUT,主要适用于单用户系统

② 为每个用户设置一张LUT,适用于多用户系统。

7. 磁盘的结构了解吗?

(1) 磁盘被划分为磁道、扇区,如下图所示。

(2) 磁盘通常由多个盘片垂直堆叠,每个盘片有两个盘面,因此我们经常以柱面号、盘面号、扇区号来确定一个磁盘地址。

(3) 在磁盘上读取数据需要把磁头移动到想要读写的扇区所在的磁道,磁盘会转动起来,让目标扇区从磁头下面划过,即可完成对磁盘的读写操作。

(4) 一次磁盘读写操作需要的时间 = 寻道时间 + 延迟时间 + 传输时间

① 寻道时间:读写数据之前,将磁头移动到指定磁道所花的时间

② 延迟时间:通过旋转磁盘,将磁头定位到目标扇区开始处所需要的时间

③ 传输时间:磁盘转动,从磁盘的目标扇区中读写数据经历的时间

8. 磁盘调度算法有哪些?

(1) 先来先服务(FCFS):根据进程请求访问磁盘的先后顺序进行调度。

① 优点:公平;如果请求访问的磁道比较集中的话,算法性能还算过的去。

② 缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。

(2) 最短寻找时间优先(SSTF):优先处理的磁道是与当前磁头最近的磁道

① 优点:性能好,平均寻道时间短。

② 缺点:磁头可能在一小块区域中来回移动,可能产生饥饿现象

(3) 扫描算法(SCAN):只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。

① 优点:性能较好,平均寻道时间较短,不会产生饥饿现象。

② 缺点:只有到达最外侧才可改变磁头移动方向,可以使用LOOK算法解决这个问题(如果磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向)。磁道各个位置的响应频率不平均,离端点近的很快会被访问第二次。

(4) 循环扫描算法(C-SCAN):磁头朝着指定方向移动时才处理磁道访问请求,返回时直接快速移动到始端而不处理任何请求。

① 优点:比起SCAN来,对于各个位置磁道的响应频率很平均。

② 缺点:只有到达终端后才能退回到始端,可以使用LOOK算法解决这个问题。

9. 如何减少磁盘延迟时间?

(1) 交替编号:磁头读入一个扇区的数据之后需要一小段时间的处理,也就是说读完一个扇区之后无法连续读取相邻的下一个扇区。我们可以让逻辑上相邻的扇区在盘面上交替存放,在连续读写多个相邻扇区时能减少磁头的延迟时间

(2) 错位命名:将同柱面不同盘面的扇区错位编号,则连续读写多个相邻盘面时可减少磁头延迟时间。

10. 能否减少磁盘传输时间?

不能。传输时间由磁盘本身的性质所决定,不能通过一定措施减少,而寻道时间和延迟时间都属于“找”的时间,可以削减。

11. 磁盘分区是什么?

(1) 在使用磁盘的过程中我们通常会对磁盘进行“分区”,即将磁盘划分为多个区段,各个区段的数据相互独立。

(2) 分区有几个好处:首先是数据更加安全,分区数据不会被其他分区干扰。其次是性能上也有所提升,分区将数据集中在某个区段中,操作系统仅需扫描该区段而无需全盘扫描。

(3) 早期的操作系统采取MBR方式来处理磁盘分区。在磁盘的第一个扇区中存放主引导记录(MBR)和磁盘分区表,通常以柱面为分区单位。MBR方式的缺点在于无法支持大容量磁盘的分区(分区表的每组分区信息仅有16字节)以及分区表出错时恢复困难。

(4)随着操作系统的发展,GPT方式取代了MBR。GPT在磁盘头尾都存放了MBR和分区表,提高了安全性。GPT还支持更大的磁盘容量和更多的磁盘分区数,并且还支持以扇区为分区单位,划分粒度更细。

12. 磁盘格式化是什么?分区与格式化的先后顺序是什么样的?

(1) 我们知道硬盘分区有诸多好处,另外通过分区还可以把不同的操作系统装入同一块物理硬盘的各个分区中,相互之间互不干扰。但是在磁盘分区之后,装入操作系统之前,还有一个必备的工作——格式化。

(2) 为什么要进行格式化?因为不同的操作系统所设置的文件系统一般并不相同,为了使操作系统可以正确存取文件数据,必须对分区进行格式化,以成为操作系统能够利用的文件系统格式。

更新记录

更新日期 更新详情
(2022年05月15日) 内容汇总,主要吸收了拓跋阿秀校招笔记的内容,以及部分面经
(2023年04月22日) 排版升级,分区域总结,如进程与线程、内存管理,更容易查找相关内容。进行笔记整理,新增与删减了部分笔记,不再以面经为导向,而是专注于考研408的操作系统,重新编写一些不清晰的表述。
(2023年06月28日) 吸收了《鸟哥的linux私房菜》和一些CSDN博客的内容,添加了“一台计算机能安装多个操作系统吗?”、“多线程的用途”、“多线程的缺点”、“磁盘分区与格式化”等知识点。
(2023年08月31日) 将各个大板块重新编号,现在各个版块都有独立的题目编号,互不干扰。将更新记录中的版本号替换为年份日期,取消版本号机制,方便记录更新。
(2023年09月17日) 修改首页文字布局,统一化布局。修改前言。添加前提基础模块。更改正文和标题字体。修改部分问题描述。更新目录。更改笔记名字为操作系统(基础)。修改参考资料。所有的更新日期都添加前置0,统一长度。将“操作系统”模块更名为“操作系统概述”

参考资料

《2023年操作系统考研复习指导——王道考研系列》

《鸟哥的Linux私房菜》

《操作系统》:https://interviewguide.cn/notes/03-hunting_job/02-interview/02-01-os.html

《王道计算机考研 操作系统》:https://www.bilibili.com/video/BV1YE411D7nH

《操作系统》:https://blog.csdn.net/weixin_49343190/category_10383801.html

《进程间通信方式的优缺点》:https://blog.csdn.net/m0_69124108/article/details/129044079

《Linux~操作系统…》:https://blog.csdn.net/qq_24016309/article/details/128395734


操作系统(基础)笔记与总结
http://example.com/2023/09/17/操作系统(基础)笔记与总结/
作者
苏青羽
发布于
2023年9月17日
许可协议