分类:
2006-05-16 23:45:03
第一、概念
·进程 进程是一个基本调度实体,是一个程序或名命令的运行实例。是程序执行的动态过程。比如分配系统资源就是以进程为单位,而不是整个程序为单位。
·程序加载到内存之后的存在分类
1、 正文 :就是可执行代码,可以共享。
2、 初始化的数据:程序中显示初始化的变量值。
3、 未初始化的数据:程序中未初始化的变量并且全部是0。
4、 栈:主要保存由函数所调用的局部变量及传递的参数。
5、 用户区:内核未每个进程分配的专有数据区。包括UNIX内核使用的进程信息。
·线程 为了把并行粒子进一步减少而引入线程,成为系统调度的最小单位,理论上感觉跟进程很类型,特别是单线程的进程中。当然在多线程的进程中就可以体现这种差别了,线程分为内存地址空间、相关资源和控制流。而前2者在同一个进程内是共享的。这样可以减少进程反复调用而引起的系统开销过大。
·进程的父子关系
1、系统中某些进程在开机时诞生,直到关机才死亡,谓之系统进程。一般在系统中扮演着非常重要的作用。
2、所有进程都有且只有一个父进程。
3、一般而言,父进程死亡的时候其子、孙进程都会随之而“去”,但是用户可以命令子进程变成孤儿进程,这些孤儿进程会被原始进程(init进程,进程号为1)收留而成为父进程。
4、echo $$ 可以显示当前进程。在命令前加上nohubp命令后就能指定这个进程在父进程死亡后可以继续运行。
5、shell环境变量仅仅作用于当前的进程,当一个环境变量设置它对之后生成的子进程有效。
6、在父进程中使用export命令设置shell环境变量,可以传递给子进程,但是子进程中export设置的环境变量不能影响到父进程。使用env命令可以查看从父进程继承下来的所有环境变量及内容。
·系统的进程体系
1、swapper -> 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是一个目录,下面有0,1,2。。。等设备。
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值的范围时0~39,前台进程默认时20,后台进程默认为24,nice值越高优先级越低。并且系统会根据进程的行为来改变优先级。另外还有一个值PRI(Priority),范围是0~127,值越大优先级越低。(???PRI以NI值不知道何种关系)
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、 指定的pid有3种特殊情况
a.pid>0 表示给该pid发信号
b.pid=0 表示把信号发给PGID相同的所有进程。
c.pid= -1,表示发送信号给与发送者有效用户相同的所有进程。
d.pid<-1 而且pid<>-1,就发给PGID与所指定pid绝对值相等的所有进程。
3、可以使用 kill –l 列出系统支持的信号名。
4、另外有个killall命令可以杀掉所有进程,包括关键进程。
·AIX5.2的/proc文件系统
(目前无法测试)
·AIX5L下的core文件
1、当进程异常中止时,系统会把这个进程的对应地址空间中的数据写到core文件中,这个过程被称为dump。在5L之前,所有core文件都是core,不会变动,新的core会覆盖旧的core,5L之后改变了这种做法,使得他们不会被覆盖。