码迷,mamicode.com
首页 > 编程语言 > 详细

[No000039]操作系统Operating Systems用户级线程User Threads

时间:2015-10-31 15:46:13      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

多进程是操作系统的基本图像

技术分享

是否可以资源不动而切换指令序列?

进程 = 资源 + 指令执行序列

技术分享

  • 线程: 保留了并发的优点,避免了进程切换代价
  • 实质就是映射表不变而PC 指针变

多个执行序列+ 一个地址空间是否实用?

一个网页浏览器

  • 一个线程用来从服务器接收数据
  • 一个线程用来显示文本
  • 一个线程用来处理图片( 如解压缩)
  • 一个线程用来显示图片

这些线程要共享资源吗?

  • 接收数据放在100 处,显示时要读..
  • 所有的文本、图片都显示在一个屏幕上

开始实现这个浏览器…

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){...};

技术分享

Create? Yield?

核心是Yield…

  • 能切换了就知道 切换时需要是个什么样子(样子弄明白了,剩下的就是写程序实现这个样子了…)
  • Create 就是要制造出 第一次切换时应该的样子

仔细看Yield ,就是100 跳到300

技术分享

技术分享

两个执行序列与一个栈…

技术分享

 

技术分享

(3) 再往下执行会怎么样 ?

问题怎么解决?

为什么?

从一个栈到两个栈…

技术分享

 

Yield 切换要先切换栈,然后...

  • (3) 再往下执行会怎么样 ?
  • 204 是调用 Yield()才压栈的 …

void Yield(){

TCB1.esp=esp;

esp=TCB2.esp;

jmp 204; 应该去掉

}

两个线程的样子:两个TCB 、两个栈、切换的PC 在栈中

ThreadCreate 的核心就是用程序做出这三样东西

 

技术分享 技术分享

void ThreadCreate(A)

{

TCB *tcb=malloc();

*stack=malloc();

*stack = A;//100

tcb.esp=stack;

}

将所有的东西组合在一起……

技术分享

gcc -o explorer get.c yield.c … 或 或 gcc get.c.. -lthread

GetData 下载到文本时会调用Yield()…

技术分享

为什么说是用户级线程——Yield 是用户程序

如果进程的某个线程进入内核并阻塞,则…

技术分享

 

技术分享

核心级线程核心级线程和用户级线程区别,哪个快?

ThreadCreate是系统调用,会进入内核,内核知道TCB

技术分享

  • gcc -o explorer explorer.c yield.c …
  • 内核级线程gcc -o explorer explorer.c… ;ThreadCreate是系统调用;Yield() 用户不可见,调度点由系统决定

 

[No000039]操作系统Operating Systems用户级线程User Threads

标签:

原文地址:http://www.cnblogs.com/Chary/p/No000039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!