1、UNIX体系结构
什么叫做内核?
内核是一种软件,它控制计算机硬件资源,并提供程序的运行环境。
什么叫操作系统?
在广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,如可以向用户提供服务之类的。
什么是系统调用?
内核的接口被称为系统调用。公用函数库构建在系统调用接口上,应用软件既可使用公用函数库,也可使用系统调用。
2、文件和目录
创建新目录的时候会自动创建两个文件名:.和..。
在根目录下,这两个文件是同一个文件。
目录是一个包含许多目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名。(参考《鸟哥的私房菜》)
UNIX文件系统的大多数实现并不在目录项中存放属性,这是因为当一个文件具有多个硬链接时,很难保持多个属性副本之间的同步。
以斜线开头的路径名称为【绝对路径】,否则则为【相对路径】。
根文件的名字/是一个特殊的绝对路径名,它不含文件名。
stdin、stdout和stderr都属于文件,所以可以使用fgets(buf,MAXLINE,stdin);从标准输入中读入一行。
3、输入和输出
文件描述符是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。
按惯例,每当运行一个程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出以及标准出错。一般情况,这三个描述符都链向终端,但shell也提供一种方法,使其中任何一个或所有三个描述符都能重新定向到某个文件,例如:
ls > file.list
即标准输出到file.list文件,而非终端。
函数open、read、write、lseek以及close提供了不用缓冲的I/O,这些函数都使用了文件描述符。
例子:
#define BUFFSIZE 4096 int main() { int n; char buf[BUFFSIZE]; while((n = read(STDIN_FILENO,buf,BUFFSIZE)) > 0) { if(write(STDOUT_FILENO,buf,n) != n) { printf("write error!"); exit(1); } if(n < 0) { printf("read error!"); exit(1); } } exit(0); }
或者
相对于不带缓冲的I/O函数而言,标准I/O函数提供了带缓冲的接口。
【原文:The standard I/O functions provide a buffered interface to the unbuffered I/O functions.】
int main() { char c; while((c = getc(stdin)) != EOF) { if(putc(c,stdout) == EOF) { printf("output error!"); exit(1); } if(ferror(stdin)) { printf("input error!"); exit(1); } } exit(0); }
在运行终端上:
./test < infile > outfile
此时STDIN_FILENO描述符表示infile,STDOUT_FILENO描述符表示outfile。
4、程序和进程
程序是存放在磁盘上,处于某个目录中的一个可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行。
在一个进程内的所有县城共享同一个地址空间、文件描述符、栈以及进程相关的属性。因为它们能访问同一存储区,所以各县城在访问共享数据时需要采取同步措施以避免不一致性。
与进程相同,线程也用ID标识。但是,线程ID只在它所属进程内起作用。一个进程中的线程ID在另一个进程中并无意义。
5、用户标识
用户ID为0的用户为根或超级用户。
6、信号
信号是通知进程已发生某种情况的一种技术。
7、时间值
进程时间。也称为CPU时间,用以度量进程使用的中央处理机资源。
当度量一个进程的执行时间时,UNIX系统使用三个进程时间值:
a、时钟时间。
b、用户CPU时间。
c、系统CPU时间。
时钟时间是进程运行的时间总量。
用户CPU时间是执行用户指令所用的时间。
系统CPU时间是为该进程执行内核程序所经历的时间(系统调用所耗时间)。例如read或write,在内核内执行所花费的时间就计入该进程的系统CPU时间。
用户CPU时间和系统CPU时间之和常被称为CPU时间。
8、系统调用和库函数
系统调用和库函数都以C函数的形式出现。必要时我们可以替换库函数,而通常却不能替换系统调用。
系统调用和库函数之间的一个差别是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。