Unix学习记录(二)

通过上周的初次尝试复习,像是站在一个更高的位置,旁观这些知识的作用,以及为什么要出现这些知识,不足之处是欠缺实践,理解不透彻。

总结的内容对大家可能帮助不大,因为整理复习总结是当事人受益最多。

开始本周的复习!!

虚拟内存相关概念有哪些?

虚拟内存:每个进程中各自独立的地址空间。

页面换出:长期闲置代码或数据从内存缓存到磁盘上的交换分区或换页文件。

页面换入:从交换分区或换页文件中恢复到半导体内存中。

内存映射表动态维护:虚拟内存到物理内存,或者说地址空间到内存空间的映射关系。

每换一页是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节点结构:元数据(文件权限,类型等)、数据块索引表。【就是在上边讲的可以存储数据的文件结构】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值