Chinaunix首页 | 论坛 | 博客
  • 博客访问: 365722
  • 博文数量: 93
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 879
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-06 23:29
文章分类

全部博文(93)

文章存档

2014年(2)

2011年(1)

2010年(2)

2009年(6)

2008年(6)

2007年(13)

2006年(63)

我的朋友

分类:

2006-05-16 23:45:03

进程管理

第一、概念

·进程 进程是一个基本调度实体,是一个程序或名命令的运行实例。是程序执行的动态过程。比如分配系统资源就是以进程为单位,而不是整个程序为单位。

·程序加载到内存之后的存在分类

1、  正文 :就是可执行代码,可以共享。

2、  初始化的数据:程序中显示初始化的变量值。

3、  未初始化的数据:程序中未初始化的变量并且全部是0

4、  栈:主要保存由函数所调用的局部变量及传递的参数。

5、  用户区:内核未每个进程分配的专有数据区。包括UNIX内核使用的进程信息。

 

·线程 为了把并行粒子进一步减少而引入线程,成为系统调度的最小单位,理论上感觉跟进程很类型,特别是单线程的进程中。当然在多线程的进程中就可以体现这种差别了,线程分为内存地址空间、相关资源和控制流。而前2者在同一个进程内是共享的。这样可以减少进程反复调用而引起的系统开销过大。

 

·进程的父子关系

1、系统中某些进程在开机时诞生,直到关机才死亡,谓之系统进程。一般在系统中扮演着非常重要的作用。

2、所有进程都有且只有一个父进程。

3、一般而言,父进程死亡的时候其子、孙进程都会随之而“去”,但是用户可以命令子进程变成孤儿进程,这些孤儿进程会被原始进程(init进程,进程号为1)收留而成为父进程。

4echo $$ 可以显示当前进程。在命令前加上nohubp命令后就能指定这个进程在父进程死亡后可以继续运行。

5shell环境变量仅仅作用于当前的进程,当一个环境变量设置它对之后生成的子进程有效

6、在父进程中使用export命令设置shell环境变量,可以传递给子进程,但是子进程中export设置的环境变量不能影响到父进程。使用env命令可以查看从父进程继承下来的所有环境变量及内容。

·系统的进程体系

1swapper -> init ->/etc/inittab文件逐行创建相关进程

    |kprocs 5L之前)

   wait /reaper /xmgc /netm/gil /wlmsched/lvmbb/rtcmd/kbiod等(5L之后) 

 2、很重要的一点,在多用户状态,init 会为每个用户终端建立一个getty进程,由这个进程监视终端的情况,当用户成功登录之后,getty就会消亡,取代之的是Shell进程,而Shell进程就会接受用户输入,执行命令时就创建子进程。可见系统中所有应用程序都是init进程及其子进程产生。

3、系统内存中开拓1片空间,存放系统中所有进程信息,这就是进程表,和线程表。

 

 

 

 

4.3.3之前

4.3.3之后

 

每个单位占有空间数

总表占有内存空间数

允许最大值

每个单位占有空间数

总表占有内存空间数

允许最大值

进程

384 byte

49 152 kb

131 072

384 byte

65 536 kb

174 762

线程

256 byte

32 768 kb

131 072

256 byte

131 072 kb

524 288

 

·监视进程

1、  ps命令

# ps -l

  F S UID  PID  PPID   C  PRI   NI  ADDR SZ  WCHAN TTY TIME CMD

  240001 A   0 11900  4460    0  60 20  bc1   860           pts/0  0:00 ksh

  200001 A   0 13158  11900   1  60 20 abd5   864           pts/0  0:00 ksh

  200001 A   0 13452  13158   4  62 20  be1   624           pts/0  0:00 ps

F:系统使用 //S:状态//PID:进程号// PPID:父进程号 //C:最近消耗CPU情况//PRI:优先级,数值越高优先级越低//NI:用于计算优先级//ADDR:普通堆栈段号//SZ:核心镜像大小//WCHAN :进程等等地址,如果进程在运行,此值为空。//....

2、  显示指定终端上或用户的进程

a.  ps // 当前终端进程

b.  ps ttyName //指定终端的进程,注意ttyName可以用tty命令返回。

c.  ps u username//指定用户的进程

# tty

/dev/pts/0

# ps -t pts/0  

   PID    TTY  TIME CMD

 11900  pts/0  0:00 ksh

 13158  pts/0  0:00 ksh

 13460  pts/0  0:00 ps

