通过上周的初次尝试复习,像是站在一个更高的位置,旁观这些知识的作用,以及为什么要出现这些知识,不足之处是欠缺实践,理解不透彻。
总结的内容对大家可能帮助不大,因为整理复习总结是当事人受益最多。
开始本周的复习!!
虚拟内存相关概念有哪些?
虚拟内存:每个进程中各自独立的地址空间。
页面换出:长期闲置代码或数据从内存缓存到磁盘上的交换分区或换页文件。
页面换入:从交换分区或换页文件中恢复到半导体内存中。
内存映射表动态维护:虚拟内存到物理内存,或者说地址空间到内存空间的映射关系。
每换一页是4*1024字节,而不是1字节。
内存分配:在地址空间中划出一定大小的范围,加以标记,表示占用;在物理内存中找到相应大小的空间,建立映射,记录映射表。
内存释放:解除映射关系,占用范围标记为不占用。
内核空间与用户空间?
在每个进程“独立”的虚拟内存中,一部分高地址的虚拟内存成为内核空间,为系统中所有进程共享,存放系统内核的代码和数据。其余低地址虚拟内存为用户空间,存放该进程自己的代码和数据。
用户空间和内核空间的代码不能直接访问,要借助系统调用(封装好的具有些特定功能的函数)进入内核态。
内核态高度警惕,安全等级高;用户态反之。
内存壁垒?
每个进程的用户空间都有一张专属的内存映射表。但所以进程的内核空间维护的是同一张内存映射表init_mm.pgd。
虚拟内存如何分配与释放?
只有虚拟内存的堆内存区通过编程方法完成内存的分配与释放。其他代码区,数据区,BSS区,栈区,都是系统干的事,也是不允许操作的。
概念:堆尾指针:堆内存的最后一个字节的下一个字节的地址。
注意:分配内存的时候是低地址到高地址,释放内存是从高地址开始释放。
可以分配虚拟内存的函数?
1)sbrk函数:【以相对方式分配和释放虚拟内存】
函数原型:#include <unistd.h> void* sbrk(intptr_t increment);
成功返回该函数之前的堆尾指针,失败返回-1。
参数:堆内存增加字节数。其值>0为分配虚拟内存。<0为释放虚拟内存。=0为获取当前堆尾。
2)brk函数:【以绝对方式分配和释放虚拟内存】
函数原型:#include <unistd.h> int brk(void* end_data_segment);
成功返回0,失败返回-1。
参数:新堆尾指针。其值>当前堆尾指针为分配虚拟内存。<当前堆尾指针为释放虚拟内存。=当前堆尾指针为啥也没做。
总结:sbrk分配虚拟内存简便,释放麻烦。brk反之,这俩搭配着用最好了。
用来建立地址映射的内存操作函数?
1)mmap函数:【建立虚拟内存到物理内存或磁盘文件的映射】
函数原型:#include <sys/mman.h> void* mmap(void* start,size_t length,int port,int flags,int fd,off_t offset);
成功返回映射区(虚拟)内存起始地址,失败返回MAP_FAILED(-1)。
参数:start:映射区(虚拟)内存起始地址,NULL值为系统自动选定后返回
参数:length:映射区字节数。
参数:port:访问权限。PROT_READ读/PROT_WRITE写/PROT_EXEC
参数:flags:映射标志。虚拟内存到物理内存映射,虚拟内存到磁盘文件映射
参数:fd和offset只用于虚拟内存到磁盘文件映射
2)munmap函数:【解除虚拟内存到物理内存或磁盘文件的映射】
函数原型:#include <sys/mman.h> int munmap(void* start,size_t length);
成功返回0 ,失败-1.
参数:start:映射区(虚拟)内存起始地址
参数:length:映射区字节数。
系统调用的执行过程?
系统调用目的:涉及到系统级别资源的操作(例如文件管理、进程控制、内存管理)的时候,就要从用户态进入内核态进行操作。
一个系统调用分为两部分,一部分在用户态执行,定义在系统调用库中的C函数,另一部分在内核态执行,提供实际功能的系统调用函数。二者之间通过80H中断相互联系。
用户时间和系统时间?
进程在这两个状态下执行的时间,称为用户时间和系统时间。
分配内存(内核态)
存入数据(用户态)
打开文件(内核态)
计算数据(用户态)
睡眠(挂起态)
将结果写入文件(内核态)
释放内存(内核态)
关闭文件(内核态)
使用命令“time 可执行程序”看执行的不同时间。
文件系统的结构?
1)硬盘结构:若干个分区(逻辑卷)。
2)分区结构:引导块(引导系统启动的代码)、超级块(分区描述信息)、若干个柱面组(存储数据)。
3)柱面组结构:超级块副本、柱面组信息、i节点映射表(文件号和i节点的映射表)、块位图(区分空闲块)、i节点表(若干个i节点)、数据块集(若干个数据块,用于存储数据)
4)i节点表:若干个i节点。
5)i节点结构:元数据(文件权限,类型等)、数据块索引表。【i节点大小固定】
6)数据块索引表结构:若干个数据块索引号(通过索引号找到数据块,其中包含直接块和间接块,最终这些块拼接成文件)。
文件类型有哪些?
1)普通文件(由-表示),也称为流式文件。
2)目录文件(d表示):它仅存储文件名和i节点号的映射。这种映射称为目录条目,也叫硬链接。(两个文件i节点号一致)
3)符号链接(软链接)文件(由l表示):独立的i节点和一个被链接文件路径的字符串。(两个文件i节点号不一致)
4)(有名)管道文件(由p表示):只有i节点和目录中的硬链接条目,i节点中只有元数据没有数据库索引表。实质是一个内核中的对象,可用于在不同进程之间交换数据。
操作文件的函数有哪些?
1)文件打开:open。成功返回文件描述符。
2)文件关闭:close。成功返回0 ,参数传递文件描述符。
什么是文件描述符?
1)进程表结构:进程表项、文件描述符表。
2)文件描述符表结构:文件描述符、文件表项指针。
3)文件表项结构:状态标志、读写位置、V节点指针。
4)V节点结构:包括i节点和其他信息。
5)i节点结构:元数据(文件权限,类型等)、数据块索引表。【就是在上边讲的可以存储数据的文件结构】