码迷,mamicode.com
首页 > 系统相关 > 详细

第十二章 进程管理

时间:2015-09-26 14:30:38      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

一、进程

1、进程概述

        一个程序是一个可执行文件,而进程是程序执行的动态过程。进程是为运行着的程序提供执行环境的实体,它包括一个地址空间和一个控制点。

        当执行一个程序的时候,系统加载程序会把此程序加载到内存中,它在内存中由5部分组成:正文、初始化数据、未初始化数据、栈、用户区

        进程通常由三大部分组成:代码、数据、进程控制块(PCB)。代码部分描述了进程所要完成的功能;数据部分包括程序在执行的时候所需要的数据和工作区。进程的代码部分和数据部分是进程存在的物质基础。进程控制块(PCB)包括了进程的描述信息和控制信息,是进程的动态性的集中反映,系统为每一进程设置了一个进程控制块。进程控制块是进程存在的唯一标识。

        在Unix系统中,进程控制块包括了两大部分:其一是进程基本控制块,成为proc结构,另一部分是进程扩充控制块,称为user结构。这两部分内容就可以完整的描述一个进程实体。在proc结构中存放的是系统确定的一个进程存在所必需的信息,而user结构中所存放的是进程在运行时才需要用到的各种信息。可以说,所有的进程的proc结构都相同,所有进程的user结构因进程不同而不同。进程的proc结构常驻内存,不管进程是否正在处理机上运行,系统核心都要查询和确定任一进程的proc结构,进程的user结构不常住内存,当进场不在处理机上运行的时候,系统核心不会对这一部分的信息进行查询和处理,所以当进程不是处于运行状态的时候,就将user结构写到外存交换设备上。

        派生进程的进程成为父进程,被派生的进程成为子进程,一个进程只有一个父进程,一个进程可以有多个子进程。

2、进程调度状态

1)运行状态:

2)就绪状态:

3)阻塞状态:

        一个系统中处于运行状态的进程数一定少于等于可用处理机的个数,因为一个处理机在某一时刻只能执行一个进程的代码。

        当某一个进程由于某种原因从运行态转变为阻塞态或它占用处理机的时间片用完的时候,进程调度就从就绪队列中选取一个优先级最高的进程,让它占有处理机并运行。进程的状态转变由进程调度程序完成。

下图为:进程的基本调度状态及转换

技术分享

        另外,在AIX系统中,进程调度状态也分为6种:不存在状态(Noexistent)、运行状态(Active)、已交换状态 (Swapped)、空闲状态(Idle)、取消状态(Cancelled)和停止状态(Stopped)

3、进程特征

1)并发性;几个进程同时存在于系统中

2)动态性:进程有生命周期,动态的产生和消亡

3)独立性;指的是进程出现以前,进程作为一个能独立运行的单元,是系统进行资源分配和调度的基本单位

4、父进程和子进程

        系统中的某些进程是在系统开机时诞生,直到系统关机的时候才消亡,这种进程一般称为系统进程。

        任意一个进程都必定有一个父进程,父进程死亡,子进程必然随之死亡,但是用户可以人为设定干预,使失去了父进程的子进程被系统最原始进程(init进程,进程号是1)收养,认作它的“子进程”——人为干预方法是在命令前加入nohup命令,那么子进程在父进程死亡后可以被init进程接管,进而继续存在。

        Shell环境变量只对当前的进程有效,当一个环境变量设置后,对它以后产生的所有子进程都有效。

5、系统的进程体系

        在AIX系统引导时就会自动创建一个swapper进程,它的进程号是0,是所有进程的始祖,时系统进程的调度进程,然后由0号进程创建一个init进程,它的进程号是1,init进程在系统启动时读取文件/etc/inittab中的内容,然后根据每一行内容分别创建有关的进程以完成相应的系统启动工作。swapper进程除了创建init进程外,还创建了与系统核心有关的进程。在AIX 5L系统中,系统的核心进程名能够标识出进程的用途,主要的核心进程有:wait、reaper、xmgc、netm、gil、wlmsched、lvmbb、rtcmd和kbiod

        系统中的大部分进程都是由init进程或init进程的子进程创建,如此逐代繁衍,当某个进程丢掉父进程,而系统有设定了nohup参数,那么它会直接由init进程接管。

        一旦系统系统并进入多用户状态,init进程会为每个用户终端产生一个getty进程,由getty进程监听终端情况,以便用户登录到系统。用户登陆成功后,getty进程消亡,取而代之的则是用户的shell进程。

