seegongsik
我的单词本
操作系统

隔开我的和你的那堵墙

在虚拟内存里,每个程序看的是自己的内存(第9课)。 别人的内存,看都看不见。 可其实,大家的数据,都混在一块真内存里。 那么,是什么让我的和你的,互不相碰呢? 意外的是,根本没有挡着的墙。

01

一块内存里,挤着好多家

在假的那一面,各自像在用自己的,
可在真内存里,大家是混在一起的。
A 的碎块和 B 的碎块,并排放着。
要是 A 能碰旁边 B 的位置,
A 一个失误,就能毁了 B,连秘密也能偷看。

真内存
A
B
A
B
B
A
A
B
A
B
B
A

看真内存。A(金色)和 B(蓝色)的碎块,混着放在一起。

在一个空间里这样混着,看着真悬。
可实际上,A 绝对碰不到 B。
是有什么硬隔板,挡在两者之间吗?
不是。秘密,在第9课见过的那张地图里。

02

不是墙,只是没有路

回想第9课的那张地图。
A 的地图,只指向 A 的真位置。
通往 B 位置的路,那地图里压根没有。
所以 A 连「B 的地址」这种东西,都说不出来。
不是有墙挡着两者,而是没有可走的路。

A 地图
A1
B1
没有路
A2
B2
没有路
A3

选 A。A 的地图只通到 A 的位置,没有指向 B 的箭头。

地图里没路,就去不了。
可要是某个程序,不小心、
或者故意,叫了地图外的地址,会怎样呢?
那时候,又有另一道保险,启动了。

03

想越线,就被抓住

程序一叫自己地图里没有的地址,
就没有真位置可换,转换便失败了。
那一瞬,硬件立刻察觉,告诉操作系统。
操作系统说「你碰了不属于你的位置」,
只把那个程序,啪地停住。坏的访问,终究碰不到。

依次试 A 的地址和 B 的地址。自己的通过(绿),别人的被抓住、停止(红)。

自己的顺顺当当地走,别人的当场被抓。
想越过边界的尝试,绝不会得逞。
靠这个,跟来一个很让人安心的结果。
一个程序崩了,也不会蔓延到别人身上。

04

一个崩了,其余的都好

每个程序都被关在自己的格子里,
崩掉的程序,只能弄乱自己的位置。
别人的内存,操作系统,都碰不着。
操作系统,悄悄收拾掉崩的那一个,
其余的程序,像没事一样,继续地跑。

P1
运行中
P2
运行中
P3
运行中

弄崩一个程序。只有那一个停,其余的继续跑。

要是没有保护,崩的那一个,会把全部拖下水。
正因分开放着,事故才停在一个格子里。
稳定,安全,都从这儿一起出来。
它的底下,不是「墙」,而是「各自分开的地图」。

05

分开,就是保护

总结一下,内存保护,不是特意造的墙。
给每个进程各发一张地图,彼此之间就没了路,
想越线就被抓住,只停那一个。
所以混着住也不撞,一个崩了也不蔓延。
分开放着这件事本身,就是保护。

把保护关一下、开一下。开着,事故困在一个格子里;关着,蔓延到全部。

到这儿,操作系统在里头,管住了 CPU 和内存。
让它们轮流用(分时·调度),把它们分开守护(虚拟内存·保护)。
可计算机,还得跟外头说话呀。
键盘、屏幕、硬盘,连头一回见的新设备,都要。
操作系统,怎么认出那么多设备呢?这是下一个故事。

一句话总结内存保护,不是挡着的墙,而是每个进程地图不同所带来的结果。我的地图只指向我的位置,所以根本就没有通往别人位置的路。想越线时,那是地图上没有的地址,硬件会抓住,操作系统只停掉那个程序。所以一个崩了,其余的都没事。分开,本身就是保护。
操作系统
如果有帮助,请支持我们