用户态、内核态指内存空间,CPU的各寄存器则是CPU硬件,不属于内存部分,仅在需要存档备份数据时保存至(用户态/内核态)内存
1、 进程内核栈
每个进程都有自己独立的位于内核空间的内核栈,保存进程在内核态执行的函数调用栈、局部变量、寄存器状态等数据
linux系统切换进程时会切换
- 内核栈
将 CPU 的栈指针寄存器 (SP/ESP/RSP, x86架构) 从指向进程 A 的内核栈顶部,修改为指向进程 B 的内核栈顶部 - 页目录
系统切换进程时找到进程的页目录的物理基地址(mm->pgd指针),写入CR3(x86)/TTBR0(ARM)寄存
2、进程页目录
存储在物理内存中,进程在创建时,系统创建mm_struct结构,用mm->pgd指针保存页目录物理基地址(用来在系统切换进程时找到进程的页目录的物理基地址,写入CR3(x86)/TTBR0(ARM)寄存器,完成进程上下文切换)
页目录包含进程使用的全部内存的虚拟内存地址->物理内存地址的映射关系
3、进程硬件上下文
运行时各寄存器的中间结果、比如PC程序计数器(下一条指令地址)、SP栈指针寄存器(当前调用栈顶)
切换时,这些数据被保存到进程内核栈中
4、线程切换总是发生在同一个进程(同一个虚拟地址空间)内的线程之间。不同进程的线程之间的切换,本质上是通过上层的进程切换完成的
5、切换线程时只切换线程内核栈,同样CPU栈指针寄存器从指向线程A的内核栈顶->B的内核栈顶。因为同属一个进程,所以不切换页目录,也即使用同一虚拟内存空间
6、进程、线程切换都依赖内核调度器,抢占式调度(时间片、中断)
7、协程切换只在用户态通过程序本身调度切换,主动让出,显式让出控制权
8、
| 进程 | 线程 | 协程 |
|---|---|---|
| 切换内核栈、页目录 | 切换内核栈 | 仅切换寄存器状态 |
9、用户态进程与内核态进程 全双工通信 -> Netlink Socket
相比传统 IPC (syscall, ioctl, procfs),Netlink 具有显著优势:易于扩展、异步通信、完美支持内核模块、强大的组播能力、真正的全双工通信、开发者友好的标准 Socket API。
单播回显: 用户请求->内核处理->内核响应的双向通信模式
内核主动组播: 内核主动向多个订阅进程广播事件的能力
netlink属于无连接协议(无连接协议是一种通信协议,其中每个数据包的处理都是独立的,不需要在发送数据之前建立连接)