在系统中开辟一大片空间用于存放系统中所有的进程信息,这就是进程表,同样也有一大片区域存放线程信息,称之为线程表,当先线程表一定比进程表大很多。

6、前台进程和后台进程

        前台进程在运行的时候占据一个终端并可以由用户干涉它的运行,如果进程在运行时,用户还能运行其他命令而不影响它的运行,就称之为后台进程。服务类的进程一般都是在后台运行。如果一个进程在运行的时候不需要键盘输入,而且在输入的命令后加入一恶搞“&”符号,那么他就成为一个后台进程。

7、僵尸进程

        进程死亡后,如果它的尸体还没有被撤销,在进程表中还保留着它的记录(也就说它仍有进程号),把这种已经死亡,尸体却保留在进程表中的进程就成为僵尸进程。

        进程表中的尸体就是僵尸进程所耗费的资源,子进程不会释放它所占用的资源,子进程会一直保持它的尸体在进程表中,直到其父进程死亡或者系统重新启动。

        僵尸进程和孤儿进程不同,僵尸进程是已经死亡的进程,不再运行了,但是它还是占用系统资源,因此僵尸进程是对系统资源的浪费,孤儿进程是是去了亲生父进程的进程,被init进程收养,它任然在运行,因此孤儿进程并未浪费系统资源。只有僵尸进程会影响系统效率。

8、Daemon进程

        Daemon进程是一个永不停止的进程,它经常处于后台运行并且大多数时间处于空闲状态,Daemon进程一般在系统引导的时候启动或是运行,直到系统关闭的时候才停止。

        控制系统资源的进程都是Daemon进程,Daemon进程与终端和用户都没有关系,因此用PS命令的时候,会显示一个?号。

        以下为AIX系统中的一些Daemon进程:

init:PID为1,系统启动后创建的第一个进程,它是所有非系统进程的祖先

kproc:系统的核心进程

corn:自动调度作业运行

qdaemon:控制作业时间队列进程

srcmstr:系统资源控制器进程

inetd:网络端口监视器进程

sendmail:电子邮件管理进程

errdaemon:错误日志进程

syslogd:系统日志记录进程

dtlogin:CDE服务器进程

二、线程

        在Unix系统中采用进程机制的目的在于提高系统效率和系统资源利用率。在多任务系统中,以进程为单位在处理机上并发执行,进程不仅作为系统调度的基本单位,同时也是系统资源分配的基本单位。进程在整个生存周期内,不断的改变运行环境,不断地变换状态,在进程切换的时候,由于既要保存当前进程的运行环境,又要设置所选中的进程的运行环境,为此要花费不少处理机的时间

        因此,在引入线程的操作系统中,线程是系统调度的基本单位,但不是独立分配资源的基本单位 ,所以不对拥有资源的基本单位实施频繁的切换。线程是进程内的一个可调度的实体,是进程内的一个执行单位。处理机调度的基本单位不再是进城了,而是线程。

        进程和线程的关系归纳如下:

1)线程是进程的一个组成部分,每一个进程在创建的时候通常只有一个线程,需要时这个线程可以创建多个线程

2)进程的多线程都在进程的地址空间内活动,线程的活动范围始终限于进程的内部。

3)资源仍是以进程为单位分配的,而不是以县城为单位分配的,线程在执行时需要资源的时候,系统会从进程的资源配额中扣除并分配给他们。

4)处理机调度的基本单位是线程,线程之间会竞争处理机,真正在处理机上运行的是线程,同样各个线程之间也是有优先级的。AIX系统支持SMP(对称多处理)的运行模式,它能够在系统中的各个CPU之间合理的负载平衡。

三、进程控制

        进程的产生方式有两种,一种是用户执行命令而产生的,另一种是由fork进程产生的。用户知要执行某个命令,首先这个命令(或脚本)要有执行权限——通过#chmod +x [name]给脚本增加执行权限

