zoukankan      html  css  js  c++  java
  • [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() 用户不可见,调度点由系统决定
  • 相关阅读:
    Docker+Jenkins更换国内插件源
    招聘java工程师
    Apache seaTunnel 数据集成平台
    DBeaver连接MySQL问题的解决
    iphone的mov文件复制到电脑的方法
    IDEA中RestfulToolkit插件的安装及使用
    lwm2m 的notify 的机制
    ALI云接入学习
    CAT1 UIS8910模组对接阿里云平台
    任务的堆栈究竟有何魔力
  • 原文地址:https://www.cnblogs.com/Chary/p/No000039.html
Copyright © 2011-2022 走看看