秋招斩获所有互联网大厂面经之操作系统

>> 背熟,唯手熟尔,大家都这么厉害,只能记得更准才行。
 
1
虚拟技术
① 主要有两种虚拟技术:时分复用技术和空分复用技术。
② 多个进程能在同一个处理器上并发执行,使用了时分复用技术。
③ 虚拟内存将物理内存抽象为地址空间,每个进程都有各自的地址空间,这里面使用了空分复用技术。
 
 

-----------------------------------

2
进程与线程的区别
  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 进程有独立的内存单元,多个线程共享内存
  • 进程是操作系统资源分派的基本单位,线程是CPU调度和分派的基本单位。
  • 进程开销大,线程开销小。
 
 

-----------------------------------

3
进程状态的切换
1、进程有三种状态:就绪、运行、阻塞。
2、只有就绪和运行可以相互转换,其他都是单向转换。
3、就绪状态通过调度算法获得CPU时间,转换为运行状态;运行状态用完CPU时间后就会转换为就绪状态;运行状态缺少CPU时间之外的资源变成阻塞状态。
 
 

-----------------------------------

4
进程调度算法
① 批处理系统先来先服务(根据请求的顺序进行调度)、短作业优先(根据运行时间最短的顺序调度)、最短剩余时间优先(根据剩余时间的顺序调度)
② 交互式系统时间片轮转(所有进程排成一个队列,CPU时间首先分配给队首的进程,时间用完后将它送到队尾,同时继续把CPU时间分给下一个队首)、优先级调度(按照优先级进行调度)、多级反馈队列(为需要连续执行多个时间片的进程设置多个队列,能够减少需要交换的次数)。
③ 实时系统抢占式优先级调度
 
 

-----------------------------------

5
进程同步
① 进程同步的主要任务
是对多个相关进程在执行次序上进行协调,使得并发执行的各个进程之间能有效地进行资源共享和相互合作,从而使程序的执行具有可再现性
② 进程同步的四大原则:
1、空闲让进:临界区没有进程,可以进入。
2、忙则等待:临界区有进程,其他进程需要等待。
3、有限等待:应该保证进程能在有限时间内进入临界区。
4、让权等待:当进程不能进入自己的临界区时,应立即释放。
 
 

-----------------------------------

6
进程同步与互斥
  • 同步:多个进程因为合作产生的制约关系,使得进程有一定的先后执行次序。
  • 互斥:多个进程在同一时刻只有一个进程能进入临界区。
 
 

-----------------------------------

7
临界资源和临界区
一次只允许一个进程使用的共享资源称为临界资源,如打印机、公共变量等;而在并发进程中与共享变量有关的程序段称为临界区。
 
 

-----------------------------------

8
信号量
1、信号量是一种特殊的变量,用来表示系统中资源的使用情况。整型信号量就是一个整型变量。
2、当它大于0时,表示系统中对应可用资源的数目。
3、当它小于0时,其绝对值表示因为该资源而处在等待状态的进程的数目。
4、当它等于0,表示系统中对应资源已用完,并且没有因为该资源处在等待状态的进程。
 
 

-----------------------------------

9
对信号量的操作
PV操作
p操作(wait):申请一个单位资源,在进程进入临界区前执行;
v操作(signal):释放一个单位资源,在进程退出临界区之后执行。
 
 

-----------------------------------

10
进程通信
1、管道:单向字节流,写进程在管道的尾端写入数据,读进程在管道的首端读出数据。
2、信号量:是一个计数器。
3、消息队列:在系统内核中用消息链表保存消息的队列
4、共享内存:共享内存允许多个进程访问同一个逻辑内存。
5、套接字:可以用于不同机器间的进程通信
6、共享存储:允许多个进程共享一个给定的存储区,如剪贴板。
 
 

-----------------------------------

11
程序从写好到执行有哪些阶段?
一共有四个阶段:
  • 预处理阶段:处理以 # 开头的预处理命令;
  • 编译阶段:将源文件翻译成汇编文件;
  • 汇编阶段:将汇编文件翻译成可重定位目标文件;
  • 链接阶段:将可重定位目标文件和 printf.o 这些预先编译好的目标文件进行合并,得到最终的可执行目标文件。
 
 

-----------------------------------

12
静态链接
1、静态链接器的功能:以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件。
2、静态链接器的任务
  • 符号解析:每个符号对应于一个函数、全局变量或静态变量,符号解析的目的是将符号引用与符号定义关联起来。
  • 重定位:链接器把符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使它们指向这个内存位置。
 
 

-----------------------------------

13
目标文件
  • 可重定位目标文件可重定位目标文件在链接阶段合并,创建一个可执行目标文件;
  • 可执行目标文件:可以直接在内存中执行;
  • 共享目标文件:这是一种特殊的可重定位目标文件,可以在运行时被动态加载。
 
 

