操作系统面试总结(持续更新ing)
操作系统面试总结
1.操作系统引论
1.1 操作系统的特点
-
并发:同一个时间段内多个程序执行
-
共享:系统中的资源可以被内存中多个并发进/线程共同使用
-
虚拟:通过时分复用以及空分复用(如虚拟内存)把一个物理实体虚拟为多个
-
异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进
1.2 操作系统的主要功能
-
进程管理
进程控制、进程同步、进程通信、进程调度
-
内存管理
内存分配、内存保护、地址映射、内存扩充
-
设备管理
管理所有外围设备,包括完成用户IO请求,为用户进程分配IS设备,提高IO设备利用率,提高IO速度,方便IO使用
-
文件管理
管理用户文件和系统文件,方便使用的同时保证安全性。包括磁盘存储空间管理,目录管理、文件读写管理以及文件共享以及保护
-
提供用户接口
程序接口如API和用户接口如GUI
1.3 各种操作系统的区别
- 批处理操作系统:成批处理、系统吞吐量高、资源利用率高、用户不能干预作业的执行
- 分时操作系统:多路性、独立性、及时性、交互性
- 实时操作系统:及时响应、快速处理、高可靠性和安全性、不要求系统资源利用率
1.4 操作系统的主要组成部分
-
进程和线程的管理
-
存储管理
-
设备管理
-
文件管理
1.5 动态链接库和静态链接库的区别
- 静态链接库是
.lib
格式,一般在工程的设置界面中加入工程。程序编译时会把lib文件代码加入到程序中,因此会增加代码大小,不能手动移除lib文件 - 动态链接库是
.dll
格式,程序运行时动态转入内存的模块,在程序运行时是可以随意加载和移除的,节省内存空间
2.进程与线程
2.1 进程和线程的区别
进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位,是资源分配的最小单位
线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的可以独立运行的独立单位
进程和线程的区别:
-
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
-
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
-
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
-
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
-
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
-
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
2.2 协程
线程:抢占式调度
协程:协同式调度,避免了无意义调度,可以提高性能,但程序员必须自己承担调度的责任。协程也失去了标准线程使用多CPU的能力
2.3 用户态和核心态
用户态:运行在用户态下的程序只能受限地访问内存,不允许访问外围设备。占用CPU的能力被剥夺,CPU资源资源可以被其它程序获取。
核心态:运行在内核下的程序可以访问内存所有数据,包括外围设备。
用户态切换到核心态的三种方式:
- 系统调用:用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用,申请使用操作系统提供的服务程序,以完成工作。
- 异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,会触发由当前运行进程切换到处理此异常的内核相关程序中。因此也就转到了内核态,比如缺页异常。
- 外围设备终端:外围设备完成用户请求的操作后,会像CPU发送相应的中断信号。此时,CPU会暂停执行下一条即将要执行的指令,转而执行与中断信号对应的处理程序。如果先前执行的指令是用户态的程序,那么转换的过程自然就发生了由用户态到内核态的转换。
2.4 程序和进程的区别
- 程序是静态概念,进程是动态概念
- 程序没有并行特征,而进程有并行特征
- 程序不会竞争计算机系统资源,而进程是竞争计算机系统资源的基本单位
- 不同的进程可以包含同一个程序,只要该程序对应的数据集不同
2.5 多线程共享什么数据
- 进程代码段
- 进程的公有数据
- 进程打开的文件描述符
- 信号的处理器
- 进程的当前目录
- 进程用户ID与进程组ID
2.6 线程同步的方式
- 信号量:允许统一时刻多个线程访问同一个资源,但需要控制统一时刻访问此资源的最大线程数量
- 互斥量:实际上是信号量的一种特殊情况,允许统一时刻只有一个线程访问同一个资源
- 信号(或事件):通过通知操作的方式来保证多线程同步,还可以方便实现多线程优先级的比较操作
2.7 多线程锁实现多线程同步
其实遇到的不多,课本上没有展开讲这边的内容
互斥锁
保护临界区,确保同一时间,只有一个线程访问数据。
如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁
自旋锁
在获取到锁之前,一直处于循环检测保持者是否已经释放了锁。
与互斥锁的区别是,在申请自旋锁时,线程处于忙等状态,而非挂起状态
信号量
一个计数器,用来控制多个进程对共享资源的访问。
互斥锁为信号量的一个特殊情况。
读写锁
高级别锁,区分读和写,符合条件时,允许多个线程访问对象。
处于读锁时,允许其他线程和本线程的读锁,但不允许写锁。
处于写锁时,任何锁操作都会睡眠等待
递归锁
递归锁是互斥锁的一个特殊情况。同样地,只能由一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时,反复对锁进行加锁操作
2.8 死锁以及产生条件
死锁的产生条件:互斥条件、请求与保持、不可剥夺、循环等待
- 互斥条件:一个资源一次只能被一个进程使用
- 请求与保持:一个进程因为请求资源而阻塞时,对其自身拥有的资源保持不放
- 不可剥夺:进程获得的资源,在未使用完全之前,不能强行剥夺
- 循环等待:若干进程之间形成的一种头尾相接的环形资源等待关系
解决死锁的方法:预防死锁、避免死锁、检测死锁、解决死锁
- 预防死锁:确保死锁发生的4条件至少有一个不成立
- 避免死锁:动态监测资源分配情况,确保循环等待条件不成立,使系统处于安全状态
- 解决死锁:包括进程终止和资源抢占(选择一个牺牲品/回滚/饥饿)
2.9 进程的通信方式
-
管道通信:
分为三种:普通管道PIPE、命名管道NAME_PIPE、流管道S_PIPE
-
普通管道为半双工,只能单向传输,只能在父子进程间使用
-
流管道去除了第一种限制,可以双向传输
-
命名管道去除了第二种限制,可以在许多并不相关的进程之间进行通讯
- 系统ICP通信(消息队列、共享内存、信号量):
- 消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识
- 共享内存:共享内存是映射一段能被其他进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。共享内存是最快的IPC方式
- 信号量:信号量是一个计数器,用来控制多个进程对资源的访问,通常作为一种锁机制
- SOCKET:套接口也是一种进程间通信机制,它可用于不同主机间的进程通信
2.10 进程的状态
就绪状态:进程已经获得了除处理机以外的所需资源,正在等待分配处理机资源
运行状态:占用处理机资源运行,处于此状态的进程数小于CPU数
阻塞状态:进程等待某种条件,在条件满足之前无法执行
进程的状态转换有四种:
就绪—运行,如:当前运行进程阻塞,调度程序选一个优先级最高的进程占有处理机
运行—就绪,如:当前运行进程时间片用完
运行—阻塞,如:当前运行进程等待键盘输入
阻塞—就绪,如:I/O操作完成,被中断处理程序唤醒
2.11 线程的状态
状态 | 含义 |
---|---|
创建 | 还未开始的线程,处于此状态 |
就绪 | 正在Java虚拟机里面执行的线程,处于此状态 |
阻塞 | 该线程阻塞于锁 |
等待 | 进入该状态的线程需要等待其他线程做出一些特定动作,比如通知或中断 |
超时等待 | 该状态不同于等待,在该状态的线程,只会在一个特定时间内等待其他线程执行特定动作。若其他线程一直不执行,它可自行返回 |
终止 | 已经结束的线程,处于此状态 |
2.12 进程调度策略
先来先服务、短进程优先、优先级、时间片轮转、多级反馈
2.13 进程同步机制
- 信号量机制
- 自旋锁管程
- 会合
- 分布式系统
2.14 临界区
每个进程中访问临界资源的那段程序块被称为临界区。每次只允许一个进程进入临界区,进入后不允许其他进程进入。
- 若有若干进程请求进入临界区,一次只允许一个进入
- 若已有进程进入临界区,则其他进程必须等待
- 进入临界区的进程必须在有限时间内退出
- 如果进程不能进入临界区则必须出让CPU
2.15 中断与轮询
中断是在计算机执行期间,系统内发生任何非寻常或非预期的急需处理时间,使得CPU中断当前正在执行的程序,而转去执行相应的事件处理程序。处理完毕后,处理器又返回原来被中断的地方,继续执行或调度新的进程。
-
缺点:容易遗漏一些问题
-
优点:效率高
轮询是系统定时对各种设备轮流询问一遍是否有处理要求。有要求的,则加以处理。轮询占据了CPU相当一部分处理时间,是一种效率较低的方式。
- 缺点:效率低,等待时间长,CPU利用率低
3.存储管理
3.1 Windows下的内存管理
Windows提供了3种方法进行内存管理,分别为:
- 虚拟内存,适用于管理大型对象或者数据结构
- 内存映射文件,适用于管理大型数据流以及在单个计算机上运行多个进程之间的共享数据
- 内存堆栈,适用于管理大量小对象
Windows操作内存分为两个层面:物理内存和虚拟内存
3.2 内存连续分配
- 首次适应法:空闲分区以地址递增次序链接,分配内存时顺序查找,找到大小能满足要求的第一个空闲分区
- 最佳适应法:空闲分区按容量递增的次序链接,找到第一个能满足要求的空闲分区
- 最坏适应法:空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,也就是挑选最大的分区
3.3 分段和分页的区别
段式存储:符合用户视角的分配管理方案。在段式存储管理中,将程序的地址空间划分为若干段,如代码段、数据段、堆栈段。每个进程有一个二维地址空间,相互独立,互不打扰。
- 优点:没有内碎片(因为段的大小不固定)
- 缺点:产生外碎片
页式存储:一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中,将程序的逻辑地址划分为固定大小的页,而物理内存划分为同样大小的帧。程序加载时,可将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。
- 优点:没有外碎片(页的大小固定)
- 缺点:有内碎片,一个页可能填充不满
两者的区别:口诀(目大地信内)
- 目的不同:分页是由于系统管理的需要,是信息的物理单位。分段是由于用户的需要,是信息的逻辑单位。
- 大小不同:页的大小固定,由系统决定。段的大小不固定,由其完成的功能决定。
- 地址不同:页向用户提供一维地址空间,段向用户提供二维地址空间
- 信息共享:页的保护和共享收到限制,段利于存储保护和信息共享
- 内存碎片:分页没有外碎片,但有内碎片;分段没有内碎片,但有外碎片
3.4 基本分页存储管理方式
【Ref:操作系统--基本分页存储管理方式 - 知乎 (zhihu.com)】
基本分页存储管理:
页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;但由于寄存器成本较高,且大多数现代计算机的页表又可能很大,使页表项的总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。在系统中只设置一个页表寄存器 PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的 PCB 中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。下图为分页系统的地址变换机构。
3.5 基本分段存储管理方式
【Ref:基本分段存储管理方式 - 简书 (jianshu.com)】
1、程序通过分段(segmentation)划分为多个模块,每个段定义一组逻辑信息。如代码段(主程序段main,子程序段X)、数据段D、栈段S等。
2、每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。
3、装入内存时,每段赋予各段一个段号。
4、每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)。各段大小不等。
5、地址结构:段号 + 段内地址 段表:记录每段实际存放的物理地址
3.6 缓冲区溢出以及危害
缓冲区溢出指的是,计算机向缓冲区填充数据时,超出了缓冲区本身的容量,溢出的数据覆盖在了合法的数据上。其危害有:
- 程序崩溃,导致拒绝服务
- 跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是因为程序中没有仔细检查用户输入。
3.7 虚拟内存
虚拟内存允许执行进程不必完全在内存中。
每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页。每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有页都在内存里才能运行程序。
当程序引用到一部分在物理内存中的地址空间时,由硬件进行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,操作系统负责将缺失的部分装入物理内存,并重新执行失败的指令。
3.8 虚拟内存的应用与优点
- 在内存中可以保留多个进程,系统并发度提高
- 解除了用户与内存之间的紧密约束,进程可以比内存的全部空间还大
访问虚拟内存时,会访问到 MMU(Memory Management Unit),去匹配对应的物理地址。如果内存已满,还会调用页面置换算法。
3.9 页面置换算法
- FIFO:先进先出
- LRU:最近最少使用,根绝使用时间到现在的长短来判断
- LFU:最近使用次数算法,根据使用次数判断
- OPT:最优置换算法,保证置换出去的页是不再被使用的页,或在实际内存中最晚使用(几乎无法在实际中操作)
3.10 堆和栈的区别
程序的内存分配:
- 堆:由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收
- 栈:由编译器自动分配释放,存放函数的参数值、局部变量的值等等
- 全局/静态区:
- 全局变量和静态变量是放在一起的
- 初始化的全局变量和静态变量放在一个区域
- 未初始化的全局变量和静态变量放在另一个区域
- 程序结束时由系统释放
- 文字常量区:常量字符串的存放位置,由操作系统在程序结束后释放
- 程序代码区:存放函数体的二进制代码
4.输入输出
4.1 磁盘调度算法
- FCFS:先进先出
- SSTF:最短寻道时间优先,可能会出现饥饿现象
- Elevator:向一个方向寻道,寻完后再向另一个方向寻道
5.Linux
5.1 Linux常用命令
ls
:显示文件目录
cd
:改变当前目录
mkdir
:建立子目录
rmdir
:删除子目录
cp
:复制文件
man
:获取帮助信息
less
:显示文件内容
type
:重定向与管道type
5.2 Linux文件基本属性
d 此为目录文件
r-x 属主拥有读和执行权限,没有写权限
r-x 属组拥有读和执行权限,没有写权限
r-x 其他用户拥有读和执行权限,没有写权限
6.参考资料
1.CSDN博客(春秋招Offer之os)【传送门】
本文来自博客园,作者:理想国的糕,转载请注明原文链接:https://www.cnblogs.com/SaltyCheese/p/16600298.html嗷~