进程与线程

Posted xiongxinxzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程与线程相关的知识,希望对你有一定的参考价值。

进程:进程的经典定义就是:一个执行中的程序的实例。系统中的每个程序都是运行在某个进程的上下文中的。上下文是由程序程序正确运行所需的状态组成的。这个状态包括存放在存储器中的程序的代码和数据他的栈通用的目的寄存器的内容程序计数器环境变量以及打开文件描述符的集合。(深入理解计算机系统 487)

线程:在进程中活动的对象,内核调度的对象是线程而不是进程。每个线程都拥有独立的 程序计数器,进程栈,和一组进程寄存器。

进程描述符和thread_info:

1.进程描述符(task_struct),是一个结构体,它包含了一个具体的进程的所有信息。在linux中每个线程都对应一个task_struct。(每个线程拥有唯一隶属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程,只是线程和其它线程共享某些资源,如地址空间【内核设计与实现28】).

2.以task_struct组成的双向链表的数据结构叫做任务队列。

3.thread_info:里面包含个系统通用的task_struct的指针和一些和不同体系的特殊信息。

4.进程内核栈:

 

技术图片

 

1.上图画的是一个进程内核栈,进程内核栈是一个进程独有的进程地址空间,但是当一个进程拥有多线程的时候又怎么组织呢? 答案是:每个线程都拥有自己独立的堆栈。

每个线程都拥有自己独立的 程序计数器   堆栈    线程寄存器组。

 每个线程都有自己的堆栈空间,但是线程堆栈的地址是按照进程地址空间统一编址的,所以每个线程堆栈地址空间是不会重复的,即:每个线程堆栈的地址空间不是从0开始编址,而是按整个进程地址空间统一编址的。

 2.这个内核栈被定义为一个联合体(union)

union thread_union
{
    struct thread_info thread_info;
    unsigned long stack[THREAD_SIZE/sizeof(long)];
};

3.上图中 内核栈从高地址像地地址方向增长,esp寄存器里面保存着栈顶指针,指向栈顶元素。

4.thread_info位于栈底,及整个栈的最低位置处。

5.当栈中元素一直增多,最终会到thread_info的位置,此时发生栈溢出。

6.thread_info中的一个指针指向task_struct而task_struct也有一个指针指向thread_info。

7.current指向栈的最低位置即thread_info的位置,可将esp中的指针将低13为置0得到。(x86).此时一个栈的大小由8KB即8192个字节。

 

以上是关于进程与线程的主要内容,如果未能解决你的问题,请参考以下文章

八.多进程与多线程

多线程编程

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

线程浅析

LINUX操作系统知识:进程与线程详解

Linux系统进程的知识总结,进程与线程之间的纠葛...