1. UNIX体系结构(UNIX Architecture)

调用内核的接口叫做系统调用(system call,图1.1中的阴影部分),普通函数库是建立在系统调用接口的基础之上。应用(application)可以同时使用函数库或者系统调用。Shell是一种特殊的应用,它为运行其他应用提供接口。总的来说,一个操作系统由内核和所有其他的软件组成,这些软件包括系统实用程序,应用,shell,普通的函数库等等。

2. 登录(Logging In)

2.1 登录名

系统在password文件中寻找登录名,通常为文件/etc/passwd。每个用户由7部分组成:登录名:加密密码:用户ID:用户组ID:注释字段:home文件夹:shell程序

所有现代的系统都将加密密码移到了另外一个文件中。

2.2 Shell

一个shell是一个命令行解释器,它读取用户输入并执行命令。用户输入通常从终端中读入,有时候也从文件读入(叫做shell脚本)。我们在图1.2中对使用的shell进行总结:

具体执行哪个shell由passwd文件中最后一个字段指定。

3. 文件和文件夹

3.1 文件系统

UNIX文件系统是文件和文件夹的一个分层布置。文件夹也是一个文件,它包含了文件夹入口。我们可以将每个文件夹入口想象成一个文件名和描述文件属性的结构体的组合。文件的属性包括文件类型(文件,文件夹),文件大小,文件拥有者,文件的访问级别(其他用户是不是可以访问这个文件),还有文件的最后修改时间。我们使用stat和fstat函数来返回包含所有文件属性信息的结构体。

3.2 文件名

只有两个字符不能出现在文件名中,反斜杠“/”和null字符。因为反斜杠用于分隔路径中的文件名,null字符用于终止路径名。

4. 输入和输出

4.1 文件描述符

文件描述符是一个非负整数,内核用它来标识进程访问的文件。

4.2 标准输入,标准输出,标准错误

按照惯例,当一个新的程序运行时,所有的shell都会打开三个描述符:标准输入,标准输出和标准错误。如果没有任何特殊操作,这三个描述符都会被连接到终端。大多数shell都提供了将三个描述符重定向到文件的功能。

4.3 无缓冲I/O

无缓冲I/O由函数open,read,write,lseek和close提供。这些函数同文件描述符一块工作。

 #include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > )
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < )
err_sys("read error");
exit();
}

4.4 标准I/O

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

我们最熟悉的标准I/O函数是printf。

用标准I/O将标准输入复制到标准输出:

 #include "apue.h"
int
main(void)
{
int c;
while ((c = getc(stdin)) != EOF)
if (putc(c, stdout) == EOF)
err_sys("output error");
if (ferror(stdin))
err_sys("input error");
exit();
}

5. 程序和进程

5.1 程序

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

5.2 进程和进程ID

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

5.3 进程控制

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

5.4 线程和线程ID

多个控制线程可以使得某些问题解决起来更加容易,并能充分利用多处理器系统的并行行为。

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

线程也用ID标识,一个进程中的线程ID在另外一个进程中没有意义。

6. 出错处理

当UNIX系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。有些函数对于出错使用另外一种约定而不是返回负值。例如大多数返回对象指针的函数在出错时会返回一个null指针。

Linux支持多线程存取errno:

 extern int *_ _errno_location(void);
#define errno (*_ _errno_location())

对于errno应当注意两条规则。第一条是:如果没有出错,其值不会被例程清除。第二条是:任何函数都不会将errno值设置为0.

6.1 出错恢复

可将在<errno.h>中定义的各种出错分成两类:致命性的和非致命性的。致命性的错误无法恢复。只能打印日志。对于非致命性的错误,有时可以较为妥善的进行处理。

7. 用户标识

7.1 用户ID

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

用户ID为0的用户为根用户(root)或超级用户(superuser)。在口令文件中,通常有一个登录项,其登录名为root,我们称这种用户的特权为超级用户特权。超级用户对系统具有自由的支配权。

7.2 组ID

口令文件登录项也包括用户的组ID,它是一个数值。在口令文件中有多个登录项具有相同的组ID。组被用于将若干用户集合到项目或部门中去。这种机制允许同组的各个成员之间共享资源(如文件)。

组文件通常是/etc/group。

8. 信号

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

  1. 忽略信号。
  2. 按系统默认方式处理。对于除数为0,系统默认方式是终止该进程。
  3. 提供一个函数,信号发生时调用该函数,这被称为捕捉该信号。

9. 时间值

