多进程图像
- Process Control Block:用来记录进程信息的数据结构
- 进程状态有运行状态、就绪状态、等待状态、终止状态和新建状态。
多进程如何交替
- 新开一个进程时,会进行系统调度运行schedule()函数
- schedule()函数内部核心步骤是先获取下一个就绪的进程pcb信息
- 然后在现有的进程基础上切换到新的进程。
切换的核心过程,首先将当前进程的信息保存到对应的PCB结构体中,然后将新的进程PCB信息拷贝到CPU对应寄存器中,运行该进程。
多个进程同时在一块内存上运行时
- 各个进程编程时内存使用虚拟内存
- 然后根据系统的一张内存映射表将所有进程的虚拟内存一一对应实际内存,避免进程之间访问内存相互干扰。
进程的本质
- 进程 = 资源(内存映射表) + 指令执行序列
- 线程切换本质是多个指令执行序列之间的切换,使用同一个资源
用户级线程切换
- 切换的核心是将当前线程和即将切换的线程的栈切换
- 线程创建的核心是创建TCB结构体,申请栈,将申请的人栈与TCB绑定
用户级线程与内核级线程
- 由于内核中某些操作会堵塞的原因(例如磁盘io访问),导致大部分情况下内核级线程比用户级线程更有效率
- 用户级线程切换是用户主动切换的,内核级线程是系统内核按系统运行情况自己切换的,在用户角度看,是被动的。
- 用户级线程切换时是2个栈之间信息切换,内核级线程切换时是2套栈之间切换。套栈的理解可以为内核中的一个栈和用户中的一个栈相互关联起来。
内核栈的内容分布
- 依次为 源SS,源SP,EFLAGS,源PC,源CS,内核接口,,,
- 返回时借助iret指令出栈执行指令
内核线程switch_to的五段论
进入内核线程之是要先进入中断的
- 1、中断入口:(进入切换)-- call 中断处理
- 2、中断处理:(引发切换)-- 执行schedule调度函数
- 3、schedule:(调用switch_to) – 开始内核栈切换
- 4、switch_to:(内核栈切换)-- 将新的栈中esp结构体信息更新到物理寄存器esp上。
- 5、iret:中断出口(第二级切换) – 内核栈关联上的用户栈切换
- 6、如果切换的指令序列不在统一进程,还需要地址切换(映射表切换)。
内核级线程怎样创建
1、向内存申请一段空间用来填充所申请线程的TCB信息
2、向内存申请一段空间用来填充内核栈
3、内核栈中记录用户栈的信息和进入内核栈之前的pc指针地址
4、将这些信息填充到tcb结构体中