(1)进程概述
(1.1)进程的概念
进程(Process) 是一个程序在其自身的虚拟地址空间中的一次执行活动。之所以要创建进程,就是为了使多个程序可以并发地执行,从而提高系统的资源利用率和吞吐量。
进程和程序的概念不同,下面是对这两个概念的比较。
Ø 程序只是一个静态的指令集合;而进程是一个程序的动态执行过程,具有生命期,是动态地产生和消亡的。
Ø 进程是资源申请、调度和独立运行的单位,因此使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此不占用系统的运行资源。
Ø 程序和进程无一-对应的关系。一方面一个程序可以由多个进程所共用,即一个程序在运行过程中可以产生多个进程;另一方面, -一个进程在生命期内可以顺序地执行若千个程序。
Linux操作系统是多任务的,如果一个应用程序 需要几个进程并发地协调运行来完成相关工作,系统会安排这些进程并发运行,同时完成对这些进程的调度和管理任务,包括CPU、内存、存储器等系统资源的分配。
(1.2)Linux中的进程
在Linux系统中总是有很多进程同时在运行,每一个进程都有一个识别号,叫作PID(Process ID), 用于与其他进程区别。系统启动后的第一个进程是systemd,其PID是1。systemd是唯一一个由系统内核直接运行的进程。新的进程可以用系统调用fork 来产生,就是从一个已经存在的进程中派生出一个新进程, 旧的进程是新产生 的进程的父进程,新进程是产生它的进程的子进程。
当系统启动以后,systemd进程会创建login进程等待用户登录系统,login 进程是systemd进程的子进程。当用户登录系统后,login 进程就会为用户启动Shell 进程,Shell 进程就是login进程的子进程,而此后用户运行的进程都是由Shell衍生出来的。
在多用户多任务的Linux系统里,每个进程都与运行的用户和组相关联。除了进程识别号(PID)外,在进程控制块(PCB)中每个进程还有另外4个与用户和组相关的识别号。它们是实际用户识别号(real user ID, RUID)、实际组识别号(real group ID, RGID)、有效用户识别号(effect user ID, EUID) 和有效组识别号(effect group D, EGID)。
RUTD和RGID的作用是识别正在运行此进程的用户和组。一个进程的RUID和RGID就是运行此进程的用户的UID和GID。
EUID和EGID的作用是确定一个进程对其访问的文件的权限和优先权。除非产生进程的程序被设置了SUID和SGID权限之外,一般, EUID、 EGID与RUID、RGID相同。若程序被设置了SUID或SGID权限,则此进程相应的EUID和EGID,将与运行此进程文件的所属用户的UID或所属组的GID相同。例如,一个可执行文件/usr/bin/passwd其所属用户是root(UID为0),此文件被设置了SUID权限。当个UID为500 GID为501的用户执行此命令时,产生的进程的RUID和RGID分别是500和501,而其EUID是0,EGID 是501。
尽管看上去有些烦琐,但是所有这些设计都是为了在一个多用户、多任务的操作系统中,所有用户的工作都能够安全可靠地进行,而这也是Linux操作系统的优秀性所在。
(1.3)进程的类型
可以将运行在Linux系统中的进程分为3种不同的类型。
Ø 交互进程:由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
Ø 批处理进程:不与特定的终端相关联,提交到等待队列中顺序执行的进程。
Ø 守护进程:在Linux启动时初始化,需要时运行于后台的进程。
以上3种进程有各自的特点、作用和使用场合。
(1.4)进程的启动方式
启动一个进程有两个主要途径:手工启动和调度启动。
(1)手工启动
由用户输入命令,直接启动一个进程便是手工启动进程。手工启动进程又可以分为前台启动和后台启动。
前台启动:手工启动一个进程的最常用方式。一般地,用户输入一个命令“ls -1”,这就已经启动了一个进程,而且是一个前台的进程。
后台启动:直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急需要结果的时候。假设用户要启动一个需 要长时间运行的格式化文本文件的进程,为了不使整个Shell 在耗时进程的运行过程中都处于“瘫痪"状态,从后台启动这个进程是明智的选择。
在后台启动一个进程,可以在命令行后使用&命令,例如:
#ls -R / >list&
(2)调度启动
这种启动方式是事先进行设置,根据用户要求让进程自选启动运行。