# ps -u vinlin

 UID   PID    TTY  TIME CMD

   6    13734  pts/1  0:00 ksh

说明:之前一直不明白为何使用 pts/0 表示一个终端设备,看一下/dev下的文件就明白了,pts是一个目录,下面有012。。。等设备。

 

3、  前台和后台进程

需要交互运行的进程是前台进程,不依赖启动终端而运行的进程可以作为后台进程。在进程后加上&符合就可以然后进程在后台运行而不等待终端反应。如果指定需要等待输入的程序指定为后台运行,会出现一个很奇怪的现象,好像是被杀了。

# ksh&

[1]     14982

# ps

   PID    TTY  TIME CMD

 11900  pts/0  0:00 /bin/ksh

 13158  pts/0  0:00 ksh

 14204  pts/0  0:00 ksh

 14982  pts/0  0:00 ksh

 15222  pts/0  0:00 ps

[1] + Stopped (SIGTTIN)        ksh&

# ps

   PID    TTY  TIME CMD

 11900  pts/0  0:00 /bin/ksh

 13158  pts/0  0:00 ksh

 14204  pts/0  0:00 ksh

 14982  pts/0  0:00 ksh

 15224  pts/0  0:00 ps

看看第二次运行结果,ksh&不见了。原因不清楚。不知道如何解释。

 

4、  僵尸进程

子进程在父进程为调用wait()清除之前就死亡了,会继续占有进程表,有pid号这种就是僵尸进程,僵尸进程一般不会释放资源,出现这种情况往往是编程不良导致的。僵尸进程无法使用kill 9 来杀死,用户一般无法处理,只能在系统重启后自行清除。僵尸进程使用符合标记。

 

5、  Daemon进程

Daemon是一个永不停止的进程。它叫守候进程,控制系统资源的进程都是Daemon进程,例如init就是一个守候进程。由于守候进程跟用户无关,在ps显示时tty就是一些 ?? 号。

 

6、  显示线程信息

# ps -em

   PID    TTY  TIME CMD

     1      -  0:00 init   

 -       (线程信息)

  2206      -  0:10 dtgreet  

  -      

  2360      -  0:00 dtlogin   

 -      

  2750      -  0:00 dtfile   

 -      

  2888      -  0:01 X  

  -      

  3140      -  0:00 syncd

 

·进程的控制

1、  调整进程优先级

进程优先级通常由nice值确定,nice值的范围时039,前台进程默认时20,后台进程默认为24nice值越高优先级越低。并且系统会根据进程的行为来改变优先级。另外还有一个值PRIPriority),范围是0~127,值越大优先级越低。(???PRINI值不知道何种关系)

2、  改变进程优先级

# ps -l

     F S UID   PID  PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD

  200001 A   0 13158 11900   0  60 20 abd5   864           pts/0  0:00 ksh

# renice -4 13158

# ps -l

     F S UID   PID  PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD

  240001 A   0 11900  4460   0  60 20  bc1   860           pts/0  0:00 ksh

  200001 A   0 13158  11900   0 56 16 abd5   864           pts/0  0:00 ksh

 

上面的操作改变了13158这个进程的nice值。

PS:另外书中描述的nice命令很奇怪,不懂,练习也无法摸着头脑。

·杀死进程

1、  前台进程一般可以使用Ctrl+C来中止。而后台进程需要用kill命令。

2、  指定的pid3种特殊情况

apid>0 表示给该pid发信号

bpid0 表示把信号发给PGID相同的所有进程。

cpid 1,表示发送信号给与发送者有效用户相同的所有进程。

dpid<-1 而且pid<>-1,就发给PGID与所指定pid绝对值相等的所有进程。

3、可以使用 kill –l 列出系统支持的信号名。

4、另外有个killall命令可以杀掉所有进程,包括关键进程。

 

·AIX5.2/proc文件系统

(目前无法测试)

·AIX5L下的core文件

1、当进程异常中止时,系统会把这个进程的对应地址空间中的数据写到core文件中,这个过程被称为dump。在5L之前,所有core文件都是core,不会变动,新的core会覆盖旧的core5L之后改变了这种做法,使得他们不会被覆盖。

阅读(1278) | 评论(0) | 转发(0) |
0

上一篇:页面空间

下一篇:自动执行作业

给主人留下些什么吧!~~