目录
线程
从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的,如下图所示。
进程负责整个资源,我们在进程内部创建的线程,资源共享,即用户空间共享,但是每个线程拥有不同的PCB,每个PCB会保存一个内核栈,用于保存当线程被cpu切换时保存寄存器内容,即保护处理现场。
用户空间: 除了线程栈之外,其他的用户空间都是共享的。线程栈内保存线程运行时定义的局部变量等信息。
进程管理
PCB
进程控制块, 其结构大致如下图。我们的PCB中存在一个files struct, 对应就是一个int数组,数组的每个值都是一个文件描述符。当我们的程序fopen打开一个文件时,PCB会在当前files struct的数组结构中找一个最小且未被使用的描述符作为返回,并将其执行要打开的文件。
处理器管理级别
CPU有4个工作级别, 这里Linux就使用了0和3两个级别。3级对应用户态,0级对应内核态。处于3级的cpu只能访问0~3G的空间,也就是用户空间。当cpu处于0级,才有资格访问3G~4G这个内核空间。
从用户态到内核态怎么转换的呢?
就是调用系统调用。应用程序的printf底层调用sys_write。我们便从用户态3级变成了内核态0级。
用户空间
这里对系统分配给进程的虚拟空间0~3G空间的内容说明。
进程状态
时段1的时候cpu在执行a.out,当时段2的时候b.out程序要执行,这个时候cpu会保存处理器现场,也就是寄存器中的数据。当b.out执行完毕后,a.out又重新唤起执行,那么这个时候我们便需要恢复处理器现场。这个处理器现场是保存到当前pcb内核栈上。