Unix 体系结构

img

  • 内核:从严格意义来说,可将操作系统(内核)定义为一种软件,它控制计算机硬件资源,提供程序运行环境。
  • shell: 是一个命令行解释器,它读取用户输入,然后执行命令。

函数

系统调用通常提供一种最小的接口,而库函数通常提供比较复杂的功能。

  • 系统调用:内核的接口。各种版本的Unix实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点称为系统调用
  • 公用库函数:封装一些功能,库函数可能会包含很多的系统调用

登录

  • /etc/passwd口令文件中保存这用户的登录相关信息。
  • 由七个以冒号分隔的字段组成:登录名、加密口令、数字用户ID、数字组ID、注释字段、起始目录(/home/sar)、shell程序(/bin/ksh)。
1
2
登录名 加密口令  数字用户ID  数字组ID   注释字段   起始目录    shell程序
root    x        0         0        root     /root      /bin/bash

文件和目录

文件系统

  • UNIX 文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录名称是一个字符 "/"
  • 目录(directory)是一个包含目录项的文件。

文件名

  • 目录中的各个名字称为文件名(filename)。只有斜线(/)和空字符不能出现在文件名中。
    • /:用来分隔构成路径名的各文件名。
    • 空字符:用来终止一个路径名。
  • 创建新目录的时候会自动创建两个文件名:.(点)和..(点点)。在最高层次的根目录中,点点和点相同
    • .(点):指向当前目录
    • ..(点点):指向父目录

路径名

由斜线分隔的一个或多个文件名组成的序列(也可以斜线开头)构成路径名(pathname),以斜线开头的路径名称称为绝对路径名(absolute pathname),否则称为相对路径名(relative pathname)。

  • 文件系统根的名字(/)是一个特殊的绝对路径名,它不含文件名。

工作目录

每个进程都有一个工作目录(working directory),有时称其为当前工作目录(current working directory)。所有的相对路径都从工作目录开始解释

起始目录

登录时,工作目录设置为起始目录(home directory),该其实目录从口令文件中相应的用户的登录项中取得。

输入和输出

文件描述符

文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。

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

按照惯例,每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入(standard input)、标准输出(standard output)、以及标准错误(standard error)。

不带缓冲的I/O

函数 open、read、write、lseek以及close提供了不带缓冲的I/O。

标准I/O

标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无须担心选取最佳的缓冲区大小。

程序和进程

程序

程序(program)是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数(7个exec函数之一),将程序读入内存,并执行程序。

进程和进程ID

程序被执行的实例被称为进程(process)。Unix系统确保每个进程都有一个唯一的数字标识符,称为进程ID(process ID)。进程ID总是一个非负整数

进程控制

有3个用于进程控制的主要函数:forkexecwaitpid。(exec函数有七种变体,但经常把它们统称为exec函数。)

  • fork:调用fork用于创建一个新进程。
  • waitpid: 函数返回子进程的终止状态(status变量)。

线程和线程ID

通常,一个进程只有一个控制线程(thread)——某一时刻执行的一组机器指令。

  • 一个线程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。因为它们能访问同一存储区,所有各线程在访问共享数据时需要采用同步措施避免不一致性。
  • 与进程相同,线程也用ID标识。但是,线程ID只在它所属的进程内起作用。一个进程中的线程ID在另一个进程中没有意义。当在一进程中对某个特定线程进行处理时,我们可以使用该线程的ID引用它。

出错处理

​ 当Unix系统函数出错时候,通常会返回一个负值,而且整形变量errno通常被设置为具有特定信息的值。

用户标识

用户ID

​ 口令文件登录项中的用户ID(user ID)是一个数值,它向系统标识各个不用的用户

  • 用户ID为0的用户为根用户(root)或者超级用户(superuser)。
    • 如果一个进程具有超级用户特权,则大多数文件名权限的检查都不再进行。

组ID

组被用于将若干用户集合到项目或部门中去。这种机制允许同组的各个成员之间共享资源(如文件)

这个组管理可以按照(rbac)角色资源管理去理解

口令文件登录项也包含用户的组ID(group ID),它是一个数值。

  • 组ID是由系统管理员在指定用户登录名时分配的。
  • 在口令文件中有多个登录项具有相同的组ID。

附属组ID

​ 除了在口令文件中对一个登录名指定一个组ID外,大多数UNIX系统版本还允许一个用户属于另外一些组。

信号

​ 信号用于通知进程发生了某种情况。进程有以下三种信号处理方式。

  • 忽略信号
  • 按系统默认的方式处理。一般是终止该进程
  • 提供一个函数,信号发生时调用该函数,这种称为捕捉信号。