# UNIX基本概念 ## 进程 - 从用户观点来看:进程是程序的一个执行实例。 - 从UNIX系统内部来看,是为运行程序提供执行环境的实体,是系统进行资源分配和调度运行的一个单位。 进程有三个特点: 1)进程有一个控制点和自己的独立地址空间。进程的控制点通过程序计数器跟踪着程序的指令序列。进程的地址空间由进程可以引用或访问的存储单元组成。进程在其他地址空间内执行程序的指令序列。 2)进程具有生存期。进程从创建到消亡的过程称为进程的生存期。一个进程的生存期可以分为一组状态,这些状态刻画了进程从创建、活动到消亡的过程。从用户的观点祖略划分,UNIX系统中进程主要有以下状态: - 新建 - 就绪:进程正在等待被执行 - 运行 - 阻塞:进程正在等待一个事件,如I/O - 僵死:进程已经结束,并等待释放资源。 进程的简单状态转换图: ![image](http://note.youdao.com/yws/res/42155/853BB42CF81D420983F8E42890D88736) 3)处于运行状态的进程有两种执行状态:用户态和核态。 若进程运行中执行的是用户程序中的指令,则进程处于用户态执行。当进程发出系统调用时,便进入核态执行。进程在核态下执行的是操作系统的指令,这些指令完成用户的请求,如输入输出、存储分配等。 ## 内核 实现软件管理硬件系统任务的软件称为操作系统,在UNIX术语中称为UNIX内核。UNIX内核是一个底层的直接运行于硬件的程序,它控制着硬件,并创建、销毁和控制所有进程。 UNIX体系结构图: ![image](https://note.youdao.com/yws/res/42199/WEBRESOURCE5ee43594b982898999a24271342960bb) 内核直接与硬件交互,向外提供UNIX系统调用接口,如read()、write()等。如shell以及date、ls和who之类的使用程序,通过系统调用请求内核完成各种操作,并在内核与调用程序之间交换数据。其他应用程序则在底层程序和工具的基础上构筑而成。 ## shell UNIX内核负责管理和创建进程,用户的输入命令是由shell来执行。shell是UNIX系统中的一个命令解释程序,处于用户和UNIX系统之间,骑着协调用户与系统间的一致性、在用户与系统之间进行交互的作用。 shell和内核 、使用程序和应用之间的关系: ![image](https://note.youdao.com/yws/res/42223/WEBRESOURCE821cd923c66b4119865bac9fc3ef95a7) shell种类: - sh - csh - ksh - bash 当系统同时存在多个shell时,/etc/password文件中用户注册账户登记项的最后一个字段标明应当使用哪一种sehll。 ## 用户名与用户ID、用户组和组ID 每个用户有一个账号,改账号有一个用户名和一个唯一的用户ID。 用户可以组织成组,一个用户可以是一个或多个组的成员,其中一个组是用的初始组,简称组。如果该用户还属于其他组,则这些组称为该用户的附加组。用户组由系统管理员建立。/etc/group中登记了系统中存在的所有组和组ID,以及组内的用户。 /etc/password记录了系统中所有的注册用户,每个用户有一个登记项,其中包含用户名、用户ID、用户组ID(指明该用户的初始组)等信息 。 %grep zkj /etc/passwd zkj x: 500: 15: /home/zkj: /bin/bash 同时,在/etc/ group文件包含如下内容 grep zkj /etc/group users x: 15: zkj research: x: 17: Yang, zkj, Hc, zhang Lib: x: 20: wang zki 那么,用户zk的用户D为500,组D为15。他是三个组的成员,这 三个组是: users、 research和Lib。其中, users是他的初始组, research和Lib是他的附加组
## 特权用户 root(超级用户),用户ID为0。特权用户控制着整个系统的权力。 ## 系统调用和库函数 系统调用时对操作系统的一种请求,它请求操作系统为用户程序完成某种工作。如:read()是一种系统调用,它请求操作系统将存贮在磁盘设备上的数据读入缓冲区。 为避免用户随意访问设备造成混乱,用户必须向操作系统请求服务,由操作系统统一管理请求并提供服务。==所有操作系统提供了定义好的、有限个数且直接进入内核的这类服务点,称为系统调用,也称程序设计与系统的接口==。 系统中无论使用什么技术实现系统调用,它的定义中式用C函数来表示。UNIX让每一个系统调用有一个相同名字的C函数,应用程序使用与标准C库函数相同的方法调用这些函数,这些函数然后用系统要求的技术来启动适当的内核服务。 库函数和系统调用不同,它可以不需要系统的介入来完成工作,并且也不是进入操作系统内核的入口点,尽管它们可以调用一至多个系统调用。如:printf需要调用write系统调用来完成输出,而复制 strcpy()和sin()则完全不需要操作系统的帮助。 应用程序和系统调用、库函数调用 ![image](https://note.youdao.com/yws/res/42329/WEBRESOURCEddd09d4cddc10e1e2165a76f4a5e62fc) 实现者角度,系统调用与库函数的区别:系统调用时UNIX内核提供的服务,而库函数处于内核之外;用户角度,没太大区分,系统调用和库函数均为普通的C函数,两者都服务于应用程序。
转载于:https://my.oschina.net/walkingsun/blog/2870513