历史上UNIX系统使用过两种不同的时间值。

  1. 日历时间。这个值是UTC时间(1970年1月1日 00:00:00)这个特定时间以来所经过的描述累计值。系统基本数据类型time_t用来保存这种时间值。
  2. 进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以始终滴答计算。系统基本数据类型clock_t保存这种时间值。

当度量一个进程的执行时间时,UNIX系统为一个进程维护了三个进程时间值:

  • 时钟时间,它是进程运行的时间总量,其值与系统中同时运行的进程数有关。
  • 用户CPU时间;它是执行用户指令所用的时间量。
  • 系统CPU时间。它是该进程执行内核程序所经历的时间。

可以用time命令来获取上述三个时间值。

10. 系统调用和库函数

所有操作系统都提供多种服务的入口点,由此程序向内核请求服务。各版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称作系统调用。

库函数可能会调用一个或者多个内核的系统调用,但是它们并不是内核的入口点。

应用程序既可以调用库函数也可以调用内核函数。

UNIX 系统概述的更多相关文章

  1. linux学习笔记:第二单元 UNIX和Linux操作系统概述

    第二单元 UNIX和Linux操作系统概述 UNIX是什么 UNIX操作系统的特点 UNIX 与Linux的关系 GNU项目与自由软件 GUN计划 自由软件意味着什么 Linux简介 Linux是什么 ...

  2. Unix 和· Linux 系统概述

    一.Unix 1.Unix 定义 Unix 是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序 '2.Unix 特点 ① 多用户:在同一时刻可以有多个用户同时使用Unix操作 ...

  3. JFS 文件系统概述及布局分析

    JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...

  4. Unix/Linux笔记全集

    1:Unix/Linux操作系统概述 要求:理解应用软件和操作系统的区别,掌握系统的Kernel(核心)和shell(外壳)之间的关系以及各自的作用 Solaris:Solaris 是Sun Micr ...

  5. 【Linux基础】Unix与Linux操作系统介绍

    一.Unix和Linux操作系统概述 1.Unix是什么 UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2.Unix特点 (1)多用户:在同一时刻可以有多个用 ...

  6. 操作系统概述(os 笔记一)

    操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 ​ 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...

  7. Linux与其它类Unix内核的比较

    单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...

  8. Unix操作系统的入门与基础

    http://dev2dev.cnblogs.com/archive/2005/10/10/251894.aspx Unix操作系统的入门与基础 与大家熟悉的Windows用户界面和使用习惯不同,Un ...

  9. Ansible 系统概述与部署

    Ansible 系统概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet但是有一个不同和优点是我们不需要在节点中安装 ...

随机推荐

  1. JavaScript当页面关闭时向后台发送请求

    今天做项目时遇上一个需求,当浏览器或页面关闭时将数据存储到数据库内.实现思想是采用js监测onunload然后发送请求.结果失败,刷新可以发送但是关闭并不能,整了一整天并没有解决,最后找到了解决办法. ...

  2. (18)IO流之字节缓冲路

    缓冲流 BufferedInputStream 缓冲输入流 前面的练习告诉我们使用缓冲数组读取的效率更高,为了方便的大家的操作,sun 位大家提供了一个缓冲输入字节流对象,让我们可以更高效率的读取文件 ...

  3. 利用python的爬虫技术爬去糗事百科的段子

    初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...

  4. 我的java学习笔记

    最近一直在自学C#和js,想着想把以前学的java学习笔记整理下发上来.

  5. 爱回收jd图标

    http://jd.aihuishou.com/images/icons.png http://misc.360buyimg.com/201007/skin/df/i/bg_hotsale.gif 来 ...

  6. 关于 Python generator(生成器)的类比

    Python 的生成器运用仿佛是最完美的 xing爱,生成器本身和循环代表男女,结束代表同时达到高潮,不是很精准,但很有趣啊!哈哈哈,一下记住了

  7. 从今天开始学习Java了

    //今天第一天学习了Java的起源兴起和用途,Java的特点和优势,又重新练习了hello world, public class Hello{ public static void main(Str ...

  8. unity插件开发——AssetDatabase

    AssetDatebase也是一个静态类,他的作用是管理整个工程的所有文件(一般成为“资产”).直观地说就是管理整个project窗口中的所有内容,比如,你可以增加.删除.修改文件等等. 这里有几个常 ...

  9. Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  10. 1.Maven的安装及配置

    1 Maven 介绍 Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”.本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个颇为成功的开源项目,Maven ...