操作系统原理(面试向)

一、操作系统概述

1.1 操作系统的用处是什么?有哪些基本作用?

1.操作系统是用户与计算机硬件之间的接口,提供系统调用和命令等。

2.操作系统是计算机资源的管理者(CPU,内存,文件,磁盘等)。

1.2 并发和并行有什么区别?

并发指的是宏观上在一段时间内好似有多个程序在运行,但是微观上他们是交替执行的。

并行指的是同一时刻有多道程序在不同的处理器或处理器核心上运行。

1.3 什么是用户态和内核态?为什么要划分呢?

内核态拥有最高特权,可执行包括特权指令在内的所有指令,并能访问内核允许访问的内存。用户态是普通应用程序运行的状态,对计算机资源受限访问。

之所以要划分内核态和用户态,主要是为了安全,保护系统稳定,这样可以防止恶意程序和bug破坏OS和硬件。

1.4 说说几种不同的操作系统类型?

简单批处理系统,多道批处理系统。

分时系统(时间片),实时系统。

分布式操作系统,网络操作系统等。

1.5 说说几种不同的操作系统结构?

分层结构:每层只能调用其下层的服务。其排查错误方便,但是效率低。

微内核结构:尽量减少在内核中完成的功能部分,在内核只留下任务调度、基本内存管理、IPC等。其优点是易于扩展,可移植性强,可靠性高;缺点是因频繁进行内核和用户态的切换,性能开销大。

二、进程与线程

2.1 请简述一下进程与线程之间的区别?

1.进程是资源分配的基本单位,线程是CPU调度的最小单位。

2.进程之间通信要通过IPC,比较麻烦;同一个进程的线程之间通信只用全局变量等即可。

3.进程切换、创建的开销大,线程的开销小。

2.2 什么是PCB?

PCB是进程控制块,是操作系统用于管理和控制进程的数据结构。其包含进程的PID,寄存器上下文等信息。

2.3 用户级线程和内核级线程有啥区别?

1.用户级线程由用户级线程库管理,内核级线程由OS管理。

2.用户级线程切换和创建较快,内核级线程则较慢。

3.在多对一模型下,一个用户级线程执行阻塞系统调用会阻塞整个进程,而内核级线程不会。

4.用户级线程在多对一模型之下不能真正地实现多核并行。

2.4 什么是孤儿进程和僵尸进程?

孤儿进程没有危害,即父进程早于子进程退出,子进程会被PID=1收养。

僵尸进程如果长期大量存在会有害,即子进程退出之后父进程没有调用wait等方式回收,会占用进程表项。

2.5 进程间通信(IPC)的方式有哪些?

共享内存:在内存中建立一块区域,用这块区域传递信息。

消息传递:直接通信(用send原语),间接通信(用邮箱Mailbox或者发送到端口)。

一般来说,大量数据/追求性能用共享内存,数据量小/追求易用性则用消息传递。

三、CPU调度

3.1 常见的CPU调度算法有啥?

FCFS:先来先服务

SJF:短作业优先

RR:时间片轮转

Priority Schedule:优先级调度

多级反馈队列调度算法,是一种经典的综合调度算法

四、进程同步&死锁

4.1 同步和互斥的概念是啥?

同步,指的是不同进程之间可能有相互依赖的关系,所以OS需要保证先后顺序。

互斥,指的是某一个资源不能被多个进程同时访问。

4.2 什么是临界区与临界资源?

临界资源指的是同一个时间只允许一个进程访问的资源。

临界区指的是访问临界资源的代码。

4.3 信号量是啥?PV操作指的是啥?

信号量是操作系统提供的一种同步机制,其P、V操作本身具有原子性,可以用于实现同步和互斥。

P操作用于申请资源(信号量-1),V操作用于释放资源(信号量+1)。

4.4 什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。如果没有外力干预,它们会一直互相等待下去,从而阻碍这些进程继续运行。

4.5 产生死锁的四个必要条件?

1.互斥 一个资源只能被一个进程所使用

2.请求并保持 一个进程被阻塞的时候,会拿着自己已经获得的资源不放手,保持着等待其他资源

3.不可剥夺 一个进程已获得的资源在使用完之前不能被强行剥夺,只能由该进程主动释放

4.循环等待 若干进程之间形成一个循环的等待关系

4.6 简述一下预防死锁和避免死锁的方法?

预防死锁,指的是破坏四个死锁的必要条件之一。

避免死锁,在分配资源之前执行安全性检查,保证分配之后不会进入不安全状态。

4.7 简述一下银行家算法的思想?

银行家算法会计算如果允许一次进程的分配,之后资源分配的情况是否是安全状态。

所谓安全状态,就是存在一个安全序列,使得所有进程能够运行完毕。

五、内存系统

5.1 一个程序运行起来需要哪几步?

预处理(注释,宏替换)-> 编译(生成汇编代码)-> 汇编(生成包含机器码的目标文件)-> 链接(多个目标文件/库函数链接成一个可执行文件)。

5.2 进程的内存映像是怎么样的?

32 位进程虚拟地址空间示意图

5.3 逻辑地址和物理地址的区别是啥?

