进程
从内核观点来看,进程目的就是担当分配系统资源(CPU,内存等)的实体.
当一个进程创建的时候,它几乎与父进程相同.它接收父进程地址空间一个逻辑拷贝,并从进程创建系统调用的下一条指令开始执行与父进程相同的代码.
父子进程可以共享含有程序代码的页,但他们各自有独立的数据拷贝(栈和堆)
因此子进程对一个内存单元的修改对父进程是不可见的,反之亦然.
进程描述符
描述进程,例如内核必须知道进程的优先级,分配的地址空间,允许他访问那个文件等等.
这正是进程名描述符的作用.
标识一个进程
通常用32位进程描述符地址标识进程.进程描述符指针指向这些地址,内核对进程的大部分引用是通过进程描述符指针进行的.
类Unix操作系统允许用户使用一个叫进程标识符的process ID的数来标识进程.
同一组的线程有共同的PID,把指定PID的信号发送给组中的所有线程.
一个线程组中所有线程使用和该线程组的领头线程相同的PID,也就是该组中第一个轻量级进程的PID
进程描述符处理
进程动态实体,因此内核必须能够同时处理很多进程,并且把进程描述符存放在动态内存当中,而不是放在永久分配在内核的内存区.
对于每个进程来说,linux都把两个不同的数据结构紧凑地存放在一个单独为进程分配的存储区域内:一个是内核态的进程堆栈,另一个是紧凑进程描述符的小数据结构,叫做线程描述符.
内核态的进程访问处于内核数据段的栈,这个栈不同于用户态的进程所用栈.
esp寄存器是CPU栈指针,用来存放栈顶单元的地址.栈起始于末端,朝着内存区开始的方向增长(自上向下).当用户态切换到内核态的时候,进程的内核栈总是空的.esp寄存器指向这个栈的顶端.