《Operating Systems: Three Easy Pieces》(3)

背景

这个系列的第三篇笔记对应的是书中的《Mechanism: Limited Direct Execution》,主要内容是对之前说过的 time sharing 介绍了一点稍微深入的东西。

Challenges Of Time Sharing

Time sharing 从定义来说很简单,就是单个 CPU 运行一个 process 一段时间,然后在运行其它 process 直到所有 process 结束。但是在建立这个机制之前,我们还需要考虑两个问题:

  • performance
  • control
    第一点很容易理解,这几乎是任何一个大型系统都要考虑的问题,性能问题。操作系统进行 process 的切换会不会对性能产生影响。第二点 control,这个在操作系统是特别重要的。因为这个涉及到如何停止一个 process,并且切换到另一个 process,涉及到如何限制一个 program 的权限,操作系统不可能让一个 program 想做什么就做什么,想访问哪块内存就访问哪块内存。所以最终我们要解决的问题就是,如何在做到保持各个 process 的控制的同时,有效率的运行,切换 process?

Limited Direct Execution

操作系统的开发者提出了一种技术 - limited direct execution 来解决这个问题。首先 direct execution 指的是直接在 CPU 上运行这个程序

when the OS wishes to start a program running, it creates a process entry for it in a process list, allocates some memory for it, loads the program code into memory (from disk), locates its entry point (i.e., the main() routine or something similar), jumps to it, and starts running the user’s code

这个解决了效率问题,但是并没有解决第二个问题。所以接下来我们着重讲一下操作系统是如何解决 control 的问题。这里具体要解决两个问题:

  • 如何设定 user program 的权限
  • 如何进行 process 的切换

Restricted Operations

process 会有两种不同的 mode, user modekernel mode。当 CPU 运行 user program 的程序的时候,CPU 会处于 user mode,而这个 mode 就规定了 user program 可以做的操作和权限。如果这个时候 user program 越界了,CPU 就会抛出一个异常,接着操作系统收到这个异常后,就有可能会 kill 这个 user program。而当 CPU 处于 kernel mode,CPU 可以接触并管理整个硬件系统(操作系统运行时,CPU 是处于 kernel mode)。
但是,肯定会有这样的一类需求,就是当 CPU 处于 user mode,但是 user program 又希望做一些高权限的操作(比如,请求访问硬盘)。这个时候 user program 可以通过调用 system call,将 CPU mode 提升为 kernel model。(这里有点让我想到 runloop 里面的各种 mode),这篇文章详细的介绍了这两种mode

System Call

什么是 system call,像我们前面一章用过的 open,fork 函数都是 system call,看起来就是一个普通的方法,只是说这个方法是由系统提供的。它与普通的方法区别在于,system call 最终都要执行一个 trap instruction,这个指令会将 processor mode 从 user mode 提升到 kernel mode,然后开始执行一些指令,执行完之后,再执行 return-from-trap 指令,返回 user program。不同的 system call 对应着不同的执行指令,这个对应的关系是存储在一张表里,也叫 trap table,这个 table 的建立是在机器启动的时候,由操作系统来确定的。详细的流程,可以看书中给的一副图:

system_call.png

这样,通过 processor mode 和 system call 就解决了第一个问题,现在再来看下如何解决第二个问题。

Process Switching

首先,计算机中都会有个计时器,每隔一段时间,就会触发一个 timer interrupt,当操作系统接收到这个 interrupt 时,就会进行 process switch。

switch 的具体流程:


process switch.png

(1) 计时器发出 timer interrupt
(2) 保存 user register
(3) processor 提升到 kernel model
(4) 跳转到 trap table 指定的指令
(5) 操作系统执行 switch 函数
(6) 保存 kernel register
(7) 加载新的进程的 kernel register
(8) 栈指针指向新的进程的栈
(9) 加载新的进程的 user register
(10) 执行 B 程序
关于寄存器的分类,可以看这篇

最后书里还讲了关于 switch 函数的具体实现,是用汇编实现,这里不在陈述,有兴趣的可以去原文看代码。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容