进程包含打开的文件,挂起的信号,内核内部数据,处理器状态,一个活多个具有内存映射的内存地址空间及一个或多个执行线程,存放全局变量的数据段。
进程是正在执行的程序代码的实时结果。
进程的列表存放在叫做任务队列的双向循环链表中,链表的每一项为task_struct,被称为进程描述符,包含一个具体进程的所有信息。
task_struct的state为进程的五种状态标志之一
TASK_RUNNING(运行):进程是可执行的,或正在执行的,或在运行队列中等待执行
TASK_INTERRUPTIBLE(可中断):进程被阻塞,接收到信号后被设置为运行
TASK_UNINTERRUPTIBLE(不可中断):域可中断相同,但接收到信号也不执行
__TASK_TRACED:被其他进程跟踪的进程,如通过ptrace对调试进程进行跟踪
__TASK_STOPPED(停止):进程没有投入运行也不能投入运行,通常发生在接收到SIGSTOP、SIGSTP、SIGTTIN、SIGTTOU等信号的时候
设置当前进程状态:set_current_state(TASK_INTERRUPTIBLE)
进程上下文?
进程家族树:所有进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程,该进程完成系统启动的整个过程。每个进程都有一个父进程,每个task_struct都包含一个指向其父进程task_struct,叫做parent的指针,还包含一个称为children的子进程链表
进程创建:fork()通过拷贝当前进程创建自进程,子进程与父进程的区别仅在于PID,PPID(父进程的PID),挂起的信号等
exec()(函数族)读取可执行文件(.elf)并将其载入地址空间运行
fork():
线程在内核中就像是一个普通的进程,只是县城和其他一些进程共享某些资源,如地址空间。传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类。
内核线程:独立运行在内核空间的标准进程,只在内核空间运行。
进程中介:do_exit()