L10用户级线程
首先:什么是用户级线程?对应的,什么是内核级线程?
用户级:
-
我的理解就是,这个线程的管理以及数据结构TCB都是我们自己创建的,并未通过操作系统的管理;
-
举个例子:我们可以完全不通过操作系统,单纯通过一个进程里面的函数之间的用户级跳转,不使用系统调用完成类似线程之间切换的操作;
我们通过Create()函数实现创建一个用户级线程,使用Yileld()函数实现函数之间的跳转;
为了完成这个目的,首先我们要设置栈空间->第一个问题:
两个线程设置一个栈还是两个栈?下图中的过程是设置一个栈的流程,当D()函数内的Yield执行jmp到B()204处,B函数执行结束进行弹栈!地址为D()函数内的404处!,两个线程执行顺序完全混乱!
下图:设置两个栈的流程,当执行到函数D()的Yield中后,保存当前进程esp位置并切换到另一个进程的esp指针位置,继续执行,完成跳转任务;
注意:并不需要在Yield函数中实现jmp,如果图中jmp到204处,B()函数执行完成弹栈,弹出的还是204,就有点小问题,如果不加jmp,D()函数中的Yeild()搞定执行到 } 时弹栈,直接弹出204,OK!
区别?
我们知道:对于操作系统的线程管理是这样的:
对于同一进程的线程之间不共享栈
这与我们刚刚实现的用户级线程的区别在哪里呢?
①线程切换不涉及内核,也不涉及调度,就是单纯的Yeild流程上的实现
②这里的TCB数据结构并非内核级的,使我们自己实现的;
③在操作系统看来,我们的多线程就是一个进程,如果有任何一个未考虑到的IO切换,会是的操作系统对当前整个进程进行阻塞,所有线程全都玩完~