zoukankan      html  css  js  c++  java
  • 关于windows内存管理机制

    完整的

    https://blog.csdn.net/vsooda/article/details/8992446

    1.      进程地址空间

    1.1地址空间

    ·        32|64位的系统|CPU

            操作系统运行在硬件CPU上,32位操作系统运行于32位CPU上,64位操作系统运行于64位CPU上;目前没有真正的64位CPU。

    32位CPU一次只能操作32位二进制数;位数多CPU设计越复杂,软件设计越简单。

           软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0xFFFF FFFF。

    ·        NULL指针分区

    范围:0x0000 0000~0x0000 FFFF

    作用:保护内存非法访问

    例子:分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000;当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。

            那么,为什么需要那么大的区域呢,一个地址值不就行了吗?我在想,是不是因为不让8或16位的程序运行于32位的系统上呢?!因为NULL分区刚好范围是16的进程空间。

    ·        独享用户分区

    范围:0x0001 0000~0x7FFE FFFF

    作用:进程只能读取或访问这个范围的虚拟地址;超越这个范围的行为都会产生违规退出。

    例子:

            程序的二进制代码中所用的地址大部分将在这个范围,所有exe和dll文件都加载到这个。每个进程将近2G的空间是独享的。

    注意:如果在boot.ini上设置了/3G,这个区域的范围从2G扩大为3G:0x0001 0000~0xBFFE FFFF。

    ·        共享内核分区

    范围:0x8000 0000~0xFFFF FFFF

    作用:这个空间是供操作系统内核代码、设备驱动程序、设备I/O高速缓存、非页面内存池的分配、进程目表和页表等。

    例子:

           这段地址各进程是可以共享的。                                                                                                                                         

    注意:如果在boot.ini上设置了/3G,这个区域的范围从2G缩小为1G:0xC000 0000~0xFFFF FFFF。

           通过以上分析,可以知道,如果系统有n个进程,它所需的虚拟空间是:2G*n+2G (内核只需2G的共享空间)。

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/15215483.html
Copyright © 2011-2022 走看看