L10用户级线程

首先:什么是用户级线程?对应的,什么是内核级线程?

用户级:

  • 我的理解就是,这个线程的管理以及数据结构TCB都是我们自己创建的,并未通过操作系统的管理;

  • 举个例子:我们可以完全不通过操作系统,单纯通过一个进程里面的函数之间的用户级跳转,不使用系统调用完成类似线程之间切换的操作

    我们通过Create()函数实现创建一个用户级线程,使用Yileld()函数实现函数之间的跳转
    为了完成这个目的,首先我们要设置栈空间->第一个问题:
    两个线程设置一个栈还是两个栈?

    下图中的过程是设置一个栈的流程,当D()函数内的Yield执行jmp到B()204处,B函数执行结束进行弹栈!地址为D()函数内的404处!,两个线程执行顺序完全混乱!
    L10用户级线程
    下图:设置两个栈的流程,当执行到函数D()的Yield中后,保存当前进程esp位置并切换到另一个进程的esp指针位置,继续执行,完成跳转任务;
    注意:并不需要在Yield函数中实现jmp,如果图中jmp到204处,B()函数执行完成弹栈,弹出的还是204,就有点小问题,如果不加jmp,D()函数中的Yeild()搞定执行到 } 时弹栈,直接弹出204,OK!
    L10用户级线程

区别?

我们知道:对于操作系统的线程管理是这样的:
对于同一进程的线程之间不共享栈

这与我们刚刚实现的用户级线程的区别在哪里呢?
①线程切换不涉及内核,也不涉及调度,就是单纯的Yeild流程上的实现
②这里的TCB数据结构并非内核级的,使我们自己实现的;
③在操作系统看来,我们的多线程就是一个进程,如果有任何一个未考虑到的IO切换,会是的操作系统对当前整个进程进行阻塞,所有线程全都玩完~