显存管理总结:
1、mmap/底层是不维护任何东西,只返回一个映射后的显存首地址,所映射的显存坐落堆中
2、brk/sbrk底层维护一个表针,记录了所映射的显存结尾下一位,所映射的显存也是坐落堆中,底层调用了mmap/
3、/free底层维护一个单向数组和必要的维护信息,所映射的显存也是坐落堆中,底层调用了brk/sbrk
4、每个进程都有4G(32位系统)的虚拟显存空间,虚拟显存只是个数字,必须与数学显存构建映射关系能够使用
5、平时所说的显存的分配和释放有两层涵义:
a、权限的分配和释放
b、映射关系的完善和取消
6、重点不是sbrk/brk/mmap/函数的用法,而是理解Linux系统的显存管理机制
一、系统调用(API)
系统调用就是操作系统提供的一些功能给程序员使用,这种功能早已被封装成C函数的方式,但它们不是标准C的一部份
通常应用程序运行在用户态(使用的是0~3G的虚拟显存),系统调用时工作在内核态(使用的是3~4G的虚拟显存)
常用的标准库函数绝大部分时间运行在用户态,底层时常也会调用系统调用步入内核态
系统调用使用运行就是内核代码,内核代码属于内核的一部份,该代码的外部插口以函数方式定义在共享库中(linux-gate.sold-linux.so.2)
time./a.out
.012s执行总用时
.000s用户态执行时间
.000s内核态执行时间
二、一切皆文件
UNIX/Linux为操作便捷把所有的服务、设备等内容都具象成了文件的方式,并提供了一套简单而统一的插口,这部份插口称为系统文件IO
也就是说UNIX/Linux把任何对象都可以当作文件处理,以文件方式访问
文件分类:
普通文件-包括纯文本文件、二补码文件、各种压缩文件
目录文件d类似文件夹(必须有执行权限能够步入)
块设备文件b保存大块数据的设备,比如硬碟
字符设备文件c诸如按键、鼠标等等
链接文件l类似的快捷方法
管线文件p
文件s一般用于网路数据联接
三、文件相关的系统调用
#
#
#
(*,);
功能:打开文件
:文件的路径
flags:打开文件的形式
只读
只写
读写
追加,文件位置表针在末尾
文件不存在则创建
文件存在则创建失败
假如文件存在则清空
返回值:文件描述符,类似于标准库中的FILE*,代表了一个打开的文件,成功返回非正数,失败返回-1
(*,,);
功能:创建文件
:文件的路径
flags:打开文件的形式
只能写
mode:权限网段|||
拥有者读写执行权限
拥有者读权限
拥有者写权限
拥有者执行权限
同组读写执行权限
同组读权限
同组写权限
同组执行权限
其它读写执行权限
其它读权限
其它写权限
其它执行权限
(*,);
功能:创建文件
mode:同open的mode
返回值:文件描述符
练习1:
测试fopen的打开方法与open的对应关系./a.out
r+
||,0666
w+||,0666
||,0666
a+||,0666
#
(intfd,*buf,);
功能:把显存中的数据写入到文件中
fd:文件描述符,也就是open的返回值
buf:待写入的显存首地址
count:要写入的字节数
返回值:成功写入的字节数
(intfd,void*buf,);
功能:从文件中读取数据到显存中
fd:文件描述符
buf:数据储存的显存首地址
count:想要读取的字节数
返回值:实际读取到的字节数
(intfd);
功能:关掉文件
返回值:成功返回0,失败返回-1
练习2:分别用标准IO和系统IO写入一百万个整数到文件中,测试谁更快,为何?
直接使用标准IO比系统IO写入的速率更快,缘由是标准IO有缓冲区机制,在写入数据时并不是直接调用系统IO,而是先把缓冲区塞满,之后再调用系统IO把缓冲区中的数据一并写入到文件中,提升读写速率。
直接使用系统IO会频繁地切换用户态和内核态,愈发历时。
假如我们也给系统IO降低一个缓冲区机制时,它的速率都会比标准IO要快
标准IO>系统IO
系统IO+缓冲区>标准IO
四、随机读写:
每位打开的文件都有一个记录着读写位置的文件位置表针,对文件的读写操作都从该表针指向的位置进行,位置表针会随着读写操作而降低联通
一个打开的文件,位置表针指向开头,假如使用,则在文件末尾
假如想要随便读取文件中的任意位置的数据,可以通过调整位置表针来实现
//标准IO
(FILE*,,);
返回值:成功0失败-1
//系统IO
(intfd,,);
fd:文件描述符
:偏斜量
:基础位置
文件开头