进程是什么?
如果有人问你,进程是什么,你该如何回答呢?
正在执行的程序;程序的执行实例;能分配处理器并由处理器执行的实体。
进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。
那么进程和程序的区别是什么呢?
1、进程在内存上,程序在硬盘上
2、进程比程序多了很多描述信息,其中最重要的是PCB
3、进程是动态的,进程状态可以改变;程序是静态的,处于存储状态
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中。
那么接下来我们就来认识一下task_struct结构体的成员吧:
1、进程状态:
volatile long state;
int exit_state;
state成员的可能取值如下:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
TASK_RUNNING //表示进程要么正在执行,要么正要准备执行。
TASK_INTERRUPTIBLE //表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。
TASK_UNINTERRUPTIBLE //与TASK_INTERRUPTIBLE类似,除了不能通过接受一个信号来唤醒以外。
__TASK_STOPPED //表示进程被停止执行。
__TASK_TRACED //表示进程被debugger等进程监视。
EXIT_ZOMBIE //表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息。
EXIT_DEAD //表示进程的最终状态。
2、进程标识符(PID)
pid_t pid;
pid_t tgid;
Unix系统通过pid来标识进程,linux把不同的pid与系统中每个进程或轻量级线程关联,而unix程序员希望同一组线程具有共同的pid,遵照这个标准linux引入线程组的概念。一个线程组所有线程与领头线程具有相同的pid,存入tgid字段,getpid()返回当前进程的tgid值而不是pid的值。
3、进程内核栈
void *stack;
进程通过alloc_thread_info函数分配它的内核栈,通过free_thread_info函数释放所分配的内核栈。
4、进程标记
unsigned int flags; /* per process flags, defined below */
反应进程状态的信息,但不是运行状态,用于内核识别进程当前的状态,以备下一步操作
5、进程调度
int prio, static_prio, normal_prio;
unsigned int rt_priority;
static_prio :用于保存静态优先级,可以通过nice系统调用来进行修改
rt_priority: 用于保存实时优先级
normal_prio :的值取决于静态优先级和调度策略
prio: 用于保存动态优先级
6、信号处理
/* signal handlers */
struct signal_struct *signal;
struct sighand_struct *sighand;
1583
sigset_t blocked, real_blocked;
sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
struct sigpending pending;
1587
unsigned long sas_ss_sp;
size_t sas_ss_size;
signal //指向进程的信号描述符
sighand //指向进程的信号处理程序描述符
blocked //表示被阻塞信号的掩码,real_blocked表示临时掩码
pending //存放私有挂起信号的数据结构
sas_ss_sp //是信号处理程序备用堆栈的地址,sas_ss_size表示堆栈的大小
tast_struct结构体 翻译:
long state //任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)。
long counter// 任务运行时间计数(递减)(滴答数),运行时间片。
long priority //运行优先数。任务开始运行时counter = priority,越大运行越长。
long signal //信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。
struct sigaction sigaction[32]// 信号执行属性结构,对应信号将要执行的操作和标志信息。
long blocked //进程信号屏蔽码(对应信号位图)。
int exit_code //任务执行停止的退出码,其父进程会取。
unsigned long start_code //代码段地址。
unsigned long end_code //代码长度(字节数)。
unsigned long end_data //代码长度 + 数据长度(字节数)。
unsigned long brk //总长度(字节数)。
unsigned long start_stack //堆栈段地址。
long pid //进程标识号(进程号)。
long father //父进程号。
long pgrp// 父进程组号。
long session //会话号。
long leader //会话首领。
unsigned short uid //用户标识号(用户id)。
unsigned short euid //有效用户id。
unsigned short suid// 保存的用户id。
unsigned short gid //组标识号(组id)。
unsigned short egid //有效组id。
unsigned short sgid //保存的组id。
long alarm //报警定时值(滴答数)。
long utime //用户态运行时间(滴答数)。
long stime //系统态运行时间(滴答数)。
long cutime //子进程用户态运行时间。
long cstime// 子进程系统态运行时间。
long start_time //进程开始运行时刻。
unsigned short used_math //标志:是否使用了协处理器。
int tty //进程使用tty 的子设备号。-1 表示没有使用。
unsigned short umask //文件创建属性屏蔽位。
struct m_inode * pwd //当前工作目录i 节点结构。
struct m_inode * root //根目录i 节点结构。
struct m_inode * executable //执行文件i 节点结构。
unsigned long close_on_exec //执行时关闭文件句柄位图标志。(参见include/fcntl.h)
struct file * filp[NR_OPEN] //进程使用的文件表结构。
struct desc_struct ldt[3] //本任务的局部表描述符。0-空,1-代码段cs,2-数据和堆栈段ds&ss。
struct tss_struct tss //本进程的任务状态段信息结构
本文参考文章:
http://blog.csdn.net/gatieme/article/details/51383272
http://www.educity.cn/linux/518072.html