内存那点事(二)原始社会
来源:互联网 发布:网络平台服务许可 编辑:程序博客网 时间: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.需要区别地址和常数。地址加 常数就不能加了。。
- 内存那点事(二)原始社会
- 内存那点事
- ES内存那点事
- ES内存那点事
- ElasticSearch 内存那点事
- C++ 内存的那点事
- 内存那点事(一)总线
- 说说内存泄露那点事
- 内存对齐的那点事
- 关于android内存泄露那点事
- 谈一谈Javascript内存释放那点事
- 关于释放内存的那点事
- 追她那点事(二)
- 我跟SAP那点事(二)
- 加班那点事(二)
- Android内存那点事儿
- iOS内存那点事儿
- 32位,64位和内存的那点事
- ubuntu手工安装Nvidia官方显卡驱动
- xcode 4.5 创建项目
- Dead Man's Island——3、The Photograph
- linux内核及驱动开发中有关__init,__exit和__initdata的用法
- 浅谈三层架构
- 内存那点事(二)原始社会
- Linux下的socket文件传输
- java实现的简易线程池框架源码
- JavaSE第八十讲:监听器、事件、事件源、事件注册深度剖析
- XWINDOW无法启动的解决
- Redis作者谈Redis应用场景
- struts2中重定向中文参数乱码梳理
- Linux下的udp广播与接收程序 包含序列号
- 自学Linux从零开始(自学日记②)