L10、11:用户级线程和内核级线程
线程、进程的区别
线程是一段指令序列,而进程是一个可执行程序,是若干指令序列与内存资源的组合。
进程中可以包含若干个线程,线程是进程的一个子部分,一个进程实现了一个程序,而线程只实现了这个程序中的一个子功能。
用户级线程
完全在用户态执行的线程
进程切换如何实现(yield)
使用TCB保存当前栈的位置,然后切换或创建另一个栈用于另一个线程,然后设置PC,跳到另一个指令序列中执行。
注意yield函数结束时自动弹出栈顶,自动挑战到栈顶记录的那个位置,不用手动jmp
两个线程与一个栈
混用栈会导致跳转异常
TCB
Thread Control Block,保存一个线程的信息,包括线程id、栈指针、指令指向到的位置地址、线程状态等
创建另一个线程create函数的步骤
创建TCB,创建栈,设置线程执行的初始地址
用户级线程切换与进程切换的矛盾处
当一个用户级线程执行IO,发生阻塞,此时进程要切换到另一个线程时,操作系统内核不会这么想,内核中只会发现当前进程开始执行IO,发生了阻塞,内核会让当前进程进入等待状态,切换至另一个进程去执行,当前进程就无法切换至另一个线程。
为什么没有用户级进程
进程是指令序列与内存资源的组合,处于用户态时无法调用内存资源,因此没有用户级进程。
为什么要核心级线程
为了利用多核的优势。
多处理器和多核的区别
二者都有多个CPU,区别是多处理器中每个CPU有各自单独的缓存、映射表等,而多核中的CPU共享缓存、映射表,一个进程中的多个线程也是共享映射表的,因此多核与多线程可以很好地搭配使用,减少了切换资源地步骤,提高了效率。
并发和并行
并发指一个CPU交替执行多个指令序列,而并行指多个CPU同时执行各自的指令序列
核心级、用户级线程的区别
- 一个运行在用户态而另一个运行在核心态
- 多个用户级线程都运行在一个CPU上,而多个核心级线程运行在不同的CPU上,利用了多核的优势,加快了运行速度。
核心级线程的用户栈和内核栈
一个核心级线程有用户栈和内核栈,分别存放用户态和核心态中的信息
从用户态切换到核心态
创建或切换至内核栈、内核TCB,在内核栈中保存当前用户态的信息(用户栈的地址SS:SP、用户栈当前执行到的指令的地址CS:IP),以便返回时使用。
核心态线程执行、切换的过程
当核心态线程阻塞时,会切换至另一个核心态线程去执行(与用户栈的切换类似),在另一个核心态线程执行中可以返回用户态,那么此时就在另一个用户态线程继续执行。