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

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

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

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

  • 线程: 保留了并发的优点,避免了进程切换代价
  • 实质就是映射表不变而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() 用户不可见,调度点由系统决定

 

posted @ 2015-10-31 15:06  CharyGao  阅读(473)  评论(0编辑  收藏  举报