面试八股文
大约 5 分钟
面试八股文
将操作系统按子系统分类:
- 进程管理子系统:又大致包含调度模块;任务管理模块;同步模块;CPU模块。
- 内存管理子系统:又大致包含虚拟内存模块;内存映射模块;页表模块;物理内存模块。
- 文件子系统:又大致包含VFS模块;缓存模块;文件系统模块。
- 网络子系统:又大致包含套接字模块;协议栈模块;网络设备模块。
- 设备子系统:又大致包含字符设备模块;块设备模块。
操作系统调度相关
进程和线程
区别
进程 | 线程 | |
---|---|---|
基本单位 (本质区别) | 资源分配的基本单位 ,重量 | cpu调度基本单位,轻量 |
切换效率 并发性 | 低 并行 | 高,(上下文切换,现场运行环境) 并发 |
使用 | pthread_create | |
内存 隔离性与健壮性 | 独立虚拟内存 更好 | 共用虚拟内存,仅有较小的独立空间,栈 PC 本地存储 更差 |
所属关系 | 一个进程包括多个线程 | 依附进程 |
落地 | nginx 优点:一个进程宕机不影响其他 | redis 优点:内存数据库可以共用一个虚拟内存 缺点:加锁负担 |
上下文切换问题
保存现场运行环境
(当同一进程之间的线程切换时,不需要全部进行切换)
- (都切) cpu寄存器、程序计数器
- (线程不切) 用户空间的信息 (虚拟内存、堆栈等)、内核空间的信息、pcb (进程控制块)
调度核问题
- 多核cpu的调度一般由操作系统自己来,程序本身没有去涉及。但是之前接触过是有这种相关的场景,去手动调度多核cpu
系统调用
这章讲得太烂了,另外找资料学了:见操作系统相关笔记
描述系统调用整个流程
内核空间 用户态。
外部资源需要调用或操作内核的一些东西,如访问socket,则需要系统进行调用
系统调用的流程 (宏观上)
软中断
应用程序
函数库
函数调用
内核
中断
- 中断号 int 0x80
- 中断处理程序
- 中断向量表
系统调用的流程 (微观上)
- 触发中断。系统调用号放入eax(寄存器),并调用int 0x80
- 切换堆栈。用户态切换到内核态
- 执行中断程序。0x80->system_call,eax->系统调用号->系统调用表->处理函数,sys_read
- 从中断处理程序返回。iret将返回值返回并从内核态切换用户态
系统调用是否引起进程或线程切换?
- 不一定
- 如果阻塞io或io未就绪,将线程或进程切换。运行态->阻塞态
- 如果非阻塞io,会立刻返回,没线程或进程切换
保存运行现场
- cpu寄存器
- cpu存储的是用户态的指令
- cpu存储的是内核态的指令
操作系统内存相关
malloc是如何分配内存的
free是如何释放内存的,怎么确定释放内存的大小
页式管理与段式管理
这里讲得不好,另外找资料了。
参考:
内存条中的数据的管理分为
- 页式管理
- 段式管理
- 段页式管理 (综合两者)
分页
概念
分页是一种存储机制,它允许操作系统以页面的形式将进程从辅助存储器检索到主存储器中在分页方法中,
主内存被划分为小的固定大小的物理内存块,称为帧。帧的大小应与页的大小保持相同,以最大限度地利用主存并避免外部碎片。分页用于更快地访问数据,它是一个逻辑概念。
页式存储管理
页式管理的划分
页式存储管理需要将一整块连续的内存中划分为多段(每段等长):目的是避免耗时地全部顺序查找
- 进程划分:每段称为逻辑页面,id为逻辑页号,逻辑地址 = 实际地址 = 逻辑页号*n + 页内地址
- 内存划分:每段称为页框,id为页框号,物理地址 = 实际地址 = 页框号*n + 页内地址
(我记得Windows好像还有个类似的叫簇的概念,但那个应该是文件系统相关的,不关内存事)
进程与内存的对应关系:页表(页表可通过寄存器加速,寄存器中的表叫块表)
多级页表:优化存放,解决越来越长的页表,如二级页表
反置页表:优化空间。传统页表id为进程,反置页表id是页框号,表里还多了进程号
页面置换算法
什么是页面置换
- 缺页中断 -> 内存已满 -> 置换一部分数据到磁盘
目标
- 尽量减少页面的换入换出次数
流程细节
页面置换算法有哪些
- 最佳页面置换算法,置换在未来最长时间不访问的页面
- 先进先出置换算法,选择在内存驻留时间最长的页面
- 最久未使用置换算法,选择最长时间没有被访问的页面
- 时钟页面置换算法(实现上为:LRU环形链表)
- 最不常用置换算法,选择访问次数最少的页面
操作系统网络相关
见另一笔记