Linux环境编程 day02 内存管理、进程映像、虚拟内存、管理内存的API、系统调用、文件操作
内存管理的层次划分
STL 智能指针,可以自动分配/释放内存资源 调用C++
C++ new/delete运算符,构造/析构函数 调用标准C
标准C malloc/calloc/realloc/free 调用POSIX接口
POSIX brk/sbrk 调用Linux
Linux mmap/munmap 调用kernel
Kernel kmalloc/vmalloc 调用驱动
驱动 get_free_page
进程映像
程序就是保存在磁盘上的可执行文件,进程就是被加载到内存中正在执行的程序。
进程在内存空间中的分布情况叫作进程映像,从低到高依次是:
代码段 text
可以执行的二进制指令、字面值常量、以及被const保护的原data、bss区的变量,该内存段的权限是只读的,如果强行修改会产生段错误。
全局数据段 data
初始化的全局变量、静态变量。
静态数据段 bss
末初始化的全局变量、静态变量。
进程一旦被加载,该段内存就会被清理为0。
data和bss合称为全局区或静态区
堆区 heap
动态内存分配,从低地址向高地址扩展。
C语言没有管理堆内存的语句,只能通过标准库函数和系统函数对它进行管理。
栈区 stack
局变量变量、块变量、函数参数、返回值等都存储在该段内存。
由系统自动管理,由高到低扩展
命令行参数和环境变量表:指向命令行参数的指针和指向环境变量的指针。
#include <unistd.h>
pid_t getpid(void);
功能:获取当前进程的编号,俗称进程号
cat /proc/进程号/maps 可以查看到当前进程的分布情况。
虚拟内存
1、在32位系统下,每个进程都有0~4G虚拟内存。(注意,是32位系统下,64位是不一样的)
2、这些虚拟内存不能直接使用,需要与物理内存建立映射关系后才能使用,否则就会出现段错误。
3、虚拟内存与物理内存的映射由操作系统动态维护。
4、用户永远无法直接使用物理内存,只能使用虚拟内存。
5、4G内存空间分为两部分
[0~3G] 用户空间 如某栈内存地址为0xbfe95000,约等于3G
[3G~4G] 内核空间
6、用户空间的代码是不能访问内核空间的代码和数据,但可以通过系统调用进入内核状态,间接的与系统内核交互。
7、每个进程都对应一个用户空间,进程一切换用户空间随之变化,每个进程都有一个独一无二的进程号,进程之间是互相独立的。
虚拟内存机制有哪些优点?
安全,防止进程之间的冲突,也可以避免操作系统被进行破坏。
可以让进程使用到比物理内存更大的内存空间(把硬盘文件与虚拟内存进行映射)。
管理内存的API