《第七章》 数据管理 --之 动态内存分配

第七章 数据管理
 * 资源分配的管理方式
  * 如何对可能被多个用户同时访问的文件进行处理
  *1 动态内存管理 : 可以做什么以及Linux不允许做什么
  *2 文件锁 : 协调锁,共享文件的区域锁定和避免死锁
  
 *1 : UNIX以一种非常干净的方式管理内存,Linux程序不允许直接访问物理内存。
       Linux 提供了内存保护机制,它避免了不同应用程序之间的互相干扰。
       如有足够的交换空间,Linux允许应用程序访问比实际物理内存更大的内存空间。
       #include <stdlib.h>
       void *malloc(size_t size);
     简单的内存分配 --
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main() {
  4.     int ec = EXIT_FAILURE;
  5.     char *p1 = malloc(1024);
  6.     if(p1 != NULL) {
  7.         printf("Hello Mem");
  8.         ec = EXIT_SUCCESS;
  9.     }
  10.     return ec;
  11. }
32位的指针可以寻址的地址空间可达 4G
 *2 : 应用程序所分配的内存是由Linux内核来管理的,程序请求内存或者是读写内存都是,
       需要由Linux内存来接管并决定如何处理这些请求。
      内核会在 物理内存 与 swap space 之间移动数据和程序代码,使得每次读写内存时,
      数据看起来总像是已经存在与物理内存一样!
      *专业术语* : Linux实现了一个 ”按需换页的虚拟内存系统“
      Linux将所有的内存以页的单位划分,4096B / P;
      Linux内核会对访问的内存地址进行检查,如果这个地址合法可用,内核就会确定需要向
      程序提供哪一个物理内存页面,然后,该页面之前从未被写入(分配)过,内核就直接分配它,
      如果它已经被保存在swap space 上,内核就读取包含数据的内存页面到物理内存(可能
      要把已有的页面从内存中移出到硬盘)。接着在完成虚拟内存地址到物理地址的映射之后,
      内核允许用户继续运行。
     @1, 访问空指针
             char *p1 = (char *)0;
             printf("Hello %s\n", p1);
             sprintf(p1, "A write to null\n");
     @2, char z = *(const char *)0; Linux不允许直接从 零地址 处读取数据。
     Linux将程序员使用的内存块作为一个物理页面集来管理,如果一个内存页面未被使用
     ,Linux内存管理器就可以将其从物理内存置换到交换空间中(术语:换页)从而减轻它对资源
     使用的影响。如果程序试图访问位于已置换到交换空间的内存页中的数据,那么Linux会短暂
     的停止程序,将内存页从交换空间再次置换到物理内存,然后允许程序继续运行,就像数据 
     一直存在与内存中一样!  ”明白了!!!哈哈!1!“
    请记住 : 一旦调用free释放了一块内存,它就不再属于这个进程。它将由malloc函数库负责管理。
     @3,其他的内存分配函数
            ---1,void *calloc(size_t number_of_elements, size_t element_size)
            ---2, void *realloc(void *existing_memory, size_t new_size)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值