数据结构论坛

首页 » 分类 » 定义 » Liunx进程和线程的实现
TUhjnbcbe - 2025/6/10 18:09:00
哪家白癜风医院便宜 http://www.xftobacco.com/

在Linux内核结构中,进程会被表示为任务,通过结构体structure来创建。不像其他的操作系统会区分进程、轻量级进程和线程,Linux统一使用任务结构来代表执行上下文。因此,对于每个单线程进程来说,单线程进程将用一个任务结构表示,对于多线程进程来说,将为每一个用户级线程分配一个任务结构。Linux内核是多线程的,并且内核级线程不与任何用户级线程相关联。

对于每个进程来说,在内存中都会有一个

task_struct

进程描述符与之对应。进程描述符包含了内核管理进程所有有用的信息,包括「调度参数、打开文件描述符等等」。进程描述符从进程创建开始就一直存在于内核堆栈中。

Linux和Unix一样,都是通过

PID

来区分不同的进程,内核会将所有进程的任务结构组成为一个双向链表。PID能够直接被映射称为进程的任务结构所在的地址,从而不需要遍历双向链表直接访问。

我们上面提到了进程描述符,这是一个非常重要的概念,我们上面还提到了进程描述符是位于内存中的,这里我们省略了一句话,那就是进程描述符是存在用户的任务结构中,当进程位于内存并开始运行时,进程描述符才会被调入内存。

进程位于内存被称为PIM(ProcessInMemory),这是冯诺伊曼体系架构的一种体现,加载到内存中并执行的程序称为进程。简单来说,一个进程就是正在执行的程序。

进程描述符可以归为下面这几类

调度参数(schedulingparameters):进程优先级、最近消耗CPU的时间、最近睡眠时间一起决定了下一个需要运行的进程内存映像(memoryimage):我们上面说到,进程映像是执行程序时所需要的可执行文件,它由数据和代码组成。信号(signals):显示哪些信号被捕获、哪些信号被执行寄存器:当发生内核陷入(trap)时,寄存器的内容会被保存下来。系统调用状态(systemcallstate):当前系统调用的信息,包括参数和结果文件描述符表(filedescriptortable):有关文件描述符的系统被调用时,文件描述符作为索引在文件描述符表中定位相关文件的i-node数据结构统计数据(accounting):记录用户、进程占用系统CPU时间表的指针,一些操作系统还保存进程最多占用的CPU时间、进程拥有的最大堆栈空间、进程可以消耗的页面数等。内核堆栈(kernelstack):进程的内核部分可以使用的固定堆栈其他:当前进程状态、事件等待时间、距离警报的超时时间、PID、父进程的PID以及用户标识符等有了上面这些信息,现在就很容易描述在Linux中是如何创建这些进程的了,创建新流程实际上非常简单。「为子进程开辟一块新的用户空间的进程描述符,然后从父进程复制大量的内容。为这个子进程分配一个PID,设置其内存映射,赋予它访问父进程文件的权限,注册并启动」。

当执行fork系统调用时,调用进程会陷入内核并创建一些和任务相关的数据结构,比如

内核堆栈(kernelstack)和thread_info结构。

关于thread_info结构可以参考

1
查看完整版本: Liunx进程和线程的实现