操作系统面试(概述)
基本特征
并发 并发是指宏观上一段时间内运行多个程序,而并行是真正意义上同一时刻同事运行多个程序
并行需要硬件的支持,如多流水线、多核处理器或者分布式系统
操作系统通过引入进程和线程,使得程序能够并发运行
共享 共享是指系统中的资源可以被多个并发进程共同使用
共享可以分为互斥共享和同时共享
互斥共享的资源成为临界资源,例如打印机,在同一时刻只能有一个进程进行资源访问,需要使用同步机制保证互斥访问
虚拟 虚拟技术把一个物理实体转换为多个逻辑实体
主要有两种虚拟技术:(时间)分复用技术与(空间)分复用技术
多个进程在同一处理器上并发执行使用了(时间)分复用技术,多个进程轮流在一个处理器其上执行一个小的时间片并进行快速切换。
虚拟内存使用了(空间)分复用技术,他将物理内存抽象为地址空间,每个进程都有自己的地址空间。地址空间的页被映射到物理内存,但是不需要全部在物理内存中,当使用到一个没有在物理内存中的页时,使用页面置换算法,将该页置换到内存中。
tips:页面置换算法
- 最优页面置换算法(OPT):置换在未来最长时间访问的页面 算法实现:
- 缺页时,计算内存中每个逻辑页面的下一次访问时间
- 选择未来最长时间不访问的页面
- 缺页最少,是理想情况
- 实际系统中无法实现
- 无法预知每个页面在下次访问前的等待时间
- 这个算法可以作为置换算法的性能评价依据
- 先进先出(FIFO)页面置换算法:优先置换最早进入内存的页面 算法实现:
- 维护一个记录所有位于内存中的逻辑页面链表
- 链表元素按驻留在内存的时间排序,链首最长,链尾最短
- 出现缺页时,替换链首,新页面添加到链尾
- 实现简单
- 性能较差,调出的页面可能是经常访问的
- 进程分配物理页面数增加是,缺页并不一定减少(Belady现象)
- 很少单独使用
- 最近最久未使用(LRU)算法:选择长时间没有被引用的页面进行置换,如果某些页面长时间未被访问,则他们在将来还可能会长时间不访问。 算法实现:
- 缺页时,计算每个逻辑页面的上一次访问时间
- 选择上一次使用到当前时间最长的页面
最优置换算法的一种近似
LRU算法的可能实现的方法:
- 页面链表
- 系统维护一个按最近一次访问时间排序的页面链表
- 链表首节点是最近刚刚访问过的页面
- 链表尾节点是最久未被使用的页面
- 访问内存是,找到相应页面放在链表首部
- 缺页时,替换链表尾部
- 活动页面栈
- 访问页面时,将页号压入栈顶,并将相同页号的弹出
- 缺页时,置换栈底的页面
4.时钟置换算法(Clock):对页面的访问情况进行大致估计 数据结构:
- 在页表项中增加访问未,描述页面在过去一段时间的访问情况
- 各页面组织成环形链表
- 指针指向最先调入的页面
- 访问页面时在页表项纪录页面访问情况
- 缺页时,从指针出开始顺序查找未被访问的页面进行置换
时钟算法是LRU和FIFO的折中
时钟置换算法的实现:
- 页面装入内存时,访问位初始化为0
- 访问页面(读/写)时,访问位置1
- 缺页时,从指针当前位置顺序检查环形链表
- 访问位为0,置换该页
- 访问位为1,访问位置0,并移动指针到下一个页面,直到找到可置换的页面
减少修改页的缺页处理开销
实现:
- 在页面中增加修改位,并在访问时进行相应修改
- 缺页时,修改页面标志位,以跳过有修改的页面
缺页时,置换访问次数最少的页面
【操作系统|操作系统面试(概述)】算法实现:
- 每个页面设置一个访问计数(多位计数)
- 访问页面时,访问计数加1
- 缺页时,置换计数最小的页面
- 算法开销大
- 开始时频繁使用。但以后不使用的页面很难置换
基本功能
1.进程管理 进程控制、进程同步、进程管理、死锁处理、处理机调度等
2.内存管理 内存分配、内存共享与保护、地址映射、虚拟内存等
3.文件管理 文件存储空间的管理、文件目录管理、文件读写管理和保护
4.设备管理 完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率
主要包括缓冲管理、设备分配、设备处理、虚拟设备等
系统调用
如果一个进程在用户态需要使用内核态的功能,就进行系统调用陷入内核,由操作系统代为完成。
[外链图片转存失败(img-I3LWJz27-1562162540111)(https://github.com/CyC2018/CS-Notes/blob/master/notes/pics/tGPV0.png?raw=true)]
inux 的系统调用主要有以下这些:
Task | Commands |
---|---|
进程控制 | fork(); exit(); wait(); |
进程通信 | pipe(); shmget(); mmap(); |
文件操作 | open(); read(); write(); |
设备操作 | ioctl(); read(); write(); |
信息维护 | getpid(); alarm(); sleep(); |
安全 | chmod(); umask(); chown(); |
1.大内核 大内核是将操作系统功能作为一个紧密结合的整体放到内核。由于各模块共享信息,因此有很高的性能。
2.微内核 由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。
在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。
因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失
[外链图片转存失败(img-3USZaFtS-1562162540112)(https://github.com/CyC2018/CS-Notes/blob/master/notes/pics/2_14_microkernelArchitecture.jpg?raw=true)]
中断分类
1.外中断 由CPU执行指令以外的事件引起,如I/O完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出的请求。此外还有时钟中断、控制台中断等
2.异常 由于CPU指令执行的内部事件引起,如非法指令、地址越界、算术溢出等。
3.陷入 在用户程序中使用系统调用
存中…(img-3USZaFtS-1562162540112)]
中断分类
1.外中断 由CPU执行指令以外的事件引起,如I/O完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出的请求。此外还有时钟中断、控制台中断等
2.异常 由于CPU指令执行的内部事件引起,如非法指令、地址越界、算术溢出等。
3.陷入 在用户程序中使用系统调用
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- linux笔记|linux 常用命令汇总(面向面试)
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 面试|我经历的IT公司面试及离职感受(转)