操作系统是个大骗子?【转】

小编 2026-07-08 阅读:1890 评论:0
操作系统是个大骗子?  1聊天 我们这些程序都安安静静地躺在硬盘的某个角落中,满心期待地等待被主...

操作系统是个大骗子?

 
 
1聊天

 

我们这些程序都安安静静地躺在硬盘的某个角落中,满心期待地等待被主人使用,被操作系统装载, 然后进入内存工作,确切地说: 被 CPU阿甘 执行。 

 

进入内存是我们的使命, 如果只是在硬盘上呆着, 那我们就是一堆二进制的代码而已,除了占用硬盘的空间,没有什么作用。

 

但是主人似乎特别钟情于其中的几个程序,像什么浏览器了、 QQ了、Word了、 播放器了, 80%以上的时间都耗在他们上面。 

 

像我这样的小工具calculator,默默无闻也无人问津, 除了躺在硬盘里睡大觉,就是和同一目录下的helloworld聊天。   

 

helloworld也很悲催,自从主人把它创建出来, 只运行过一次, 在屏幕上输出一个 hello world !  以后就再也没人搭理了。 

 

可是我更悲催, 连一次运行的机会都没有, 我曾经好奇地问helloworld ,在内存中执行到底是什么感觉,这个糊涂蛋竟然说: 木有感觉,代码很快就运行完了,我这个程序就退出了。 

 

我不再理他,又去找同一目录下的game老兄, 他多次进入内存运行,见多识广。 

 

没想到他愤愤然地说: “我告诉你啊,你要想进入内存执行,必须得通过操作系统来装载,但是操作系统他就是个大骗子!”

 

“为什么啊?”

 

“第一,他和CPU阿甘 狼狈为奸,营造了一个假象,让我们以为每个程序都可以使用3G的巨大空间,但实际上那只是虚拟的! 我们使用的内存实际上少得可怜!”

 

操作系统是个大骗子?【转】

(码农翻身注: 这是个32位的Linux系统)

 

“第二,他不是把你这个程序一下子全部装入物理内存,而是把你大卸八块,用他的术语讲,叫做页面(page) ,然后分页按需装入内存, 注意,他不是连续装入的,有时候先装入这一块,有时候先装入那一块, 最后你都不知道自己身体的各个部位在内存的什么地方,绝对是痛不欲生。 ”

 

操作系统是个大骗子?【转】

 

“第三,你以为在运行时独占CPU,别做梦了,  操作系统通过分配时间片的方式,让我们这些程序,不,准确的来讲是进程来轮转执行,再加上一点进程调度的算法, 时不时地把你踢出CPU。 由于各个进程切换得非常快,给人类形成了一个假象,好像各个程序在同时执行一样。 你说他是不是个大骗子? ”

 

game老兄说得义愤填膺, 我将信将疑,还是耐心蛰伏吧,等待运行的那一天。 

 

2装载

 

伟大的一天终于来临了。 

 

主人在命令行窗口敲入了 calculator, 正在睡大觉的我立刻被装载器(loader)唤醒, 他说他是操作系统派来的, 要帮我到内存去执行。 

 

我满心欢喜,等待装载器把我装入内存, 可是等了半天,什么也没有发生, 我不由得问他: 哥们, 难道不是让我进入内存运行吗? 

 

装载器说: “急什么, 看你那没见过世面的样子, 不知道我正在为你创建虚拟地址空间吗? ”

 

果然如此 !  要给我建立一个虚拟的空间了 ,好吧,既来之则安之。

 

“你是不是忙着把我的代码和数据都复制到这个虚拟地址空间中来啊?”  我故意问道。

 

“真够无知的, 这是虚拟地址空间,不是实际内存,  怎么可能放代码和数据?” 这个装载器脾气很大。

 

我以为这个装载器至少会把我的代码装载到物理内存, 然后在虚拟内存和物理内存直接建立映射。于是耐心等待。

 

但是这个装载器却并没有这么做, 实际上他除了读取我的一些Header信息之外,根本没有把我的数据Copy到物理内存去,  他到底要做什么? 

 

我质问道: “你不把我的代码装载到物理内存中,我怎么运行?  ”

 

他说: “放心吧,我已经用一个数据结构(页表)把你的代码/数据在硬盘的位置已经记录下来了,等到真正运行的时候会被装载的。”

 

说着他甩给我一张图: “看到了页表了吗, 绿色的表示已经装入内存, 黄色的表示还在磁盘上, 初始状态下,全是黄色的, 就像你一样。”

 

操作系统是个大骗子?【转】

(注:为了简化, 此图没有反映段页结合的情况)

 

这个大脾气的装载器把活干完了 , 大大咧咧地从我的代码中找到了程序的入口点地址 (假设是0x080480c0), 他说等到进程执行的时候就从这里开始,读取第一条指令。

3运行

我意识到自己虽然还躺在硬盘里, 但是操作系统老大已经为我建立了一个进程了, 这个进程有一套自己的虚拟地址,页表等“高级”的数据结构, 已经准备好运行了。

 

果然, 不久以后, 操作系统调度了这个进程来运行,就从装载器返回的程序入口点0x080480c0开始。  

 

老大命名CPU阿甘去0x080480c0处取出指令来执行, 但这是一个虚拟地址,必须转化成物理地址才行。 

 

于是阿甘就去查看页表,试图把它变成物理内存的地址, 可是这个页表指向的是硬盘中的地址, 阿甘立刻报告: “老大,这是个新家伙,它的代码还在硬盘上呢!”

 

“好的,马上启动缺页处理程序! ”  看来老大已经司空见惯了。

 

缺页处理程序开始执行, 根据页表中的地址又在硬盘中找到了我, 我配合着让他把代码取走。 

 

人生的第一次, 我的代码终于被读入了内存当中,当然,阿甘也得把页表给修改一下,这样才能反映已经数据已经进入内存了:

 

操作系统是个大骗子?【转】

现在可以读取虚拟地址0x080480c0处的内容了, 通过页表的翻译,定位到了物理内存的地址,取出了指令,终于可以执行了 !

 

随着指令的执行,越来越多的数据和代码被装载到物理内存,果然如game老兄所言,我被大卸八块安插到物理内存的不同位置去了。 

 

操作系统是个大骗子?【转】

 

但是game老兄说的也不对,那其实并不是我,只是我的一个化身而已。这个化身是一个正在运行的进程,CPU阿甘不停地读数据、写数据。 时间片到了,就把这个进程给挂起,过一会儿再运行。

 

最后,进程结束,内存中的数据会被清理、覆盖,但是我还是我,玩好无损地躺在硬盘上。 

 

经历了这一次的运行,我算是明白了,操作系统确实是个大骗子,但是他其实也很不容易,资源很有限, 内存就那么大,CPU阿甘只有一个,程序又那么多, 为了让更多的程序运行,更有效地利用内存和CPU, 也只能施展一点骗术了。 

 

 

 

(完)

 

 

码农翻身
了解更多
 
 
谋胆并重
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表