玩命加载中qwq

你的名字

  • 2017-06-30
  • 1,173
  • 6

满脑子奇怪念头的我从未停止奇怪的想法。于是有很多本来“挺正经儿”的事儿,在我的脑中稍加处理便带上了玄学的色彩。既然没有了唯心也就无所谓唯物,那就让我形而上学地讲一下今天的主题吧。大家先来看一段程序:

#include <stdio.h>
int main()
{
    int man = 1;
    int * tanakatarou = &man;
    int * zhangsan = tanakatarou;
    int * Jamesking = zhangsan;
    int * leonardobuonarroti = Jamesking;
    printf("%d man.\n", *leonardobuonarroti);
    return 0;
}

看到以上的程序,大家也许会想:这什么嘛!定义了一个int变量man,然后用了4个不同的指针指向同一个变量。最后打印出的还不是那个变量的值?

为什么会这样?因为man的值被存放在一小片内存区域中。而且一个指针变量是用来存放内存地址编号的。因为所有的指针都指向了man的地址,所以从任何一个指针中取出的值当然都是man的值啦。

指针显然是一个变量的别名。有一个叫做人的变量,我们可以给他起个“田中太郎”的别名,也可以给他起个“张三”的别名,还可以个他起个“詹姆士 金”的别名,甚至还可以给他起个“里昂那多 布那罗迪”的别名。但是归根结底所有的别名都代表一块唯一的内存地址。内存空间也是我们所需要的最终重要资源之一。PC机的内存从IBM 7094到现在几乎翻了10000多倍。而几乎所有的程序都需要在这些内存中展开才能运行。每个程序都希望自己拥有一块无限大的内存来展现自己,但是内存资源的分配对每个程序的需求而言总是事与愿违。随着操作系统的发展,为了给每个程序营造展现自我的机会,也为了大家都能共享内存这个舞台,聪明的程序员们发明了内存分配机制。他们将一个程序进程需要的数据放在内存中,暂时不需要的数据放在外存上。于是一个程序内便具有了存储状态不同的数据。有的被放在内存中,有的被暂时分页到磁盘上。可以说程序的“私生活”与“社交”分离开了。我们可以用一个指针的别名指向一个“正在内存中的数据”,也可以指向一处在磁盘上的数据。这样虽然操作系统的存储调度算法越来越复杂,但是却给应用程序们创造了高效执行的可能。如果再让我们倒退回DOS时代——那个无需内存分页的时代——简单了操作系统,却让进程之间的内存资源占用问题变得更加棘手。

也许将内存地址这个网络账号与个人信息这个分页数据紧密联系的做法,不仅笨拙,而且倒退呢!

感谢打赏!
支付宝

灌水吐槽区(登录QQ有头像!)

  • 叶子

    我总觉得哪里不对,现代操作系统不应该是用的虚拟内存么?

    • Zenazo

      抱歉,这儿几篇文章是我经过兔子桑的允许发在TA的blog上的。现在我来解释这个问题。虚拟内存指的是操作系统给进程提供内存资源时不直接给它物理地址,而是给进程一张内存分配表。这张表中记录了OS给进程的虚拟地址到每个虚拟地址对应的物理地址之间的映射关系。所谓内存分页是内存虚拟化技术的实现手段之一。因为一个进程要求的内存空间可能主存都装不下,所以把经常调用的数据放在主存里。不常用的放到其他存储设备(通常是磁盘)的页面文件上。由OS管理这期间的调度工作。如果把通常在计算机中的存储资源概括一下,一个数据可以存放在以下几处:cpu寄存器,cpu高速缓存,主存(内存)外存(例如磁盘,存储卡)。在这几处存储空间里通常是:读写速度由快到慢,容量大小由小到大。这种情况叫做存储分层级。要这样做的原因是存储设备随着读写速度快到慢,容量小到大而出现单位容量造价递减的规律。换句话说,谁不想要个读写速度赶超cpu寄存器,容量赶超硬盘的设备呢?但是不可能呀!因为即使能造出来也是天价了!

      • 小雨萌萌哒丶

        _(・ω・」 ∠)_我不是让你随便发了吗。不然给你管理干嘛- –

  • l该页无法显示

    _(:3 」∠)_ 无意走进来 嘿嘿嘿

你必须 登录 才能发表灌水吐槽区(登录QQ有头像!).