进程与线程-2、用户级线程切换过程

参考哈工大李治军老师公开课。



用户级线程示例(浏览器)

在浏览器使用的过程中,访问一个网页需要在服务器下载资源,并且在客户端的浏览器中显示出来。我们看到页面会先显示一些文字、图片,然后逐步加载其他信息,进而逐步完善。

进程与线程-2、用户级线程切换过程_第1张图片

图一:网页加载过程

通过这个页面加载过程是一个边加载边显示的过程,可以看出浏览器两个程序在跑,一个负责现在资源,一个负责显示。所以浏览器是多用户程序,而且是用户级。

进程与线程-2、用户级线程切换过程_第2张图片

图二:浏览器执行流程

用户级线程切换过程(以两个线程为例):

在用户级线程中,每个线程会被分配一个线程进行栈TCB,用于记录每个线程执行时的跳转地址。例子:

执行A函数,调用了B函数,将函数B的地址104压入TCB1,然后执行B函数,执行到Yield(),将204压入TCB1中;在Yield()中,会执行当前esp指针的转换,指向TCB2;

        执行C函数,调用D()函数,将304压入TCB2,执行D函数,运行Yield(),在执行当前TCB指针的切换,切换至TCB1,TCB1中的栈顶弹出,继续执行B()函数后面的内容。

进程与线程-2、用户级线程切换过程_第3张图片

图三:用户级线程切换过程

用户级线程并发执行的并发度相对较低,而且比较容易出现阻塞,例如图三中在执行A()函数时,在调用B()函数之前出现异常,导致程序不能往下执行了,也无法进行线程的切换,这样就会导致程序的并发性降低。

你可能感兴趣的:(进程与线程)