一、进程的概念
进程就是处于执行期的程序以及保证程序正常运行所需要的系统资源,这些资源包括(打开的文件,内存地址空间,存放全局变量的数据段以及进程包含的线程等)
二、进程的存在(进程描述符)
内核把进程存放在叫做任务队列(task list)的双向链表中,每一项都是数据类型为 task_struct的进程描述符,在进程描述符里包含一个具体进程的所有信息。linux通过slab分配器分配 task_struct 结构,目的是对象复用和缓存着色。由于使用slab来分配,所以只需要在内存的高地址(上方)处创建新的结构struct thread_info,该结构体里有一个指针指向 tsak_struct。进程描述符中存放一个唯一的进程标识符或者PID,如init进程的PID为1。
三、进程家族树
每一个进程在task_struct中都有parent指针指向父进程,children为子进程链表。
四、进程创建
Unix产生新的进程分为两个阶段,第一个阶段使用fork()函数拷贝当前进程,由此产生了父进程和子进程。父进程和子进程仅在PID和PPID(父进程的PID)和某些不必要继承的资源和统计量(比如挂起的信号)。linux同时采用写时拷贝技术,在有写入需求之前,父子进程共享一个进程拷贝,这样可以避免创建子进程时效率低下的资源复制过程。
五、线程创建
在linux中,线程就是可以与其他线程共享一些资源的进程。它的数据结构(task_struct)以及调度算法都是和进程一样的。其他系统中,相对于重量级的进程,线程抽象为一种耗费资源少,运行速度快的进程(轻量级进程)。但是linux中的进程本身已经很轻量了。线程的创建时候调用clone时,需要指定共享资源的参数(CLONE_FILE 文件等)
六、进程终结
进程终结是主动或者被动调用exit()的结果。进程在调用了do_exit()后,进入僵化状态,但是系统还保留该进程的进程描述符,以便父进能获取它的进程信息。在进程终结的时候,有可能会产生孤儿进程。孤儿进程就是爹没了的进程,也就是父进程先于子进程被终结。出现了孤儿进程,就要找养父,找到领头进程或者init进程当新爹。