-----------------------------------

14
动态链接
1、静态库存在两个问题:
① 当静态库更新时,整个程序都要重新链接
② 对于 printf 这种标准函数库,如果每个程序都要有一份,就会造成极大的资源浪费。
2、动态链接共享库可以解决这两个问题,在 Linux 下是 .so,在 Windows 下是 DLL
3、动态链接库有两个特点:
① 在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到可执行文件中; 
② 在内存中,一个共享库的机器代码副本可以被不同的进程共享。
 
 

-----------------------------------

15
死锁
一、死锁概念及原理
① 概念:多个并发进程因争夺系统资源而产生相互等待的现象。
② 原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
③ 本质原因:
- 系统资源有限
- 进程推进顺序不合理
二、死锁产生的4个必要条件
① 互斥某种资源一次只允许一个进程访问。
② 占有且等待一个进程本身占有一种或多种资源,还在等待其他进程释放资源。
③ 不可抢占别人已经占有了某项资源,不能因为自己也需要该资源,就去把别人的资源抢过来。
④ 循环等待存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
三、避免死锁的方法
互斥条件不能改变,只能从其他三个条件入手:
① 破坏“占有且等待”条件:开始运行之前,必须一次性地申请全部资源;或者运行过程中逐步释放资源。
② 破坏“不可抢占”条件:已经占有资源的进程提出新的申请无法满足时,必须释放已经占有的资源。
③ 破坏“循环等待”条件:占有编号为i的资源时,只能申请编号大于i的资源。
死锁避免——使用前进行判断。
① 如果一个进程的请求会导致死锁,则拒绝。
② 如果一个进程增加资源的请求会导致死锁,则拒绝。
具体实现通常利用银行家算法。
死锁检测与解除——检测到系统进入死锁,进行恢复。
① 抢占资源:从其他进程中抢占资源分配给死锁进程。
② 终止进程:终止或撤销系统中的死锁进程。
 
 

-----------------------------------

16
银行家算法
1、当进程首次申请资源时,如果系统现存的资源满足该进程的最大需求量,则分配资源,否则推迟分配;
2、当进程在执行时申请资源,如果系统现存的资源满足其需求,则分配资源,否则推迟分配。
 
 

-----------------------------------

17
什么是虚拟内存?虚拟内存有什么优势?
虚拟内存
1、虚拟内存是一种计算机内存管理技术,它使得应用程序认为它拥有连续可用的内存。而实际上它是被分割成多个物理内存碎片,还有部分暂时存储在外部存储器上。
2、与没有使用虚拟内存技术的系统相比,使用这种技术使得大型程序的编写变得更容易,对真正的物理内存的使用也更有效率。
虚拟内存的优势:
1、用户程序开发方便
2、保护内核不受恶意或者无意的破坏
3、隔离各个用户进程
 
 
 

-----------------------------------

18
页面置换算法
1、什么是页面置换:在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,则必须从内存中调出一个页面到磁盘对换区中来腾出空间。
2、页面置换算法的主要目标是使缺页率最低。
3、页面置换算法种类:
① 最佳置换算法
选择最长时间内不再被访问的页面,是一种理论的算法。
② 最近最久未使用:
LRU,Least Recently Used, 将最近最久未使用的页面换出。
③ 最近未使用
NRU, Not Recently Used, 每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。就会有00/01/10/11四种状态,NRU算法将编号最小的换出。
④ 先进先出
FIFO,将最先进入的页面换出。
⑤ 第二次机会算法
为了解决FIFO可能把经常使用的页面置换出去,对页面设置一个R位,如果R为1,则清零后放入尾部,然后继续从头部搜索。
⑥ 时钟
环形链表连接所有页面,然后使用一个指针指向最早的页面。
 
 

-----------------------------------

19
什么是缓冲区溢出?有什么危害?其原因是什么?
概念:缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害有以下两点:
  • 程序崩溃,导致拒绝服务
  • 跳转并且执行一段恶意代码
原因:程序中没有仔细检查用户输入。
 
 

-----------------------------------

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

-----------------------------------

21
磁盘结构
1、一个磁盘有多个盘面,一个盘面有多个磁道,一个磁道有多个扇区。
2、磁头进行电磁信号的转换,制动手臂在磁道之间移动磁头,主轴使整个盘面转动。
 
 

-----------------------------------

22
磁盘调度算法
读写时间的影响因素有:
1、旋转时间
2、寻道时间
3、实际的数据传输时间
寻道时间最长,磁盘调度的主要目标是使平均寻道时间最短。
调度算法:
1、先来先服务:按照磁盘请求的顺序进行调度。
2、最短寻道时间优先:优先调度当前与磁头位置最近的磁道。
3、电梯算法:总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。
 
 

