gem-universe / blog

0 stars 0 forks source link

[操作系统]24. 进程的实现 #28

Open supergem3000 opened 8 months ago

supergem3000 commented 8 months ago

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大小核问题、能耗问题。 调度是一个十分复杂的问题,可以先了解个大概基本原理。