本站总访问量 Unix基础知识 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

Unix基础知识

unix体系结构

从严格意义上说,操作系统可以定义为一种软件,这个软件控制硬件资源,为程序运行提供环境,我们通常将这种软件称为内核 kernel,位于整个环境的核心。

系统调用:内核的接口称为系统调用。公用函数库建立在系统调用之上,应用程序既可以使用公用函数库,也可以使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序提供接口。

每个操作系统都在内核里面有一些内建的函数库,这些函数可以用来完成一些系统调用,把应用程序的请求传给和内核,调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。

广义上讲,操作系统包括内核和一些其它软件,比如系统实用程序,应用程序,shell以及公用函数库等等。

登录

先键入用户名,然后键入密码。系统口令文件 /etc/passwd

7个字段依次是:登录名,加密口令,uid,gid,注释字段,起始目录,shell程序

文件和目录

所有东西的起点是根目录 /

文件系统

每个目录项都包含一个文件名,同时包含文件的属性信息。比如文件类型、大小、所有者、权限、最后修改时间。

文件名

斜线(/)和空字符不能出现在文件名中。

文件描述符

通常是一个小的非负整数,内核用来标识一个特定进程正在访问的文件。当内核去打开一个现有文件或者是新文件的时候,会返回一个文件描述符,可以用它对文件进行读写。

标准输入、标准输出、标准错误

每当运行一个新程序,所有的shell都会打开3个文件描述符,标准输入,标准输出、标准错误。并且自动连接到终端。用“>”可以重定向到文件。

不带缓冲的IO

函数open、read、write、lseek以及close提供了不带缓冲的IO,都使用文件描述符。

Linux对文件的IO操作分为带缓存和不带缓存,首先明确以下几点:
  • 不带缓存,实际上是在用户层没有缓存,所以叫做无缓存的IO。对于内核来说,实际上还是进行了缓存。
  • 带不带缓存是相对来说的。如果要将数据写入磁盘中,内核会先将数据写入内核所设的缓冲储存器,将缓冲储存器写满之后,在进行实际上的IO操作。也就是把数据写入磁盘中。

所以,不带缓存不是没有缓存直接写入磁盘,而是在用户层没有缓存

带缓存的IO实际上是在用户层建立一个缓存区,将用户层缓存区写满之后再写入内核缓存区,内核缓存区满了再写入磁盘中。这个用户层缓存,实际上减少了write()函数的调用次数。

所以两种方式的数据流向路径是:

无缓存IO:数据——内核缓存区——磁盘

有缓存IO:数据——流缓存区——内核缓存区——磁盘

标准IO带缓存的目的实际上是为了减少read()和write()的次数

标准IO提供了三种缓存方式:

  • 全缓存:填满标准IO缓存后才执行IO操作,磁盘上是全缓存。
  • 行缓存:当输入遇到新行符或者缓存满时才由标准IO执行实际IO操作,stdin、stdout实际上是行缓存。
  • 无缓存:相当于read、write。stderr通常是无缓存,他需要尽快输出。

标准IO即buffered IO都是调用unbuffered IO系统调用来实现的。他们并不直接读写磁盘,会集中对数据进行读写,用write()、read()函数,所以使用库函数的效率是高于直接使用系统调用的。

程序和进程

程序是存储在磁盘当中某个目录的可执行文件,内核使用exec函数将缓存读入内存并执行程序。

进程控制

3个用于进程控制的主要函数:fork、exec、waitpid

线程和线程ID

一个进程内的所有线程共享同一地址空间,文件描述符,栈以及与进程相关的属性,因为他们能访问同一存储区,所以线程在访问共享数据时需要采取同步措施以避免不一致性。

出错处理

当UNIX系统出错时,通常会返回一个负值,而且在整型变量error通常被设置为具有特定信息的值。例如,open函数如果成功执行则返回一个非负文件描述符,出错则返回-1。

用户标识

用户ID

用户ID用来标识唯一的用户。

用户ID为0的用户用来标识root或者超级用户。

组ID

组文件通常是/etc/group

信号

用于通知进程发生了某种情况,进程有三种处理信号的方式:

  • 忽略信号。
  • 按系统默认方式处理。对于除数0,系统默认方式是终止该进程。
  • 提供一个函数,信号发生的时候调用该函数,捕捉该信号。

终端键盘上产生的信号:中断键,执行终止。退出键。它们用于终端当前运行的进程。调用kill函数,像一个进程发送信号,不过需要是那个进程的所有者或者是超级用户。

时间值

进程时间:也被 称为CPU时间,用度量进程使用的CPU资源。

系统为一个进程维护了3个进程的时间值:

  • 时钟时间:墙上时钟时间,进程运行的时间总量,其值与系统运行的进程数有关。
  • 用户CPU时间:执行用户指令所用的时间量。
  • 系统CPU时间:为该进程执行内核程序所用的时间量。

评论