提纲
操作系统,我感觉我的掌握应该非常扎实。首先我大三学操作系统就很认真,课设做的也自我感觉不错。大三的科研助理我做的操作系统知识图谱,当时对着书本去构造知识图谱,可以说很扎实了。大四毕业设计也是这个,纸上谈兵起码是没问题的。
大四考研有学习了清华的操作系统,而且我个人做了很长时间的二进制安全的学习。研究生和工作之后也每年会看一遍南京大学 jyy 的操作系统。说实话,我感觉还挺遗憾没做操作系统的相关研究的。
下面是各个目录的内容:
- Jiang-OS: 里面是对南京 jyy 老师的操作系统课程个人笔记。
- Kaoyan: 考研学习操作系统,个人准备的问答题,我在最后两三个月经常会过一遍,感觉这样效率很高。
- 个人笔记:个人学习时不懂的地方的记录
下面是一些整理的问题:
Shell 处在内核态还是用户态?
Shell 本身运行在用户态,它通过调用 fork()、execve() 等系统调用封装函数实现程序的加载和运行。
在执行这些系统调用函数的过程中,会通过 int 0x80 指令陷入内核,从而在内核态由内核代码实现相应的子进程创建、程序加载等工作。
CISC(复杂)有哪些优点,看书上似乎RISC是完美的?
程序短小:这个可以理解,一条指令可以完成多个事情,在内存十分昂贵(现在也很重要)的远古时代,很占优势。
补充说明:此外还有其他优势,不过那个可能就不是我们要掌握的东西了。而且当今RISC和CISC没有明确界限,两者在相互借鉴。
移码会用在哪里,为什么要用它?
移码用于浮点数中的阶码。好处:便于比较大小,浮点数经常会对指数比较。
浮点数可以先对指数比较。对于移码可以直接就用无符号比了,即直接从高到低比较了。对于补码,需要特殊的有符号比较器,总体而言麻烦一点。
当然这一点感觉有点苛责了。为什么整数不用移码?因为移码不适合加减运算,尤其是减法的溢出自动处理。浮点数的指数相对就用于排序多一点。
程序加载和运行过程
- Shell命令行输入命令
- Shell命令行解释器构造argv和envp
- 调用fork函数
- 调用execve函数 -→ 写时复制
- 调用该进程的main函数
为什么说设备驱动让内核变得庞大复杂?按理说内核只需要处理核心程序,驱动由各个厂商作为接口提供?
理论上这样。但现实是为了方便、安全等等各种因素,内核会合并许多设备的驱动代码... 我对于该问题和 AI 的对话
进程是怎么知道自己页表放在哪的
有专门寄存器表示当前进程的页表基地址(x86 是 CR3),寄上下文切换就从 PCB 调出
为什么要多级页表,阐述其好处
节省空间,因为二级页表可以不存在,二级页表可以不在内存
FAT 同样是链式存储,改进究竟改进在哪里?
把链表指针集中放在磁盘的一个表里。管理方便、可以一口气读到内存里,之后调度很快、容错和恢复方便等等... 具体可以看 jyy 的课程。
当CPU占有率较低,IO设备占有率较低,但是磁盘交换空间却很繁忙时,需要如何改进?
交换频繁,说明频繁使用虚拟内存。CPU 计算低、IO 操作低,说明内存用的不好,增加内存条或者优化内存使用。
U盘上应该采用什么调度算法,C-SCAN吗?
对于U盘和SSD等随机访问的Flash半导体存储器,采用FCFS(先来先服务)调度策略更高效。 因为Flash的半导体存储器的物理结构不需要考虑寻道时间和旋转延迟,随机访问速度和顺序访问差别不大,可直接按I/O请求的先后顺序服务。
U盘这种实际内部有一小段调度程序。