深入了解Linux系统进程
1。什么是过程
该过程是执行期间的程序和它所包含的所有资源的通用名称,包括虚拟处理器、虚拟空间、寄存器、堆栈、全局数据段等。
在Linux,每个进程被分配一个数据结构时,它被创造,被称为一个进程控制块(简称进程控制块),PCB包含系统调度和过程本身是用了很多重要的信息。所有进程的PCB存储在内核空间,PCB最重要的信息是,内核进程PID,唯一标识一个进程通过pid.pid可以回收,和最大是32768,init进程的PID为1,和其他进程是init进程的后裔。
除了进程控制块(PCB),每个进程有一个独立的内核堆栈(8K),一个进程描述符的结构,这是存储在内核空间作为过程控制信息,而在进程用户空间的代码和数据的主要存储。
2创造。过程
这个过程是通过调用fork(),:::::Clone和VFORK()()系统调用创建一个新的过程。在内核中,他们都是调用fork函数do_fork.the传统直接拷贝父进程的所有资源给子进程,Linux的:叉()通过复制页面实现的,也就是说,父进程和子进程共享同一资源的副本。只有当数据发生变化时,数据才会被复制。
三者之间的差异如下:
:():父进程的所有数据结构将副本复制到子进程(写时复制页)。
::VFORK():只复制task_struct和内核堆栈,所以生成是父进程只有一个线程(没有独立的用户空间)。
::Clone():功能强大,有很多参数。::(克隆)允许您有选择地继承父母的资源,可以选择为::VFORK()作为父进程共享一个虚拟空间,从而创建线程,不能分享你的父进程,你甚至可以选择创建与父进程不再是父子关系,但兄弟之间的关系。
撤销3。过程
进程退出执行调用退出(),这将终止进程并释放所有资源。父进程可以查询是否是子进程的终止wait4()。在死亡状态,当进程退出,直到它的父进程调用wait()或waitpid(到目前为止)。当家长进程退出,内核指定线程组或init进程的其他进程的父进程的子进程新的。当一个进程接收到信号,无法处理或忽略,或当一个不可恢复的CPU异常是在内核态的产生,内核只是代表运行的过程中,和内核可使进程终止。
4。过程管理
在一个双向循环链表存储过程的信息称为内核的任务列表(内核空间),列表中的每个项目都是task_struct,即进程描述符。它包含一个特定进程的所有信息,包括打开文件、进程地址空间、挂起的信号、进程状态等。
通过板经销商task_struct Linux,所以实现对象的复用和缓存着色(预配置和task_struct,反复使用可避免资源的消耗引起的动态分配和释放)。
核心组织中的所有进程task_running状态到运行双向循环队列。通过扫描整个运行队列,调度功能得到最可执行的流程执行,避免扫描所有进程和提高调度效率。
5的内核堆栈。过程
Linux为8kb大小的内存区域的每个过程中存储过程的两个不同的数据结构:该thread_info进程的内核栈。
当进程在内核中,堆栈是不同的从用户态栈,用于内核控制路径栈很少,所以对8KB够栈描述符。