全局空间和局部空间

全局空间和局部空间

  • 操作系统需要把程序加载到内存并运行程序.
  • 操作系统要提供大量的实例 , 数据或服务供程序调用,以简化程序编写.
  • 同时在访问设备时消除潜在的竞争和冲突.

所以每个任务包含两个部分:全局部分和私有部分.

  • 全局部分是所有任务共有的,含有操作系统的软件和库程序,以及可以调用的系统服务和数据;
  • 私有部分包括每个任务各自的数据和代码.如图:
    全局空间和局部空间
    左是每个任务的全局空间和局部空间,右是多任务的全局空间和局部空间.

震惊!!每个任务的地址空间竟有 64TB?

GDT最大的尺寸是 216 字节,又每个段描述符占 8 字节,所以GDT可以划分 213 个段,即 8192 个.又GDT的 0 号描述符不能使用,故实际是 8191 个段,但这只有 4GB可以忽略不计.又段内偏移地址是 32 位,段的长度最大是 4GB,因此,一个任务的全局空间,其总大小为 213×\times 232 = 245 字节,即 32TB.
同理,局部描述符表LDT可以划分 213 个,即 8192 个描述符,每个段的长度最大是 4GB.故,一个任务的局部空间,其总大小为 213×\times 232 = 245 字节,即 32TB.
这样一来,每个的总地址空间为 32+32=64TB ,但在一个 32 根地址总线的处理器上,无论如何不能这么巨大的存储空间.但其实这些只是虚拟的地址空间.操作系统允许程序的编写者使用这么巨大的地址空间编写程序.
这就是说编译器不考虑处理器的寻址空间的大小,也不考虑物理内存的大小,它只负责编译程序.但是,当程序超出理内存的大小时,或操作系统无法分配这么大的物理内存空间时,怎么办?
同一块物理内存,可以让多个任务,或者多个任务的不同段使用.

  1. 当执行或者访问一个新的段时,如果它不在物理内存中(描述符的"P"位为 0 ,这时会引发中断),而且也没有空闲的物理内存来加载它
  2. 那么操作系统将在内存查找一个暂时用不到的段,把它换出到磁盘中,并把腾出的空间分配给马上要访问的段
  3. 然后改变段的描述符,使之指向这段内存空间(同时描述符的"P"位改为 1 ,这之后中断返回).
  4. 下一次,当换出的段又用到时,再按同样的方法加载到内存.