[Linux] 第七章 数据管理 动态内存分配

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

int main() {
    int ec = EXIT_FAILURE;
    char *p1 = malloc(1024);
    if(p1 != NULL) {
        printf("Hello Mem");
        ec = EXIT_SUCCESS;
    }
    return ec;
}
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)
原文地址:https://www.cnblogs.com/robbychan/p/3787043.html