UC环境编程二-----------内存管理

1.错误处理
(1)通过函数的返回值表示错误
(2)返回有效指针表示成功,返回空指针NULL
(3)通过errno表示错误
根据errno获得错误信息
将errno转换成有意义的字符串

printf("%m\n");
printf("%s\n",strerror(errno));
perror("error");
	errno在函数执行成功的情况下不会被修改,因此不能以errno非零作为错误判断信息
	errno是一个全局变量,其值随时可能发生变化
2.环境变量
	每个程序都会接收到一张环境表,是一个以NULL指针结尾的字符指针数组
	全局变量environ保存环境表的起始地址

3.环境变量函数
#include <sdlib.h>

环境变量 :name=value
获得环境变量
char* getenv(const char* name)
设置环境变量
int putenv(char* string);
int setenv(const char* name,const char* value,int overwrite);
int unsetenv(const char* name);
清空环境变量
void clearenv();
4.内存管理
在这里插入图片描述
5.进程映像
(1)程序是保存在磁盘上的可执行文件
运行程序时,需要将可执行文件加载到内存,形成进程
(2)一个程序可以同时存在多个进程
(3)4G内存空间分布
代码区 数据区 bss区 堆区 栈区 命令行参数和环境列表 内存区
6.虚拟内存
(1)每个进程都有各自独立的4g字节虚拟地址空间
(2)用户程序中使用的都是虚拟地址空间中的地址,永远无法直接访问实际物理内存地址
(3)虚拟内存到物理内存的映射由操作系统动态维护。

(4)虚拟内存一方面保护了操作系统的安全,另一方面允许应用程序,使用比实际物理内存更大的地址空间。
7.对内存的越权访问或者试图访问没有映射到物理内存的虚拟内存,将导致段错误
用户空间对应进程,进程一切换,用户空间随之变化
8.每个进程的内存空间完全独立,不同进程之间交换虚拟内存地址是毫无意义的
9.标准库内部通过维护一个双向链表,管理在堆中动态分配的内存
10.虚拟内存到物理内存的映射以页为单位(4K=4096字节);在这里插入图片描述
11.内存管理APIs
增量方式分配虚拟内存
void *sbrk(intptr_t increment);
内部维护一个指针,指向当前堆内存最后一个字节的下一个位置
sbrk函数根据增量参数调整该指针的位置,同时返回该指针原来的位置
若发现页耗尽或者空闲,则自动追加或者取消页映射
12.修改虚拟内存块末尾地址
int brk(void *end_data_segmeng);
内部维护一个指针,指向当前堆内存最后一个字节的下一个位置。
brk函数根据指针参数设置该指针的位置。
若发现页耗尽或空闲,则自动追加或取消页映射。
13。创建虚拟内存到物理内存或者文件的映射
void *mmap(void *start,size_t length,int port,int flags,int fa,off_t offset);
成功返回映射区内存起始地址,失败返回MAP_FAILED(-1)。
14.销毁虚拟内存到物理内存或文件的映射
int munmap(void *start,size_t length);
mmap/munmap底层不维护任何东西,只是返回一个首地址,所分配内存位于堆中。
brk/sbrk底层维护一个指针,记录所分配的内存结尾,所分配内存位于堆中,底层调用mmap/munmap。
malloc底层维护一个双向链表和必要的控制信息,不可越界访问,所分配内存位于堆中,底层调用brk/sbrk。
每个进程都有4G的虚拟内存空间,虚拟内存地址只是一个数字,并没有和实际的物理内存将关联。
所谓内存分配与释放,其本质就是建立或取消虚拟内存和物理内存间的映射关系。

发布了14 篇原创文章 · 获赞 84 · 访问量 2789

猜你喜欢

转载自blog.csdn.net/weixin_42617375/article/details/103744709
今日推荐