逻辑地址是程序和CPU使用的地址,操作系统和内存管理单元 MMU 负责将其转换成物理地址(这就是地址重定位)。物理地址是数据实际在内存条中的位置。

地址重定位可以发生在编译时、装入时、运行时。

5.4 什么是内存的连续分配方式?内部碎片和外部碎片是啥?

连续分配是指为一个用户程序分配一个连续的内存空间。

内部碎片指的是分配给了一个进程一段内存空间,但是有一部分没有被利用。

外部碎片指的是某些空闲的分区太小了,难以被利用。

5.5 分页式内存管理和分段式内存管理有啥区别?

分页式内存管理,把内存切成固定大小的块,程序员一般不感知,消除了外部碎片,但会产生内部碎片。

分段式内存管理,按照自身的逻辑来划分地址空间。譬如代码段、xx段这种,基本没有内部碎片,但会产生外部碎片。

5.6 什么是页表?什么是快表?

页表是操作系统维护的数据结构,用于将进程中的逻辑页号和真实的页框号所对应起来。

快表TLB是CPU的一个Cache,用于缓存最近被访问过的页表项。

5.7 虚拟内存的概念是啥?什么时候发生?

虚拟内存是为了扩大逻辑地址空间、提高内存利用率并提供进程隔离。OS不用把程序的所有页一次性装入内存,当访问的页不在内存时,再把需要的页调入内存,必要时将当前不需要的页换出到磁盘。这样程序可以使用比实际物理内存大得多的地址空间。

5.8 访问一个页面如果它被换出到外存了咋办?

此时会发生缺页中断,陷入内核态,由OS负责将该页从磁盘调入内存(用合适的页面置换算法)。

5.9 有哪些常见的页面置换算法

OPT(最佳置换算法,理论上的,无法实现),FIFO(淘汰最早进入内存的页面),LRU(最近最久未使用,依据:局部性原理),CLOCK时钟置换算法。

5.10 什么是Belady异常?

为进程分配的物理页框数增加时,缺页率不降反增。这个情况典型地会出现在FIFO中,LRU和OPT等栈算法不会出现。

5.11 什么是抖动(Thrashing)现象?如何解决?

系统频繁发生缺页,CPU大部分时间用于处理页面换入换出而不是执行程序,原因是多道程序度过高或给进程分配的物理块过少。可以降低多道程序度,或者动态调整物理块解决。

六、文件系统

6.1 文件系统的FCB是什么?

FCB是文件控制块,包含了文件的各种属性(文件名,大小,权限等),是OS用于管理文件的数据结构。

在Linux系统中,目录项保存文件名和Inode编号,Inode(索引节点)保存文件元数据和数据块位置等信息,两者共同承担类似FCB的作用。

6.2 文件的逻辑结构和文件的物理结构之间有啥区别?

逻辑结构指的是用户看到文件中的数据如何组织,如流式文件,记录式文件等。

物理结构指的是文件的数据块实际上是怎么存放的,比如连续分配,链接分配,索引分配。

6.3 说一下文件的几种物理结构?

连续分配(适合顺序访问),链接分配(隐式链接:指向下一个块,显式链接:FAT表,记录链接关系),索引分配(为每个文件分配一个索引块存储所有数据块指针)。

6.4 什么是硬链接和软链接?

硬链接是多个文件名指向同一个Inode,删除一个硬链接不影响其他,直到Inode链接计数为0且没有进程打开文件时,文件数据才会被回收。

软链接类似于Windows的快捷方式,它是一个独立的文件,有自己的Inode,里面的内容是指向别的文件的路径。

七、I/O系统

7.1 一次读/写磁盘需要的时间有什么?

机械磁盘的一次读/写包括寻道时间(找到对应的磁道),旋转延迟时间(定位到目标扇区),传输时间(读写需要的传输时间)。

7.2 有什么常见的磁盘调度算法?

FCFS(先来先服务),SSTF(最短寻道时间优先,会产生饥饿),SCAN(磁头沿一个方向移动并服务沿途请求,到达端点后反向),LOOK(优化SCAN,前进方向上没有待处理请求就可以回头),C-SCAN和C-LOOK(只沿单向服务请求,回程不服务)。

7.3 I/O控制方式的发展历程?

1.程序直接控制方式 需要轮询,CPU干预频率高,利用率低。

2.中断驱动方式 CPU不用等待I/O,但是每次中断仍需要CPU在设备控制器与内存之间搬运少量数据,中断太频繁也会导致效率降低。

3.DMA方式 直接内存访问,外设与内存直接交换数据块,CPU仅在开始和结束时介入。

4.通道控制方式 I/O通道有自己的指令集,是一个专门负责I/O的处理器。

7.4 什么是Spooling技术?

Spooling假脱机技术,使用大容量的磁盘作为缓冲,将独占设备(如打印机)虚拟为共享设备。当进程需要使用独占设备时,系统先将输出数据写入磁盘排队,由相应的进程送入打印机中。

7.5 什么是设备驱动程序?

设备驱动程序是操作系统中直接管理控制硬件的程序,充当OS与设备控制器之间的桥梁。