(1)PCB
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。grep -r “task_struct” / 可以查找根目录下,包含task_struct的文件文件。或者 find /usr -name sched.h。从而,在/usr/include/linux/sched.h文件中可以查看struct task_struct 结构体定义。其内部成员有很多,我们重点掌握以下部分即可:
(1)进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个
非负整数。
(2)进程的状态,有就绪、运行、挂起、停止等状态。
(3)进程切换时需要保存和恢复的一些CPU寄存器的值。
(4)描述虚拟地址空间的信息(如虚拟地址与物理地址之间的映射关系)。
(5)描述控制终端的信息(桌面终端、文字终端和设备终端,pts/0或者tty0等)。
(6)当前工作目录(当前进程的工作目录)。
(7)umask掩码(对文件的一种保护机制,文件权限)。
(8)文件描述符表,包含很多指向file结构体的指针。
(9)和信号相关的信息。
(10)用户id和组id。
(11)会话(Session)和进程组(功能相似的一些进程组成一个进程组)。
(12)进程可以使用的资源上限(Resource Limit)。(ulimit –a命令可以查看)
(2)ulimit命令详解
ulimit -a命令用来显示各种进程能够使用的资源上限(
显示并控制shell启动的程序或进程所能够使用的资源上限,ulimit为shell内建命令),Linux对于每个用户,系统限制其最大进程数,为提高性能,可以根据设备资源情况,设置个Linux用户的最大进程数,
一些参数需要设置为无限制,如:数据段长度:ulimit -d unlimited 最大内存大小:ulimit -m unlimited 堆栈大小:ulimit -s unlimited
在用这个命令的时候主要是为了产生
core文件,就是程序运行发行段错误时的文件:
ulimit -c unlimited 从而产生core文件。
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14473
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14473
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
如果需要修改open files (-n) 1024的值,命令就是limit -n 2048(随各自需要设置),其余类似。
参数解释:
-a 显示目前资源限制的设定。
-c
设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <堆叠大小> 指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
(3)进程状态
进程基本的状态有5种。分别为初始态(创建),就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。