【问题标题】:Process memory limit and address space for UNIX and Linux and WindowsUNIX 和 Linux 和 Windows 的进程内存限制和地址空间
【发布时间】:2023-03-23 17:01:01
【问题描述】:

在 UNIX 和 Linux 和 windows 中单个进程的最大内存量是多少?如何计算? 4 GB RAM 需要多少用户地址空间和内核地址空间?

【问题讨论】:

    标签: memory memory-management process operating-system


    【解决方案1】:

    在 Linux 系统上,请参阅 man ulimit

    (已更新)

    上面写着:

    ulimit builtin 用于设置资源使用限制 shell 以及由它产生的任何进程。如果一个新的极限值是 省略,则打印资源限制的当前值。

    ulimit -a 打印出所有带有开关选项的当前值,其他开关,例如ulimit -n 打印出 no。最大。打开文件。

    不幸的是,“最大内存大小”告诉“无限”,这意味着它不受系统管理员的限制。

    您可以通过

    查看内存大小
    cat /proc/meminfo
    

    结果类似于:

    MemTotal:        4048744 kB
    MemFree:          465504 kB
    Buffers:          316192 kB
    Cached:          1306740 kB
    SwapCached:          508 kB
    Active:          1744884 kB
    (...)
    

    所以,如果 ulimit 说“无限”,那么 MemFree 就是你的了。差不多了。

    不要忘记 malloc()(和 new 运算符,它调用 malloc())是一个 STDLIB 函数,所以如果你调用 malloc(100) 10 次,there will be lot of "slack",点击链接了解原因。

    【讨论】:

      【解决方案2】:

      How much user address space and kernel address space for 4 GB of RAM?

      一个进程的地址空间分为两部分,

      用户空间:在标准 32 位 x86_64 架构上,最大可寻址内存为 4GB,其中地址从 0x000000000xbfffffff = (3GB) 用于代码、数据段。当用户进程在用户模式或内核模式下执行时,可以寻址该区域。

      内核空间:类似地,从0xc00000000xffffffff = (1GB) 的地址用于内核的虚拟地址空间,只有在进程在内核模式下执行时才能寻址。

      x86 上的这个特定地址空间拆分由PAGE_OFFSET 的值决定。参考Linux3.11.1vpage_32_types.hpage_64_types.h,页面偏移量定义如下,

      #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)

      其中Kconfig 定义了default 0xC0000000 的默认值,还可以使用其他地址拆分选项。

      同样适用于 64 位,

      #define __PAGE_OFFSET _AC(0xffff880000000000, UL).

      在 64 位架构上,3G/1G 由于地址空间巨大,拆分不再有效。根据源最新的 Linux 版本已将上述偏移量作为偏移量。

      当我看到我的 64 位 x86_64 架构时,一个 32 位进程可以拥有整个 4GB 的用户地址空间,并且内核将拥有高于 4GB 的地址范围。有趣的是,在现代 64 位 x86_64 CPU 上,并不是所有的地址线都被启用(或者地址总线不够大)来为我们提供2^64 = 16 exabytes 的虚拟地址空间。也许AMD64/x86 架构启用了48/42 低位分别导致2^48 = 256TB / 2^42= 4TB 地址空间。现在,这无疑提高了大量 RAM 的性能,同时出现了如何在操作系统限制下有效管理它的问题。

      【讨论】:

        【解决方案3】:

        在 Linux 中,有一种方法可以找出您可以拥有的地址空间限制。 使用rlimit 结构。

        struct rlimit {
            rlim_t cur;    //current limit
            rlim_t max;    //ceiling for cur.
        }
        

        rlim_tunsigned long 类型。

        你可以有类似的东西:

        #include <stdio.h>
        #include <stdlib.h>
        #include <sys/resource.h>
        
        //Bytes To GigaBytes
        static inline unsigned long btogb(unsigned long bytes) {
            return bytes / (1024 * 1024 * 1024);
        }
        
        //Bytes To ExaBytes
        static inline double btoeb(double bytes) {
            return bytes / (1024.00 * 1024.00 * 1024.00 * 1024.00 * 1024.00 * 1024.00);
        }
        
        int main() {
        
            printf("\n");
        
            struct rlimit rlim_addr_space;
            rlim_t addr_space;
        
            /*
            * Here we call to getrlimit(), with RLIMIT_AS (Address Space) and
            * a pointer to our instance of rlimit struct.
            */
            int retval = getrlimit(RLIMIT_AS, &rlim_addr_space);
            // Get limit returns 0 if succeded, let's check that.
            if(!retval) {
                addr_space = rlim_addr_space.rlim_cur;
                fprintf(stdout, "Current address_space: %lu Bytes, or %lu GB, or %f EB\n", addr_space, btogb(addr_space), btoeb((double)addr_space));
            } else {
                fprintf(stderr, "Coundn\'t get address space current limit.");
                return 1;
            }
        
            return 0;
        }
        

        我在我的电脑上运行了这个,然后...... prrrrrrrrrrrrrrr tsk!

        输出: Current address_space: 18446744073709551615 Bytes, or 17179869183 GB, or 16.000000 EB

        我的 Linux x86_64 上有 16 ExaBytes 的最大可用地址空间。

        这里是getrlimit()'s definition 它还列出了您可以传递给getrlimits() 的其他常量,并介绍了getrlimit()s 姐妹setrlimit()。当rlimitmax 成员变得非常重要时,你应该始终检查你没有超过这个值,这样内核就不会打你的脸、喝你的咖啡和偷你的文件。

        PD:请原谅我打鼓的抱歉^_^

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-28
          • 1970-01-01
          • 1970-01-01
          • 2021-03-26
          • 1970-01-01
          • 2011-10-03
          相关资源
          最近更新 更多