操作系统 用户级线程

操作系统全部笔记目录 见:操作系统笔记整理

操作系统 用户级线程_第1张图片

一个进程执行一堆指令,执行的时候通过映射表来确定地址。我们在切换的时候,这个映射表(资源)需不需要切换呢?

操作系统 用户级线程_第2张图片

这样只是切pc,内存和表不用切。在每个大的进程里,有很多小的线程,并行的时候只需要改每个小的线程的PC指针,而不需要切换映射表。所以切换分为两个部分:线程的切换和进程的切换(资源,映射表的切换)。

网页从一打开到显示出来,需要时间,包含文本数据和图像数据。有一段程序来读数据,一段程序来显示。因为有多线程处理,所以效果是先文字显示出来,然后再显示出来图片。即下载一段就切出去显示,然后再切回来继续下载(多个指令序列交替)

操作系统 用户级线程_第3张图片

这些小的程序之所以是线程而不是进程,因为它们访问同一个缓冲区,需要共享数据缓冲区,一个下载进去,一个读出来显示。

操作系统 用户级线程_第4张图片

必须得交替执行来保证并发。pthread_create函数保证线程同时出发,yield函数保证线程之间可以进行切换。

操作系统 用户级线程_第5张图片

操作系统 用户级线程_第6张图片

实际运行一下切换:

操作系统 用户级线程_第7张图片

首先A执行,然后要跳到B去执行,B执行要执行Yield,所以返回地址压栈,即204压栈。然后再去执行300处的代码,然后执行到D,把304压栈,然后D中要跳转到Yield中执行,所以404压栈,Yield找到B,但是这个时候,找地址要弹栈,而弹出的栈的值是404,也就是又跑到404那里去执行了。这就出现了问题。两个线程用一个栈是不行的。

操作系统 用户级线程_第8张图片

栈的指针要存放起来。TCB是个全局的数据结构。

但是执行Yield的时候,204压栈,恢复了以后还是204。刚才已经执行204到这个地方了,现在又执行了204,显然是不行的,

204在Yield调用的时候压栈,应该在Yield返回的时候弹栈,但是Yield在这里又蹦到了204去执行,所以204永远弹不出来。所以我们把Yield里面的 jmp 204给去掉,就可以了。

操作系统 用户级线程_第9张图片

操作系统 用户级线程_第10张图片

把这些东西一起编译,就形成了浏览器程序。

这就是用户级线程,通过用户主动进行切换,不用内核帮助。用户级线程是可以独立于操作系统的。

用户级线程:

操作系统 用户级线程_第11张图片

比如打开多个网页,但是网很卡,网卡阻塞,就导致操作系统切换到其他进程里,从而不再来执行该进程,就会出现多个网页的界面同时点不动(因为这个时候操作系统看不到这个进程里有可以执行的线程,所以不会到这个进程里来)。

比如,某个线程申请网络,但是还没申请好,网不好所以卡了,而且还没有执行跳转。这个时候就只能一直卡着那个进程。

而内核级线程:

操作系统 用户级线程_第12张图片

则是如果网很卡,但是已经加载出一些数据来了,就调用另外的线程来显示。

 

你可能感兴趣的:(操作系统,Linux)