首页 > 操作系统频道 > Linux操作系统 > 正文
用户级线程
2016-05-04     我来说两句       作者:黑帽网
   我要投稿

线程的切换

在看进程切换前,我们先来看线程的切换吧。这一篇主要说的是用户级线程的切换。因为 进程的切换=资源切换+指令执行序列切换。将资源和指令序列分开看,如果只是从一个执行指令序列切换到另一个执行指令序列,那么这就是线程的切换。

线程保留了并发(一个cpu上交替的执行多个程序)的优点,避免了进程切换代价,不需要切资源(映射表),只是切执行指令序列。线程切换的实质就是映射表不变而PC指针变。

用户级线程的切换

一个网页浏览器
一个线程用来从服务器接收数据
一个线程用来显示文本

开始实现这个游览器…

void WebExplorer(){    char URL[]="http://cms.hit.edu.cn";    char buffer[1000];    pthread_create(...,GetData,URL,buffer);    pthread_create(...,Show,buffer);}void GetData(char* URL,char *p){...};void Show(char* p){...};

我们了一段时间的数据后,切出去执行另一个线程,显示文本后,切回来继续下载。

这里写图片描述

Yield与Create

pthread_create()让多个线程同时触发,yield()能完成线程的切换,使线程交替执行。

现在有两个执行序列,我们想要其中执行了一段时间后,跳到另一个去执行,之后又切回来。(线程的切换)
这里写图片描述

这里写图片描述

Yiled从100跳到300
这里写图片描述

//B中的Yieldvoid Yield(){   找到300;   jmp 300;}//D中的Yieldvoid Yield(){   找到204;   jmp204;}

两个执行序列与一个栈…

从100开始执行,在A函数中遇到B函数的调用,B的返回地址即下一句指令的地址104压栈,又在B中遇到Yield()调用,Yield()的返回地址204压栈。在B中的Yield()jmp到300,执行C函数,在C中遇到D()调用,304压栈,执行D(),遇到D中的Yield()调用,Yield()的返回地址404压栈。

这里写图片描述<喎

点击收藏到自己的收藏夹!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:教你如何制作OS X Lion启动U盘与使用U盘安装系统
下一篇:【Qt】UserInfo
相关文章
图文推荐
排行
热门
Windows
Linux
命令脚本
关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 中国黑帽网--致力于做最好的网络安全技术学习网站 。