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

来源:互联网 发布:js 获取html属性值 编辑:程序博客网 时间:2024/06/16 07:28

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



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

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

图一:网页加载过程

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

图二:浏览器执行流程

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

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

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

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

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

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

原创粉丝点击