内存那点事(二)原始社会

来源:互联网 发布:网络平台服务许可 编辑:程序博客网 时间:2024/05/22 06:07

    之所以称为原始社会,是因为存储器没有任何抽象的阶段。早期每一个程序都直接访问物理内存。

    MOV REGISTER1,1000

    计算机会将为位置1000的物理内存中的内容移动到REGISTER1中。呈现给程序员的存储模型就是简单的物理内存。

    这种情况下要想在内存中同时运行两个程序基本是个扯。这回如果另外一个程序在位置1000的地方写如新值,将会覆盖掉第一个程序相同位置的值。肿么办?

    有的同学说了可以多线程来解决啊。假设一个进程中的所有线程对同一内存映像都可见,但是人们想开着浏览器听音乐就不能实现了,所以没有从根本上解决问题。一个没有内存抽象的系统也不大可能具有线程抽象的功能。

    又有的同学说了可以把当前内存中所有的内容保存到磁盘文件中,然后再把下一个程序读入到内存中再运行就妥了。IBM360早期模型是这么解决:内存被划分位2k的快,每个快被分配一个4位的保护键,保护键存储在CPU的特殊寄存器中。内存1M的话  需要512个保护键,占用256K。 PSW即程序状态字(有些教材也叫程序状态寄存器),Program Status Word。如果一个程序访问保护键与其PSW码不同的内存,360的硬件会捕获到,因为只有操作系统可以修改保护键,这样就可以防止用户进程之间,用户进程和操作系统之间的互相干扰。

    问题真的解决了么?来看个例子。

   

    假设A程序和B程序都是4k大,单独加载到内存中没啥问题。连续加载的情况下程序A执行JMP8 正常执行,运行一段时间后操作系统开始运行第二个程序。JMP12没有按照预想的跳到4112执行CMP,而是跳转到了12。由于两个程序都引用了绝对物理地址,所以程序瞬间崩溃了。

    IBM的大哥们怎么解决这个问题的?当一个程序被装载到X地址的时候,常数X会被加载到每一个程序地址上。

   

    同时引出来另外两个问题:

    1.速度慢,每个地址都要加....

    2.需要区别地址和常数。地址加  常数就不能加了。。


原创粉丝点击