Open supergem3000 opened 8 months ago
24. 进程的实现 (jyywiki.cn) 进程的实现 pmap:进程拥有[0, 2^64)的地址空间,但这个地址空间是虚拟的。 计算机系统中存在一个数据结构,把虚拟内存地址翻译成物理内存地址。
24. 进程的实现 (jyywiki.cn)
pmap:进程拥有[0, 2^64)的地址空间,但这个地址空间是虚拟的。 计算机系统中存在一个数据结构,把虚拟内存地址翻译成物理内存地址。
虚假的地址空间 还没有使用到的地方,操作系统可以先不分配实际内存。操作系统只要用一个数据结构记录哪段内存是什么,因此进程可以使用超过物理内存的虚拟内存 (swap)。
不同的虚拟地址,可以映射到同一个物理地址,可以共享。比如只读到代码映射到内存,厉害的操作系统,同一份代码仅有一个副本。
写时复制(copy-on-write)。即使用了很多内存,fork依然可以瞬间完成。
操作系统在中断后选择进程执行,应该选哪一个?
UNIX niceness:-20 ~ 19的整数,越nice越让别人得到CPU。(好人卡)
Round-robin:轮转调度。计算线程较多时,vim之类的交互式线程,输入可能卡顿。 改进:多级反馈队列(MLFQ)。设置多个Round-Robin队列,每个队列对应一个优先级。
Complete Fair Scheduling(CFS):让系统里的所有进程尽可能公平地共享处理器。为每个进程记录运行时间,中断发生后,切换到运行时间最少的进程执行。 如何在公平的调度器上实现不同的优先级?Linux中进程记的时间不是真实的时间,是vruntime。每人执行1ms,好人的时钟快一些,坏人的时钟慢一些。
优先级反转 真实情况存在资源的争抢和等待。
void a() { // 最低优先级 mutex_lock(&wc_lock); // 先到先得 } void b() { // 中优先级 while (1) ; } void c() { // 高优先级 sleep(1); mutex_lock(&wc_lock); ... }
低优先级的进程先到,先拿到了锁。高优先级的两个进程随后到。如果优先调度高优先级的进程而不调度低优先级的进程,反而会导致高优先级的进程执行不下去。 解决优先级反转问题:困难。因为想要解决,操作系统需要知道哪些进程获得了哪些锁、什么时候释放。(Linux:摆烂,不解决)
多处理器调度 不能简单地“分配线程到某处理器”:某一个处理器的线程全都退出了,这个处理器开始摸鱼。 不能简单地“谁空分配给谁”:处理器之间迁移会导致cache白给。 实际情况:还有多用户、多任务等等情况,优先级很难解决。Big.LITTLE大小核问题、能耗问题。 调度是一个十分复杂的问题,可以先了解个大概基本原理。
虚假的地址空间 还没有使用到的地方,操作系统可以先不分配实际内存。操作系统只要用一个数据结构记录哪段内存是什么,因此进程可以使用超过物理内存的虚拟内存 (swap)。
不同的虚拟地址,可以映射到同一个物理地址,可以共享。比如只读到代码映射到内存,厉害的操作系统,同一份代码仅有一个副本。
写时复制(copy-on-write)。即使用了很多内存,fork依然可以瞬间完成。
处理器调度原理
操作系统在中断后选择进程执行,应该选哪一个?
UNIX niceness:-20 ~ 19的整数,越nice越让别人得到CPU。(好人卡)
Round-robin:轮转调度。计算线程较多时,vim之类的交互式线程,输入可能卡顿。 改进:多级反馈队列(MLFQ)。设置多个Round-Robin队列,每个队列对应一个优先级。
Complete Fair Scheduling(CFS):让系统里的所有进程尽可能公平地共享处理器。为每个进程记录运行时间,中断发生后,切换到运行时间最少的进程执行。 如何在公平的调度器上实现不同的优先级?Linux中进程记的时间不是真实的时间,是vruntime。每人执行1ms,好人的时钟快一些,坏人的时钟慢一些。
真实的处理器调度
优先级反转 真实情况存在资源的争抢和等待。
低优先级的进程先到,先拿到了锁。高优先级的两个进程随后到。如果优先调度高优先级的进程而不调度低优先级的进程,反而会导致高优先级的进程执行不下去。 解决优先级反转问题:困难。因为想要解决,操作系统需要知道哪些进程获得了哪些锁、什么时候释放。(Linux:摆烂,不解决)
多处理器调度 不能简单地“分配线程到某处理器”:某一个处理器的线程全都退出了,这个处理器开始摸鱼。 不能简单地“谁空分配给谁”:处理器之间迁移会导致cache白给。 实际情况:还有多用户、多任务等等情况,优先级很难解决。Big.LITTLE大小核问题、能耗问题。 调度是一个十分复杂的问题,可以先了解个大概基本原理。