操作系统
操作系统介绍
有三个主要部分:虚拟化(virtualization)、并发(concurrency)、持久性(persistence)
题目
一、(共10分)操作系统的设计目标有哪些?
- 抽象性:对硬件资源进行抽象,提供统一接口,简化程序开发;
- 并发性:支持多个程序同时运行,提高系统吞吐;
- 虚拟化:如虚拟内存、虚拟 CPU,使用户感觉拥有独占资源;
- 资源管理与调度:高效分配 CPU、内存、磁盘等资源,提升资源利用率;
- 安全与保护:防止程序互相干扰,保护用户数据;
- 用户友好性:提供简洁易用的接口和良好的使用体验。
六、( 共 10 分)UNIX 系统采用了一种非常有趣的创建新进程的方式,即通过一对系统调用:
fork()和 exec(),解释说明 fork()和 exec()的作用(5 分),以 UNIX 的 Shell 为例说明为什么设
计这两个系统调用(5分)。
- fork()创建一个和父进程几乎相同的子进程,除了PID等一些信息不同其它完全一样。
- exec()用新的程序替换掉当前程序执行的内容,不改变其PID等信息。
UNIX SHELL启动一个新程序的时候,先通过fork()创建一个子进程,再通过exec()加载并执行用户命令,这样父进程(shell)仍能工作,分离设计提供灵活性。
七、操作系统虚拟化CPU的机制是受限直接执行,为了实现这个机制,例举的硬件提供了哪些支持?简要说明操作系统如何利用硬件来实现LDE。
硬件
- 模式划分:被划分为用户态和内核态
- 中断机制:支持外设中断和系统调用陷入内核态。
- 定时器中断:防止单一进程长时间占用CPU资源,实现抢占功能。
- 内存保护机制:通过页表和地址空间隔离来保护内核
- 指令限制:一些特权指令如(I/O)只能被内核态执行。
操作系统可以将进程调度执行化为内核态以及用户态,用户态不能执行一些特权指令比如I/O,必须通过陷阱表的陷阱指令陷入内核态,并提供了从陷入返回指令回到用户态。操作系统还提供了中断机制,防止单一进程过度占用资源,而导致其他进程出现饥饿。结合内存保护,防止非法访问内核或其他进程内存区域,从而实现虚拟化CPU且保证系统安全和稳定。还有上下文切换,通过寄存器保存当前进程的值,然后读取另一个进程的寄存器所存储的值进行运行。
1.三态:运行、就绪、阻塞
2.错误,进程在一个时刻只能处于一种状态。
3.错误,单核情况下,操作系统和进程需要通过时间片轮转轮流使用CPU,不会同时运行,操作系统也是一个程序。
程序运行
正在运行的程序会做一件非常简单的事情:从内存中读取指令,解码,并执行它,然后接着执行下一条指令。
总结为Fetch 、 Decode 、 Execute
操作系统可以让程序共享内存、与设备交互、运行的更容易,操作系统确保系统既易于使用、又正确高效运行。为了做到这一点,采用了虚拟化的技术,在一些硬件的帮助下,操作系统负责提供虚拟化,使得单个(或一小部分)CPU可以看似认为有无限数量的CPU,从而可以同时运行多个程序,但问题就是在调度,在特定时间运行,该运行哪个?所以操作系统也承担了**资源管理器(resource manager)**的角色。
虚拟化
虚拟内存,每个进程访问自己的私有虚拟地址空间,操作系统以某种方式映射到机器的物理内存上,打游戏的时候每个角色都有一个背包,背包的0号格子可能装有不同的东西,但并没有冲突,操作系统把编号0分到了不同的内存地址上。
每个程序都有自己的“背包”(内存空间),从地址 0 开始。但实际的物理内存只有一块
程序 A 的地址 0x1000 → 实际是 物理地址 0xA000
程序 B 的地址 0x1000 → 实际是 物理地址 0xC000
这就是虚拟内存:给程序看的假地址,每个程序都以为自己独占整片内存,其实操作系统做了“背后映射”。操作系统通过时间片轮转(time-sharing)技术虚拟化 CPU,将 CPU 时间划分成小片段,每次只分配给一个进程运行一个时间片,然后切换到其他进程,从而营造出“多个进程同时运行”的假象。这种时分复用机制使得单核 CPU 也能实现多任务并发。其代价是频繁的上下文切换带来一定的性能开销。
进程三态:运行、阻塞、就绪
fork()系统调用的返回值:父进程获得子进程的PID,子进程的返回值是0
受限直接执行
有两种模式:用户模式和内核模式,用户模式下功能受限,如I/O请求无法发送,但可以通过特殊的陷阱(trap)指令从用户模式进入内核模式,进入内核后系统就可以执行任何需要的特权操作,执行完成后,操作系统调用一个特殊的从陷阱返回(return-from-trap)指令回到用户模式。
多级反馈队列MLFQ
五条规则
- 任务A的优先级高于任务B,先执行任务A,再执行任务B(保证高优先级任务的响应速度,提高系统的实时性。)
- 任务A的优先级等于任务B,以轮询的方式执行任务A、B(在同等级中实现公平性,防止个别任务长期占用CPU。)
- 新任务进入队列,放在最高优先级的队列执行(提高新任务启动速度,增强系统交互性。)
- 一旦工作用完了其在某一层中的时间配额,无论中间主动放弃了多少次CPU,就降低其优先级。(避免任务通过频繁放弃CPU来“欺骗”调度器长期占用高优先级。)
- 经过一段时间S后,就将所有任务重新加入到最高优先级(避免低优先级任务长时间得不到执行,防止饥饿现象。)
调度-比例份额
彩票数(ticket)代表了进程(或用户或其他)占有某个资源的份额,一个进程拥有的彩票数占总彩票数的百分比,就是它占有资源的份额。拥有的彩票数越多,那被调度的概率也就越大。
三大特性:
- 彩票货币
- 彩票转让:一个进程临时将自己的彩票转移给另一个进程
- 彩票通胀:一个进程的彩票数可以临时提升或降低告诉操作系统我需要CPU。
步长调度:其实就是时间片轮转,执行完当前的步长然后去看看队列中现在谁的总步长最短,就去执行它,如果所有人的步长都相同了,那就随机抽一个去执行。