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