1、nohup

        Shell提供了一个操作符&,可以使用户在后台运行程序。在命令前加入nohup命令。则当用户退出系统(注意,是用户退出系统,不是系统shutdown),由Shell产生的所有进程都会收到终止信号01和03,而nohup命令实际就是告诉Shell产生的后台进程忽略这个两个信号,可以让它继续执行。

        当后台使用管道符号(|),并需要nohup功能的时候,则需要对管道符前后的两个命令各自使用nohup参数渲染。

#nohup ls -R | nohup grep dt >/tmp/lsdt.out&

        由于nohup命令启动的后台进程不能向终端显示它的输出结果,如果用户没有重定向它的输出结构,nohup命令就会把该后台进程的输出结果重定向到nohup.out文件中。如果在同一个目录中由nohup命令启动了多个后台进程,而且没有重定向其输出结果,那么nohup.out文件就将会被不断的改写,进而导致一些输出丢失。

        由于所有的进程都需要有一个与它相关的父进程,当用户退出系统后,nohup过的进程就会由init进程接管。

2、进程优先级

        nice的值越高,优先级就越低,nice值的范围从0到39,nice的值为39的时候,优先级最低。前台nice默认值是20。后台进程默认值是24,子进程会继承父进程的nice值。

        用户可以通过改变进程的nice值来改变进程的优先级。改变进程优先级的命令如下:

#nice [ -n Increment ] Command [ Argument... ]

其中Increment的值取正取负均可,只有root用户可以去负,负值是提高优先级,正值是减少优先级,如果不加-n Increment参数。默认是增加10点nice值(即降低优先级)。

        nice命令只能在启动进程的时候确定进程的nice值,不能在进程运行的时候修改进程的nice值,而renice

命令可以实现这个功能。

#renice [ -n Increment ] [ -g | -p | -u ] ID...

其中-g参数作用是改变一个进程组中的所有进程的优先级,ID表示为进程组的号;使用-p参数改变指定进程的优先级,ID表示为进程号;(-p参数是默认的);-u参数改变属于某个用户的所有进程的优先级,ID可以是用户名,也可以是用户ID。其中ID可以同样指定多个,他们之间用空格隔开。

        如果renice返回码是0,表示修改nice成功,否则,则出错。

3、kill进程

#kill [ -s { SignalName | SingalNumber } ] ProcessID...

        其中ProcessID就是接收信号的进程ID,而SignalName是信号名(字符串形式),SignalNumber是信号的代号(正整数形式)。Kill命令如果不指定SignalName和SignalNumber,默认就是发送终止信号(SignalNumber=15)

        SignalNumber=0,kill命令就检查所指定的ProcessID是否有效;

        SignalNumber=9,杀死进程信号(SIGKILL);

        SignalNumber=15,终止进程信号(SIGTERM)。15信号强度没有9厉害,15杀不掉的9杀得掉。

        ProcessID>0,表示将信号发送给指定ProcessID的进程;

        ProcessID=0,表示将信号发送给与发送者PGID相同的所有进程;

        ProcessID=-1,发送信号给与发送者有效用户相同的所有进程;

        ProcessID<1&ProcessID<>1,表示将信号发送给“PGID和ProcessID绝对值相等”的所有进程

四、AIX 5L中的core文件

        当进程在异常终止运行的时候,系统会把该进程对应的地址空间中的数据写到core文件中,整个过程成为dump。AIX4.3.3中所有的core文件的文件名都是core,AIX5L以后,改变了core的命令,从而使得每个core拥有唯一的名字,防止了被覆盖的可能。

        AIX5L设置了CORE_NAMING环境变量以后,新的core文件名格式就是core.pid.ddhhmmss这样一个格式。

(注意,CORE_NAMING环境变量预定的值是yes,因此不管给该变量赋予和值,甚至是给他赋予个no值,都没关系,系统都会启动新的core命名方法)

        每一个core dump都会产生一个新的错误日志,查看这样的错误日志记录可以帮助程序员识别导致core dump的应用程序。

        AIX5L增强了core文件的自动收集过程,snapcore命令的作用就是手机一个core文件、程序呃有程序使用的库,然后把这些数据压缩到一个pax文件中

第十二章 进程管理

标签:

原文地址:http://www.cnblogs.com/lqdflying/p/4840648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!