1。为了聊天,我们的程序静静地躺在硬盘的某个角落,等待主人使用,被操作系统加载,然后进入内存工作,准确的说:被CPU执行阿甘正传。进入记忆是我们的使命。如果我们只是停留在硬盘上,那么我们只是一堆二进制代码,除了占用硬盘的空间外,没有任何作用。但是楼主好像特别喜欢浏览器、QQ、Word、播放器几个程序,80%以上的时间都花在了上面。像我这样的小工具计算器默默无闻,无人问津。除了趴在硬盘上睡觉,就是在同目录下和helloworld聊天。helloworld也很伤心。自主人创建以来,只运行过一次,屏幕上输出了一个helloworld。从那以后,就没有人关注它了。但我更难过,我连跑一次的机会都没有。曾经好奇的问过helloworld,在内存中执行是什么感觉。辞职。我没理他,去同目录下找gameman。他多次进入内存运行,见多识广。不料,他怒道:“我告诉你,要想进入内存执行,必须通过操作系统加载,但操作系统是个大骗子!”“为什么?”“首先,他和CPU阿甘一起合作,制造了一种错觉,每个程序都可以使用3G的巨大空间,但实际上它只是虚拟的! 我们使用的内存实际上小得可怜!”注意:这是32位的Linux系统)》第二,他不是一次性把你的程序加载到物理内存中,而是把你拆成一块一块的。用他的术语来说,叫做页面(page),然后Pages根据需要加载到内存中。请注意,它不是连续加载的。有时先加载,有时先加载。最后,你不知道你身体的各个部分在记忆中的位置。真是太痛苦了。“第三,你以为你在运行时独占了CPU,别做梦了,操作系统分配时间片,让我们这些程序,不,准确的说,进程是轮流执行的,再加上一点进程调度算法时不时地把你踢出CPU。由于每个进程的切换都非常快,给人一种错觉,好像每个程序都在同时执行。 你觉得他是个大骗子吗?”游戏哥义愤填膺地说,我是半信半疑的,还是乖乖躺着等跑起来的那一天吧。2.加载的大日子终于来了。高手在命令行窗口输入我打开计算器后,立马被loader吵醒了正在睡觉的我。他说他是操作系统派来帮我在内存中执行的。我满心欢喜,等着loader把我加载到内存中,可是等了半天什么也没有,我忍不住问他:老兄,你不是让我进入内存运行的吗?加载器说:“急什么,看看你的新世界,我不知道我在为你创建虚拟地址空间?“果然!我要为我创造一个虚拟空间,好吧,既然来了,我就安顿下来。”你忙着把我的代码和数据复制到这个虚拟地址空间吗??我故意问的。“我真是无知。这是一个虚拟地址空间,而不是实际内存。你怎么能放代码和数据?” 这装载机脾气不好。将代码加载到物理内存中,然后直接建立虚拟内存和物理内存之间的映射。于是我耐心等待。但是这个loader并没有这样做。其实他除了看了我的一些头信息外,根本就没有看我的头信息。把数据拷贝到物理内存,他要做什么?我问:“如果你不把我的代码加载到物理内存中,我怎么运行呢?”他说:“你别着急,我已经用一个数据结构(Pagetable)把你的代码/数据记录在硬盘上了,等真正运行的时候再加载。”说着,他给了我一个picture:"你看过页表吗?绿色的表示已经加载到内存中,黄色的表示还在磁盘上,初始状态全是黄色的,和你一样。"(注意:为简化起见,此图不体现segment和page的结合)这个暴躁的loader干完活,从我的代码中找到了程序的入口地址(假设为0x080480c0),他说当进程执行完毕,从这里开始读取第一条指令。3.运行我才发现,虽然我还躺在硬盘上,但是操作系统的老大已经为我创建了一个进程。这个进程有自己的“高级”数据结构,例如虚拟地址和页表,可以随时运行。果然,此后不久,操作系统安排进程运行,从加载器返回的程序入口点0x080480c0开始。老大点名CPU阿甘从0x080480c0取指令执行,但是这是虚拟地址,必须转换成物理地址。于是阿甘查了页表,想把它变成物理内存的地址,可是页表指向的是硬盘中的地址,阿甘马上报告:“老大,这是个新人,而且它的代码还在硬盘上。”加油!”“好的,马上启动pagefaulthandler!”看来老大已经习惯了,pagefault处理程序开始执行,根据页表中的地址在硬盘中找到了我,我配合让他把代码拿走,我人生第一次,我的代码终于读进了内存,当然阿甘要修改页表,反映数据已经进内存了memory:现在可以读取虚拟地址0x080480c0处的内容了是的,通过页表的翻译,定位到物理内存的地址,取出指令,终于可以执行了!随着执行指令,越来越多的数据和代码被加载到物理内存中,就像游戏哥说的那样,我被拆解插入到物理内存的不同位置。但是游戏哥说的不对,其实不是我,是只是我的化身。这家公司arnation是一个运行的进程,CPU阿甘不停地读写数据。当时间片到了,暂停进程,稍后再运行。最后,当进程结束时,内存中的数据会被清除覆盖,但我还是我,毫无损伤地躺在硬盘上。跑了这回才明白,操作系统确实是个大骗子,但是也不容易,资源有限,内存那么大,只有一个CPU阿甘正传,程序那么多。运行更多的程序并更有效地使用内存和CPU只能做一些小伎俩。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号coderising】点此查看该作者更多好文
