13.进程的内存分配,按低地址到高地址系统地讲述一下
分配4G的虚拟空间,用多少占用多少,然后1G内核。
进程的内存空间从低地址到高地址内存布局依次是: 保留区 –> 文本段(包含程序和字符串常量)–>初始化的变量(.data,包含全局变量和静态变量)—>未初始化的变量(.bss,包含全局变量和静态变量)—>堆—>共享库或mmap—>栈–>命令函参数(main函数的参数)–>环境变量—>内核空间
- 栈向低地址推
- 堆向高地址推
- malloc的时候(堆)
- brk,将堆的最高地址往高出推,只能高地址释放,低地址才能释放
- mmap,随便释放,找一块空闲的虚拟内存
虚拟内存解决了一个物理空间不连续问题,将断断续续的物理内存映射到虚拟内存上,起到看起来是连续的一段空间。
1、brk是将堆的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
缺页中断===》一页=4096字节=4KB(注意是Byte,1B=8bit)
14.C语言如何面向对象
多态
#include "stdio.h"
typedef struct Person{
char *name;
void (*eat)();
}Person;
void fun1(){
printf("student eat!\r\n");
}
void fun2(){
printf("teacher eat!\r\n");
}
int main(){
Person student={"student",fun1};
Person teacher={"teacher",fun2};
student.eat();
teacher.eat();
}
15.const 用法
const 右边靠近谁,谁就不可变,靠近*就是指向的不可变,靠近变量命,就是该变量不可变
const int *p; //cons