-----------------------------------

23
C语言的内存布局
五大分区:BSS 段、数据段、代码段、堆、栈。
① BSS 段:存放未初始化的全局变量。
② 数据段:存放已初始化的全局变量。
③ 代码段:存放程序的执行代码。
④ 堆:动态分配内存,对应于 malloc / free.
⑤ 栈:存放局部变量。
--------------------------------
1、包括BSS 段、数据段、代码段
2、BSS:存放程序中未初始化的全局变量。
3、数据段存放程序中已初始化的全局变量,包含三个部分:堆(malloc/free)、栈(局部变量)、静态数据。
4、代码段:存放程序执行代码。
 
 

-----------------------------------

24
JAVA对象的内存布局
1、普通对象:对象头8个字节、类指针不压缩8个字节、成员变量不压缩8个字节、Padding对齐8的倍数。
2、数组对象:比普通对象多了4个字节的数组长度和数组数据。
 
 

-----------------------------------

25
请简单描述一下垃圾回收器的基本原理是什么?还有垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?
1、对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。
2、通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
3、可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
4、垃圾收集算法:标记-清除、标记-整理、复制、分代收集。
 
 

-----------------------------------

26
C的字节对齐
1、概念:将各种类型的数据按照一定规则在空间上排列,用空间换时间。
2、必要性:
① 字节对齐可以提升读取效率
② 某些平台访问一个没有进行对齐的变量会发生错误,因此需要字节对齐。
 
 

-----------------------------------

27
进程的内存布局
1、BSS:存放程序中未初始化的全局变量。
2、数据段:存放程序中已初始化的变量,包含三个部分:堆(malloc/free)、栈(局部变量)、静态数据。
3、代码段:存放程序执行代码。
4、共享库的内存映射区域:
 
 

-----------------------------------

28
线程崩溃对进程和其他线程的影响?
1、不一定会全部崩溃,要分具体的情况。
2、如果一个线程内存溢出,不会崩溃,该线程崩溃后资源会立即被释放。
3、线程崩溃的本质是内存出错,当出错的内存没有被其他线程访问,也不会产生问题。
 
 

-----------------------------------

29
go协程为什么比线程轻量?
  • go 协程占用内存小,go 协程大概几kb,而线程默认1MB。
  • go 协程的切换效率高,仅修改了 PC/SP/DX 三个寄存器。
 
 

-----------------------------------

30
什么是操作系统?
① 概念:操作系统 Operating System,简称 OS,是管理计算机硬件和软件资源的程序,为用户提供了操作界面
② 本质:操作系统本质上是运行在计算机上的软件程序。
③ 组成:操作系统分为内核和外壳。内核能操作硬件,外壳是围绕着内核的应用程序。
 
 

-----------------------------------

31
系统调用
① 首先说用户态与系统态
用户态:user mode, 用户态的进程可以直接读取用户程序的数据。
系统态:kernel mode,系统态的进程几乎可以访问计算机的任何资源。
② 我们运行的程序都是在用户态,可以通过系统调用调用系统态的程序。
③ 系统调用的分类:设备管理、文件管理、内存管理、进程控制、进程通信。
 
 

-----------------------------------

32
线程的同步方式
① 临界区:在任意时刻只允许一个进程对共享资源进行访问。
② 互斥量:只有拥有互斥对象的线程才有访问公共对象的权限。
③ 信号量:允许同时访问,但是需要控制访问的最大线程数量。
④ 事件:wait / notify, 通过通知的方式保持多线程同步。
 
 

-----------------------------------

33
内存管理机制
连续的有:
① 块式管理:将内存分成固定大小的块,需要的话就分配一块,容易形成碎片。
非连续的有:
① 页式管理:将主存分为大小相等的一页一页的形式,通过页表对应逻辑地址和物理地址。
② 段式管理:将主存分为有实际意义的一段一段的形式,通过段表对应逻辑地址和物理地址。
③ 段页式管理:结合两者的优点,先分成若干段,每个段再分成若干页,段段之间、页页之间都是离散的。
分页2次、分段2次、段页式3次访存
 
 

-----------------------------------

34
快表和多级页表
快表
① 用途:加速虚拟地址到物理地址的转换。
② 理解:是一个特殊的高速缓存,存有页表的一部分或全部内容,CPU 读取数据时需要访问两次主存,使用快表只需要一次。
③ 流程:首先查询快表,如果在快表中,直接读取物理地址;如果不在快表中,从页表中读取,放入快表中再返回;快表填满后,按照一定的策略淘汰。
多级页表
① 用途:时间换取空间,避免全部的页一直在内存中。
② 举例:以二级页表为例,极端情况下,一级页表在内存中,二级页表只有一个在内存中,其他都在磁盘中,此时占用空间就缩小了。
 
 

-----------------------------------

