其他分享
首页 > 其他分享> > 分段与分页

分段与分页

作者:互联网

分段与分页

一、分页、分段的技术出现之前

直接把整个程序装载进内存的方式是有一定的问题的
①地址空间不隔离:举个例子,假设我有两个程序,一个是程序A,一个是程序B。程序A在内存中的地址假设是0x00000000~0x00000099,程序B在内存中的地址假设是0x00000100~x00000199。那么假设你在程序A中,本来想操作地址0x00000050,不小心手残操作了地址0x00000150,那么,不好的事情或许会发生。你影响了程序A也就罢了,你把程序B也搞了一顿。
②程序运行时候的地址不确定:因为我们程序每次要运行的时候,都是需要装载到内存中的,假设你在程序中写死了要操作某个地址的内存,例如你要地址0x00000010。但是问题来了,你能够保证你操作的地址0x00000010真的就是你原来想操作的那个位置吗?很可能程序第一次装载进内存的位置是0x00000000~0x00000099,而程序第二次运行的时候,这个程序装载进内存的位置变成了0x00000200~0x00000299,而你操作的0x00000010地址压根就不是属于这个程序所占有的内存
③内存使用率低下:
- 举个例子,假设你写了3个程序,其中程序A大小为10M,程序B为70M,程序C的大小为30M,但是你的计算机的内存总共有100M
- 这三个程序加起来有110M,显然这三个程序是无法同时存在于内存中的
- 并且最多只能够同时运行两个程序。可能是这样的,程序A占有的内存空间是0x00000000~0x00000009,程序B占有的内存空间是0x00000010~0x00000079。假设这个时候程序C要运行该怎么做?可以把其中的一个程序换出到磁盘上,然后再把程序C装载到内存中。假设是把程序A换出,那么程序C还是无法装载进内存中,因为内存中空闲的连续区域有两块,一块是原来程序A占有的那10M,还有就是从0x00000080~0x00000099这20M,所以,30M的程序C无法装载进内存中。那么,唯一的办法就是把程序B换出,保留程序A,但是,此时会有60M的内存无法利用起来,很浪费对吧

二、分段技术的出现与虚拟地址空间

虚拟地址空间

虚拟地址空间到物理地址空间的映射

分段技术解决了上面的问题①和问题②

三、分页技术的出现

分页技术的大概原理

图示说明如下图所示:

页面大小的选择(选择性阅读)

页面的地址结构(选择性阅读)

上图给出一个页的结构,如下图所示:

所以当一个程序去寻址的时候需要3个步骤:

总结起来就是“段号+页号+页内偏移”

四、分页、分段的区别

————————————————版权声明:本文为CSDN博主「董哥的黑板报」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_41453285/article/details/107827460

标签:分段,程序,虚拟地址,地址,内存,空间,分页
来源: https://www.cnblogs.com/Samforrest/p/15969217.html