进程:进程的经典定义就是:一个执行中的程序的实例。系统中的每个程序都是运行在某个进程的上下文中的。上下文是由程序程序正确运行所需的状态组成的。这个状态包括存放在存储器中的程序的代码和数据,他的栈、通用的目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。(深入理解计算机系统 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个字节。
原文:https://www.cnblogs.com/xiongxinxzy/p/13149511.html