35
局部性原理
① 理解:在某个较短的时间段内,程序执行局限在一小部分。
② 分类:
时间局部性:执行过的指令可能再次被执行,访问过的数据可能再次被访问,是因为存在循环。
空间局部性:存储单元被访问,它附近的存储单元也可能被访问,是因为数据和指令一般都是顺序的。
③ 应用
快表、cache、虚拟存储器
 
 

-----------------------------------

36
内存管理主要是做什么?
① 内存空间的分配与回收。
② 内存空间的扩充:通过虚拟存储或者自动覆盖技术,在逻辑上扩充内存。
③ 地址转换:将逻辑地址转换为物理地址。
④ 存储保护:保护操作系统不收用户进程影响、保护用户进程不受其他用户进程的影响、防止地址越界。
 
 

-----------------------------------

37
网页里的tag属于进程还是线程
进程,任务管理器的详细信息可以看出。
 
 

-----------------------------------

38
堆和栈的区别
① 分配方式:堆是程序员手动,分配方式类似于链表,栈是操作系统自动,分配方式类似于数据结构中的栈。
② 大小限制:堆不连续,大小只受制于虚拟内存,栈连续,大小是预先设定好的。
③ 碎片问题:堆会造成大量的碎片,栈不会。
④ 生长方向:堆是向上生长,栈是向下生长。
 
 

-----------------------------------

39
操作系统中异常是怎么处理的
① 概念:由正在执行的指令引发的问题,如算术溢出、地址越界等。
② 系统调用、页故障、页错误、保护性异常、其他程序异常
③ 处理:检测到异常后,通过一张异常跳转表,跳转并执行异常处理程序。
 
 

-----------------------------------

40
堆栈内存具体是怎么申请的
堆:molloc / free,手动释放,向上生长。
栈:alloca,自动释放,向下生长。
 
 

-----------------------------------

41
协程是什么
协程的英文是 coroutine,比线程更加轻量。一个线程可以有多个协程。协程不是由操作系统内核管理,而是完全由程序控制。协程的开销远远小于线程的开销。
 
 

-----------------------------------

42
断点的底层是怎么实现的
通过 CPU 的特殊指令 int 3 来实现的。
 
 

-----------------------------------

43
线程上下文切换切换了啥
线程 id、线程状态、堆栈、寄存器,寄存器包括 SP 堆栈指针、PC 程序计数器、EAX 累加计数器。
 
 

-----------------------------------

44
进程、线程上下文切换的区别
线程切换,虚拟空间内存是相同的,而进程切换虚拟空间内存是不同的。
 
 

-----------------------------------

45
栈溢出是什么
栈能使用的内存是有限的,在编译的时候就已经决定了,运行期间不能改变,如果程序使用的栈内存超出了最大值,就会发生栈溢出 Stack Overflow,程序就会崩溃。
一句话来说就是栈内存是有限的,只有几兆。
 
 

-----------------------------------

46
大端和小端存储概念
① 大端存储:数据的高字节保存在内存的低地址中,低字节保存在高地址中。
② 小端存储:数据的高字节保存在内存的高地址中,低字节保存在低地址中。
 
 

-----------------------------------

47
进程空间从高位到低位都有些什么?
1、命令行参数和环境变量
2、栈
3、堆
4、未初始化的数据 (BSS段)
5、已初始化的数据
6、代码段
 
 

-----------------------------------

48
逻辑地址如何转换为物理地址
逻辑地址左移四位加偏移地址就是物理地址.
 
 

-----------------------------------

49
linux文件管理
常见的命令:
  • ls: 列出目录及文件名
  • cd: 切换目录
  • pwd: 显示目前的目录
  • mkdir: 创建一个新的目录
  • rmdir: 删除一个空的目录
  • cp: 复制文件或目录
  • rm: 移除文件或目录
  • mv: 移动文件与目录,或修改文件与目录的名称
 
 

-----------------------------------

50
操作系统内存管理,程序大量molloc和free会有什么后果(内存碎片话),怎么避免(伙伴系统)
① 后果:会产生内存碎片
② 原因:我的理解是这样,分配内存的时候都分配整块的,而释放的时候一般不会将内容信息再重新排列一次,所以,就有一些先前分配的在释放后,很难在下次分配中刚好分配完或者甚至不能分配出去,多次这样,就会有碎片产生。
③ 解决:伙伴系统,详细说明如下:
  • 原理:Linux内核中引入了伙伴系统算法(buddy system)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。例如,大小为16个页框的块,其起始地址是16*212(212=4096)的整数倍。
  • 举个例子:假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找。如果1024块存在,则将其中的256页框作为请求返回,剩余的768分成256块和512块分别插到相应的链表中。如果仍然没有,则返回错误。
 
 

-----------------------------------

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichaelToLearn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值