Hello World
算是这学期的最后一次实验吧,要求实现一个可视化的页面置换算法。 于是就写了这个,既可以看动画图表过程、也可以看内容分析的一个基于web的模拟器。 参考了几位的案例后,用了NodeJS、Django,最后的效果看起来还不错. 链接在这里。 CheeseSilly
线程切换过程中锁的限制 今天这节课中,首先我们会花几分钟来重温一下上节课,也就是线程切换的内容,因为有些内容对于这节课来说还挺重要的。之后我们大部分时间都会讨论coordination,XV6通过Sleep&Wakeup实现了coordination。最后我们会讨论lost wake-up的问题。 首先是上节课的回顾。在XV6中,任何时候调用switch函数都会从一个线程切换到另...
线程(Thread)概述 为什么计算机需要运行多线程?可以归结为以下原因: 首先,人们希望他们的计算机在同一时间不是只执行一个任务。有可能计算机需要执行分时复用的任务,例如MIT的公共计算机系统Athena允许多个用户同时登陆一台计算机,并运行各自的进程。甚至在一个单用户的计算机或者在你的iphone上,你会运行多个进程,并期望计算机完成所有的任务而不仅仅只是一个任务。 ...
为什么要使用锁? 今天的课程的内容是锁。这节课偏向于理论介绍,并且或许会与其他课程中有关锁的内容有些重合,不过这节课更关注在内核和操作系统中使用的锁。 首先,我们来看一下为什么我们需要锁?故事要从应用程序想要使用多个CPU核开始。使用多个CPU核可以带来性能的提升,如果一个应用程序运行在多个CPU核上,并且执行了系统调用,那么内核需要能够处理并行的系统调用。如果系统调用并行的运行在多个C...
真实操作系统内存使用情况 下图是一台Athena计算机(注,MIT内部共享使用的计算机)的top指令输出。如果你查看Mem这一行, 首先是计算机中总共有多少内存(33048332),如果你再往后看的话,你会发现大部分内存都被使用了(4214604 + 26988148)。但是大部分内存并没有被应用程序所使用,而是被buff/cache用掉了。这在一个操作系统中还挺常见的,因为我们不想...
Page Fault Basics 今天的课程内容是page fault,以及通过page fault可以实现的一系列虚拟内存功能。这里相关的功能有: lazy allocation,这是下一个lab的内容 copy-on-write fork demand paging memory mapped files ...
Trap机制 程序运行是完成用户空间和内核空间的切换 程序执行系统调用 程序出现了类似page fault、运算时除0的错误 一个设备触发了中断使得当前程序运行需要响应内核设备驱动 都会发生这样的切换 这其间用户空间与内核空间的切换通常被称为trap,其中细节对安全隔离与性能来说非常重要。所以,trap机制要尽可能的简单 这里有很多寄存器都有特殊的作用,我们之后会看...
虚拟内存(page tables) 地址空间 支持虚拟内存的硬件 内核地址空间与用户地址空间的结构 地址空间 创造虚拟内存的一个出发点是你可以通过它实现隔离性。如果你正确的设置了page table,并且通过代码对它进行正确的管理,那么原则上你可以实现强隔离。 这里的基本概念也很简单直观,我们给包括内核在内的所有程序专属的地址空间。 所以,基本上来说,每个程序都运行...
Isolation 应用程序与操作系统之间具有强隔离性。简单来说,操作系统能够很好地管理多个应用程序的正常运行。 在内存层面来看,不同应用程序之间的内存是隔离的,这样应用程序就不会覆盖另一个的内存。 其实接口就被精心设计来实现资源的强隔离。 接下来是几个例子。 例如进程,进程抽象了CPU,这样多个应用程序才能复用一个或多个CPU。 我们也可以认为exec抽象了内存,应用程序并没有...