一、linux的i节点
(1)i节点可以理解为文件的指针,指向文件数据的地址
(2)硬链接,多个i节点指向同一块数据,即使删除源文件,由于i节点中记录了链接数,硬链接也是可以用的。硬链接和源文件可以等同
(3)软链接,i节点的指针(不是数据块的指针),删除源文件后,软链接不可用。
(4)目录项包括文件名和i节点。
参考:http://blog.csdn.net/feiyinzilgd/article/details/5609157
二、临时文件和unlink
(1)临时文件使用需要注意两点:要自动生成文件名,避免冲突;要自动删除文件,避免空间浪费。
(2)mkstemp函数将在系统中以独一无二的文件名创建一个文件并打开
(3)随后,调用unlink函数,文件不会删除,因为文件处于打开状态,直到程序退出时,文件才删除
(4)tmpfile = mkstemp + unlink,this function opens a unique temporary file in binary read/write (w+b) mode. The file will be automatically deleted when it is closed or the program terminates.
参考:http://blog.csdn.net/chenfei/article/details/14584 (如何在linux下使用c语言操作临时文件)
三、墙上时钟时间
(1)三种时间的定义
时钟时间(墙上时钟时间wall clock time):从进程从开始运行到结束,时钟走过的时间,这其中包含了进程在阻塞和等待状态的时间。
用户CPU时间:就是用户的进程获得了CPU资源以后,在用户态执行的时间。
系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。
(2)三者之间的关系
进程的三种状态为阻塞、就绪、运行。
时钟时间 = 阻塞时间 + 就绪时间 +运行时间
用户CPU时间 = 运行状态下用户空间的时间
系统CPU时间 = 运行状态下系统空间的时间。
用户CPU时间+系统CPU时间=运行时间。
四、权限掩码umask
(1)umask作用
用于控制新建文件和目录的默认权限
(2)umask使用
umask的初始值为022,执行umask,显示022;umask 024用于设定默认权限
(3)umask计算
umask初始值为022
新建文件时,没有x,只有w和r,最大为666,则默认权限为644
新建目录时,有x,也有w和r,最大为777,则默认权限为755
参考:http://myswirl.blog.163.com/blog/static/513186422010815113542243/
五、存储器分配替换库
1、由于存储器分配出错很难跟踪,某些系统提供了这些函数的其他实现版本。
ptmalloc2是Unix使用的内存分配库
tcmalloc号称比ptmalloc2快,属于gperftools
Hoard 的目标是使内存分配在多线程环境中进行得非常快
nedmalloc是一个跨平台的高性能多线程内存分配库,windows word都使用了这个库
2、C 语言里有一个 alloca 函数,可以在堆栈上分配一块内存,当前函数退出时,由于系统堆栈指针的调整,这块内存会被自动回收。今天,在各种编程文档中已经
不太提倡使用了。因为它有许多不安全因素。
3、牛文:内存管理内幕(动态分配的选择、折衷和实现)http://www.ibm.com/developerworks/cn/linux/l-memory/
六、低速系统调用
定义:
低速系统调用时可能使进程永远阻塞的一类系统调用。如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就被中断不再继续执行。该系统调用返回出错,其errno被设置为EINTR。
类型:不带缓存I/O:read,write
一个进程从终端读取用户的输入,然后再从终端输出。如果用户离开了电脑前,那么系统就会一直等待用户输入,用户永远不回来,系统就永远阻塞。
打开某种类型的文件
如果某进程为读打开FIFO,且此时没有为写的进程打开该FIFO。如果没有设置O_NONBLOCK标志位,那么open函数会阻塞直至其他某个进程为写而打开该FIFO;类似地,只写open会阻塞到其他某个进程为读而打开该FIFO。
解决方法:重新启动
again:
if( ( n = read(fd, buf,BUFFSIZE) ) < 0 )
{
if(errno == EINTR)
goto again;
}