在执行malloc申请内存的时候,操作系统是怎么做的

执行malloc动态申请内存时,操作系统的做法

从操作系统层面上看,malloc是通过两个系统调用来实现的: brkmmap

  1. brk是将进程数据段(.data)的最高地址指针向高处移动,这一步可以扩大进程在运行时的堆大小
  2. mmap是在进程的虚拟地址空间中寻找一块空闲的虚拟内存,这一步可以获得一块可以操作的堆内存。

通常,分配的内存小于128k时,使用brk调用来获得虚拟内存,大于128k时就使用mmap来获得虚拟内存。进程先通过这两个系统调用获取或者扩大进程的虚拟内存,获得相应的虚拟地址,在访问这些虚拟地址的时候,通过缺页中断,让内核分配相应的物理内存,这样内存分配才算完成。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用malloc函数申请内存时,如果申请内存过大,可能会导致内存分配失败。这是因为操作系统在分配内存时,需要在内存中找到一块足够大的连续空间来满足申请。如果没有足够大的连续空间,就会分配失败。在这种情况下,可以考虑使用realloc或calloc函数来代替malloc函数。 如果使用realloc函数,可以先使用malloc函数申请一部分内存,然后在需要时使用realloc函数重新分配内存。如果realloc函数无法分配足够大的内存,它将返回NULL指针,此时可以考虑使用calloc函数。 如果使用calloc函数,它将分配一块指定大小的内存,并将其初始化为0。与malloc函数不同,calloc函数不需要连续的空间,因此可以更好地处理大内存分配问题。 下面是一个使用realloc函数重新分配内存的例子: ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr; int n = 5, i; // 分配初始内存 ptr = (int*) malloc(n * sizeof(int)); // 检查内存是否分配成功 if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } // 输出初始内存中的值 printf("Initial memory allocation:\n"); for (i = 0; i < n; i++) { printf("%d ", *(ptr + i)); } // 重新分配内存 n = 10; ptr = (int*) realloc(ptr, n * sizeof(int)); // 检查内存是否分配成功 if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } // 输出重新分配后的内存中的值 printf("\nMemory reallocation:\n"); for (i = 0; i < n; i++) { printf("%d ", *(ptr + i)); } // 释放内存 free(ptr); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值