UNIX 系统概述

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. 信号
信号用于通知进程发生了某种情况。进程有三种处理信号的方式。
- 忽略信号。
- 按系统默认方式处理。对于除数为0,系统默认方式是终止该进程。
- 提供一个函数,信号发生时调用该函数,这被称为捕捉该信号。
9. 时间值
历史上UNIX系统使用过两种不同的时间值。
- 日历时间。这个值是UTC时间(1970年1月1日 00:00:00)这个特定时间以来所经过的描述累计值。系统基本数据类型time_t用来保存这种时间值。
- 进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以始终滴答计算。系统基本数据类型clock_t保存这种时间值。
当度量一个进程的执行时间时,UNIX系统为一个进程维护了三个进程时间值:
- 时钟时间,它是进程运行的时间总量,其值与系统中同时运行的进程数有关。
- 用户CPU时间;它是执行用户指令所用的时间量。
- 系统CPU时间。它是该进程执行内核程序所经历的时间。
可以用time命令来获取上述三个时间值。
10. 系统调用和库函数
所有操作系统都提供多种服务的入口点,由此程序向内核请求服务。各版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称作系统调用。
库函数可能会调用一个或者多个内核的系统调用,但是它们并不是内核的入口点。
应用程序既可以调用库函数也可以调用内核函数。

UNIX 系统概述的更多相关文章
- linux学习笔记:第二单元 UNIX和Linux操作系统概述
第二单元 UNIX和Linux操作系统概述 UNIX是什么 UNIX操作系统的特点 UNIX 与Linux的关系 GNU项目与自由软件 GUN计划 自由软件意味着什么 Linux简介 Linux是什么 ...
- Unix 和· Linux 系统概述
一.Unix 1.Unix 定义 Unix 是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序 '2.Unix 特点 ① 多用户:在同一时刻可以有多个用户同时使用Unix操作 ...
- JFS 文件系统概述及布局分析
JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...
- Unix/Linux笔记全集
1:Unix/Linux操作系统概述 要求:理解应用软件和操作系统的区别,掌握系统的Kernel(核心)和shell(外壳)之间的关系以及各自的作用 Solaris:Solaris 是Sun Micr ...
- 【Linux基础】Unix与Linux操作系统介绍
一.Unix和Linux操作系统概述 1.Unix是什么 UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2.Unix特点 (1)多用户:在同一时刻可以有多个用 ...
- 操作系统概述(os 笔记一)
操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...
- Linux与其它类Unix内核的比较
单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...
- Unix操作系统的入门与基础
http://dev2dev.cnblogs.com/archive/2005/10/10/251894.aspx Unix操作系统的入门与基础 与大家熟悉的Windows用户界面和使用习惯不同,Un ...
- Ansible 系统概述与部署
Ansible 系统概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet但是有一个不同和优点是我们不需要在节点中安装 ...
随机推荐
- .NET Framework 各版本区别(简介)
本文通过在网络资料整理而得. .NET Framework1.1 1.自带了对mobile asp.net控件的支持.(在1.0版本是以附加功能实现) 2.加入了ASP.NET应用程序的代码安全访问功 ...
- WP8.1小梦词典开发1:金山词霸API使用
原文出自:http://www.bcmeng.com/windows-phone-api/ 今天开始小梦给大家分享一下小梦词典开发中几个关键问题,首先我们来看查词功能的实现.小梦词典的查词功能是通过金 ...
- eclipse项目导入到android studio中文乱码处理
由于eclipse项目是gbk编码,Android studio默认用的是utf-8. 就会导致代码中的汉字,注释全部显示为乱码. 解决方法:在module的bulid.gradle中加入: comp ...
- 什么是https
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...
- httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
PoolingHttpClientConnectionManager是一个HttpClientConnection的连接池,可以为多线程提供并发请求服务.主要作用就是分配连接,回收连接等.同一个rou ...
- bzoj3531——树链剖分+动态开点线段树
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连 ...
- stl1
#include<iostream> #include<map> #include<string> using namespace std; map<st ...
- 每天学点Java小知识【1】
一 Java标识符和关键字 1.标识符 作用:用来标识类名.变量名.方法名.类型名.数组名.文件名的有效字符序列. 组成规则:由字母.下划线.美元符号和数字组成,且第一个字符不能是数字字符.注意:标识 ...
- 4.熟悉Java基本类库系列——Java 正则表达式类库
正则表达式语法结构图: Java正则表达式类库结构图: Java典型例子 1.String类 matches()方法 判断字符串是否符合特定正则表达式 @Test public void testRe ...
- MyBatis 源码分析——动态SQL语句
有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...