Linux Kernel Notes
Linux Kernel Notes
进程管理
进程
进程不仅仅局限于一段可执行的程序代码,还包含其他资源,如挂起的信号,内核的数据,处理器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,存放全局变量的数据段等。
进程就是正在执行的程序的代码的实时结果。
线程是指进程中活动的对象,每个线程都有一个独立的程序计数器、进程栈还有一组进程寄存器。
内核调度的对象是线程,而在传统Unix系统中,一个进程仅仅包含一个线程,对于Linux而言,线程只是一种特殊的进程。
进程在创建时变开始存活,这是调用fork()函数的结果,该函数通过复制一个现有进程来创建新的进程。调用fork()函数的进程被称为 父进程,而新产生的进程则为 子进程。 folk()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。
[!NOTE]
在现代Linux中,folk()其实是clone调用实现的。
在一般情况下,创建新的进程都是为了立即执行新的、不同的程序,而接着调用exec()来创建新的地址空间,将新的程序载入其中。最后程序再通过exit()退出执行,exit()会终结进程并且释放占用的资源,父进程可以通过**wait4()查询子进程是否终结。这使得进程拥有了等待特定进程执行完毕的能力,进程退出执行后被设置为僵死状态,直到它的父进程调用wait()或waitpid()**为止。
[!NOTE]
wait()、waitpid()、wait4()这些函数虽然有细微的语意差别,但是所有函数都返回关于终止进程的状态。
进程描述符及任务结构
Linux内核将进程的列表存放在 TaskList中,它是一个双向循环链表。链表的每一项类型都为 task_struct、称为进程描述符的结构,且被定义于 **<linux/sched.h>**文件中。
Linux Kernel Notes
http://blog.claret.space/2024/03/19/LinuxKernel/