分类: LINUX
2012-12-02 22:14:39
进程是现代操作系统中的一个重要的概念,引入进程的目的就是让操作系统能有序的执行多个任务,并各个任务互不干扰,还能有效的配合完成更加复杂的任务。
那么,我们应该首先了解什么是linux的进程。构成进程包含的资源很多,但是构成进程的最重要的包含了
4个要素:
1. 首先进程需要有可执行的一段代码,一般进程有在用户太运行的一段代码,这也是进程需要完成的任务。有的内核态线程,有一段在内核态执行的代码。
2. 其次,内核要有自己的地址空间映射,这也是程序运行的基础,也是保证各个进程会不干扰的基础。
3. 然后,进程需要有一个内核堆栈,这是用户态进程陷入内核执行内核系统调用的必要资源。
4. 还有,进程在内核中必须有相应的进程管理数据结构,用于进程的调度和管理工作。
Linux中进程的内存模型为下图所示。之前了解过linux虚拟内存管理的话,应该对这张图并不陌生,这张图表示一个linux进程在虚拟地址空间中各个部分的分布。这个示意图,形象的展示了进程可执行代码分布,和自己地址空间的结构。
上文中提到了,进程必须拥有自己的内核堆栈,和进程管理数据结构。这两个要素如下图所示。内核为每个进程分配了一个4K的内核堆栈(也有可能是8K)。这个4K堆栈的高地址开始向下就是内核的栈空间,在4K的最小地址开始向上,有一个thread_info结构,该结构中task指针指向了task_struct机构,这个结构就是linux进程的管理数据结构。Task_struct结构体庞大,它记录了进程相关的很多数据和资源。
Thread_info数据结构是一个和CPU体系结构相关的数据结构,其中ARM体系结构对thread info结构体的定义为
struct thread_info |
除了上面说的进程的4个要素,实际上还有一个和进程相关的很重要的概念就是CPU现场!所谓CPU现场就是CPU发生中断,或者调度切换进程时CPU当时各个寄存器的状态。之所以说这个概念重要,是因为必须实现CPU现场的保存和恢复,才能完成进程的切换!对于ARM架构的内核来说,在内核态如果发生进程切换,被切换的进程将CPU现场保存在threa info结构的 struct cpu_context_save cpu_context变量中。而从用户态切换到内核态的时候,CPU现场保存在内核堆栈中。