进程是操作系统最基本抽象之一。一个进程就是处于执行器的程序(目标码粗放在某种介质上)。但进程不仅仅局限于一段可执行程序代码(Unix称之为text section),通常进程还包括其他资源,如打开的文件、挂起的信号、内核内部的数据、处理器状态、地址空间及一个和多个执行线程、当然还包括用来存放全局变量的数据段等,实际上,进程就是正在执行的程序代码的活标本。
1)进程描述符及任务结构
在很多介绍Linux进程描述的文章中,有些将内核的进程存放称之为task array,在阅读linux/sched.h头文件中代码可知,实际上进程存放是以链表的形式存放的,单个数据结构是一个task_struct的结构,因此叫做task list更准确一些。task_struct相对比较大,在32位机器上,大约1.7k。Linux通过slab分配器来分配task_struct,用这个来分配的好处是能达到对象复用和cache coloring(翻译成“缓存着色”太别扭了,也很难理解),实际上就是一个预分配的过程,这样可以减少动态创建和销毁带来的系列开销。
2)进程描述存放
内核通过唯一的进程标示值来存放和标示每个进程(PID)。PID默认的最大值为32768,是int类型,可以增加到类型允许的最大值,对于普通的桌面系统或者server来说默认最大值已经足够,对于大型服务器可能需要更多的进程数,只需要修改/proc/sys/kernel/pid_max来提高上限。
3)进程状态
TASK_RUNNING,进程正在执行,用户空间的唯一状态
TASK_INTERRUPTIBLE,被阻塞,等待恢复的状态。
TASK_UNINTERUPTIBLE ,除了不因为接收到信号而唤醒之外,和上面的一个相同
TASK_ZOMBIE 僵死。
TASK_STOPPED进程停止运行,没有运行,也不能投入运行。