版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统OperatingSystem第5章线程Chapter5:Threads进程回顾进程进行中的程序需要准备程序执行所需的资源mov[100],ax100:1StackHeapDataCode0000ffff映射表需要记录进程如何向前推进进程1ax11bxPC寄存器映像...进程回顾进程=资源+指令执行将资源和指令执行分开一个资源+多个指令执行序列mov[100],ax进程映射表mov[100],ax
寄存器映像
寄存器映像进程代码、进程数据、进程资源线程线程:保留了并发的优点,避免了进程的高代价线程是否简单、实用?
一个真正好的想法一定是简单而实用的!多个执行序列+一个地址空间是否实用?这些线程共用一个地址空间吗?一个网页浏览器一个线程用来从服务器接收数据一个线程用来处理图片(如解压缩)一个线程用来显示文本一个线程用来显示图片同一个服务器建立连接并接收数据所有的文本、图片都显示在一个屏幕上线程是否简单好用?voidWebExplorer(char*URL){pthread_ttid1,tid2,tid3,tid4;pthread_attr_tattr1,attr2,attr3,attr4;pthread_attr_init(&attr1);...
pthread_create(&tid1,&attr1,GetData,URL);...}voidGetData(char*URL){...};voidShowText(){...};voidProcessImage(){...};voidShowImage(){...};线程怎么实现?WebExplorer怎么能好使?在函数库中实现和线程有关的函数两个问题:在哪里实现?怎么实现?#include<pthread.h>voidWebExplorer(char*URL){...pthread_create(&tid1,&attr1,GetData,URL);
...}线程库在哪里实现–这是一个问题吗?不是显然应该放在系统核心吗?–
和进程一样进程:不同的地址空间vs.线程:同一地址空间mov[100],ax进程1100:1StackHeapDataCode0000ffffmov[100],ax进程2100:0StackHeapDataCode0000ffff映射表映射表一个进程不应该访问其他进程的映射表进程在用户级实现没法完成这一目的实现方案1:用户级线程需要好好想一想!操作系统全然不知道有用户级线程库这回事需要做的事和通常写的程序(如图搜索)区别并不大(1)问题定义:要做什么(2)设计:要做成什么样(3)程序实现:具体怎么做要做什么?在一个地址空间中产生多个执行序列
A(){B();}100:1StackHeapDataCode0000ffff一个执行序列100:1Stack1Stack2HeapDataCode0000ffff多个执行序列
A(){B();}
C(){D();}要做成什么样?–如何产生执行序列在一个地址空间增加一个执行序列需增加什么?(1)PC指针(2)实现函数调用的栈(3)寄存器映像程序执行的其他信息在哪里?在该线程所属的PCB里具体怎么做?–产生执行序列执行序列所需的信息放在哪里?TCB!typedefstruct__pthread_attr_s{...void*__stackaddr;size_t__stacksize;...}pthread_attr_t;有点奇怪!PC指针和ax等的内容放在哪里了?具体怎么做?–用栈来保存现场首先回顾一下栈!A(inttmp){if(tmp<2)B();}B(){C();}C(){A(2);}A(1);A:tmp=2ret=C+1A:tmp=1ret=exitB:ret=A+2C:ret=B+1栈的增长方向栈顶指针从函数A(一段代码)到函数B(另一段代码)具体怎么做?–用栈来保存现场和函数调用有什么不同?两个栈线程SS.funcS.func
当前PC寄存器映像保存栈指针switch开始切换线程T栈的增长方向T.funcT.func
要到的PC寄存器映像载入栈指针保存在哪里?具体怎么做?–完成切换ThreadSwitch(Cur,Next)pushax;pushbx;...pushsi;pushdi;
movax,TCB[Cur].__stackaddr;mov[ax],sp;
movcx,TCB[Next].__stackaddr;movsp,[cx];popdi;popsi;...;popbx;popax
ret这是什么意思?具体怎么做?–关于NextThread如何选择NextThread?也是调度问题,将在下一章阐述有趣的是:用户级线程
用户可以自己定调度策略何时选择NextThread?和进程类似,等待某事件也可以定义优先级用户级线程
用户可以自己定调度策略具体怎么做?–pthread_create现在可以创建线程了!pthread_create(&tid,&attr,GetData,URL){get_TCB(&tid);copy(TCB[tid],attr);void*ssp=get_STACK();
TCB[Cur].__stackaddr=ssp;copy(ssp,URL);copy(ssp+1,GetData);copy(ssp+2,0);...Enqueue(ReadyQueue,TCB[tid]);}具体怎么做?–开始派遣开始真正的并发!Yield(){Next=PickNext();ThreadSwitch(Cur,Next);}0000100:1Stack1Stack2HeapDataCodeffff多个执行序列
A(){B();}
C(){D();}派遣程序在合适的地方调用Yield就可以了再看WebExplorerImage:01011Stack1Stack2HeapDataCode0000ProcessImage:…ShowImage:…ffff派遣程序ProcessImage解压缩Image数据发现Image数据处理完将自己加入等待队列调用Yield()ShowImage显示解压后的Image数据Image数据全部显示将自己加入等待队列调用Yield()ProcessImage...线程协作再看一遍WebExplorerImage:01011Stack1Stack2HeapDataCode0000ProcessImage:…GetImage:…ffff派遣程序ProcessImage解压缩Image数据发现Image数据处理完将自己加入等待队列调用Yield()GetImage进入网卡驱动向URL发起数据获取请求等待...调用Dispatch()WebExplorer全体阻塞...这就是用户级线程某个线程在内核阻塞,整个进程阻塞!PP进程1用户核心硬件进程2进程1进程2P线程1线程n进程不能很好的利用多CPU,因为进程的地址空间不同实现方案2:核心级线程核心级线程的工作模型用户创建的就是核心级线程!
系统调用PP进程1用户核心硬件进程2线程1P线程n和用户级相比,核心级线程有什么不同?由内核完成线程的创建、调度等主要工作仍是保存现场在哪里?内核栈代码和数据用户内核线程控制块内核栈用户栈每个执行序列需有两个栈:用户栈+内核栈用户栈:普通的函数调用内核栈:系统调用、中断处理来看一个执行过程A:tmp=1ret=exitB:ret=A+2用户栈A(inttmp){if(tmp<2)B();}B(){C();//系统调用}C(){
系统调用的处理;}A(1);C:ret=B+1内核栈中断出现时,靠当前线程(cur)的TCB找到内核栈用户栈和内核栈之间的切换所有中断(时钟、外设、INT指令)都引起上述切换用户栈源SS内核栈源SPEFLAGSPCINTIRET切换的用户栈和内核栈一定属于同一线程内核要修改某些位继续看那个执行过程A(inttmp){if(tmp<2)B();}B(){C();//系统调用}C(){//网卡读启动网卡读;…;}A(1);系统调用过程中出现阻塞–如等待网卡数据A:tmp=1ret=exitB:ret=A+2用户栈EFLAGS内核栈SS:SPret=B+1Call(C)C返回时线程已阻塞开始SwitchcallC;...if(state(cur)!=ready)jmpreschedule;reschedule:next=schedule();
Switch(cur,next);EFLAGS内核栈SS:SPret=B+1线程SEFLAGS内核栈SS:SPret=??线程Tswitch系统调用代码此时Switch的具体实现中断入口:pushds;pushes;…pusha;...moveax,SEL_KDSEG;movds,eax;moves,eaxcallintr_handler由于中间要执行程序C,所以现场保存应在C之前根据next找到线程T的内核栈指针根据线程T的内核栈指针恢复现场,并从中断返回中断出口:popa;popes;popds;…iret栈切换:TCB[Cur].sp=sp;sp=TCB[Next].sp;再看那个执行过程A(inttmp){if(tmp<2)B();}B(){C();//系统调用}C(){//网卡读启动网卡读;…;}A(1);网卡读数据完成网卡中断中断入口:push...;callnetcard_handler中断返回代码:pop...;iretsp=TCB[S].sp;state(S)=ready;线程SS被调度;}//执行此处这一切成功的前提!EFLAGS内核栈SS:SPret=B+1线程SEFLAGS内核栈SS:SPret=??线程Tswitch保障1:运行的内核线程进入内核后才能变为阻塞或就绪保障2:创建线程时就得是这个样子保障3:进入内核后才能调度保障4:进入内核就靠中断,回到用户态靠中断返回还剩下一点小问题问题1:线程S和T属于两个不同的进程怎么办?curPCB=TCB[cur].PCB;nextPCB=TCB[next].PCB;if(nextPCB!=curPCB){切换地址空间;//内存管理学了就明白了}问题2:用户不断创建线程怎么办?tcb=get(poolofTCB);//线程池if(tcb==-1)等待;初始化TCB[tcb]中的某些值;//创建快速//有些时候会让用户奇怪实现方案3:用户级、核心级都有用户级线程+核心级线程两种线程都有就需要完成捆绑!硬件LLLPP进程1用户核心LP进程2线程1线程n线程1线程n轻量级进程n轻量级进程1这种捆绑需要考虑的关键问题两层调度:核心级线程、用户级线程都要调度核心级线程调度到CPU,用户级线程呢?当然是核心级线程,但这些线程属于所有进程为此引入一个LWP(LightWeightProcess)用LWP实现用户级线程和核心级线程的捆绑线程库(用户级)可以控制
LWP、并完成捆绑每个
LWP一直捆绑在一个内核级线程上LWP是怎么实现捆绑的?如何将用户级线程绑在LWP上?L进程1在弄明白捆绑之前,我们需要重新审视一些用户级线程多个栈实现的函数调用线程S当前PC寄存器映像保存栈指针switch线程T用户栈要到的PC寄存器映像载入栈指针用户栈函数调用和LWP的关系LWP是内核对象,函数调用是用户概念函数调用在CPU上执行时跟LWP没有任何关系CPUA()Y()B()Y()CPUCPUCPUCPU这表明:用户级线程在不进入内核时,LWP不起任何作用!A()CPU用户级线程要进入内核此时会发生什么?找到内核栈,在其上压入数据,如SP,PC等内核执行相应的中断处理如果会阻塞,内核找到当前内核级线程TCB保存某些值准备切换(同前面的讲述)由TCBlwpCB,修改LWP为阻塞态切换到目标内核极线程(Switch(cur,next))为什么是当前?核心级线程切换以后此时又发生什么?从目标内核极线程恢复某些值,主要是SP内核执行中断返回程序,popa;iret修改TCB及对应lwp的状态为运行自然会有:什么时候使内核栈成为这个样子?EFLAGS内核栈SS:SPret=??线程TswitchLWP做什么?–用户级线程创建时捆绑想一想线程库该如何创建一个用户级线程?申请栈、创建TCB等内容如果进程没有未捆绑的LWP,则将线程加入就绪队列进行捆绑//执行系统调用找到未捆绑的LWP找到lwp对应的内核级TCB根据TCB找到内核栈并做成那个样子(等待iret)和单纯的用户级线程无区别为什么?现在会非常想知道Yield怎么动作?什么时候调用Yield?出现未捆绑(可用)的LWP!何时出现?就绪阻塞捆绑用户级线程用户级线程阻塞或被抢占这个线程一定是捆绑且正在运行的!显然只有这一种情况直接调用Yield就行!因为这一切都是函数调用有趣的结论:Yield和单纯的用户级线程完全一样!现在梳理整个过程(LWP用户部分)用户级线程创建时和LWP显式捆绑用户级线程执行时LWP不起作用用户级线程切换时LWP不知道(LWP隐式捆绑)ULT就绪ULTULT等待ULTLWPKLT…LWPKLTULTULTULT现在梳理整个过程(LWP内核部分)执行和LWP
捆绑的用户级线程(其PC已在内核栈)ULT就绪ULT等待LWPKLT…LWPULTULTULT中断时进入LWP,在内核阻塞后切换到下一个LWP
KLTKLTKLTULTULTLWP做什么?–知道LWP是否已捆绑?PCBLWP1LWP2在用户级线程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合规转利润:降本增效全指南(2026)《GBT 38989-2020无机结合料稳定类材料单轴压缩弹性模量试验方法(中间段法)》
- 合规转利润:降本增效全指南(2026)《GBT 38651.4-2020公共信息标志载体 第4部分:维护要求》从合规成本到利润增长全案:避坑防控+降本增效+商业壁垒构建
- 支气管镜介入治疗喉
- 脑梗塞病人健康教育
- 游乐场员工劳动合同
- 临沂大学英语语言学期末考试试卷级参考答案
- 南安人工智能招聘专场
- 2026年新公司法知识竞赛题库与答案
- 胆囊结石护理查房
- 货物运输应急预案
- 2026年继续教育公需课(科目三)
- “化危为安”线上讲堂第153期-用好重大隐患判定准则 准确排查整治风险隐患-程长进
- 2026年秋新教科版五年级上册科学全册教案+教学计划
- 回复供应商询价的回复函3篇范文
- 高空作业平台倾覆现场处置方案
- 口腔颌面部感染诊疗临床应用专家共识(2025版)
- 2026年芯片设计DFT工程师高频面试题包含详细解答
- 网络传播概论(第5版)全套教学课件(完整版)
- 三宝四口五临边安全防护施工方案
- 临床肝紫癜病影像学表现
- 2026江苏法院招聘聘用制书记员202人考试参考题库及答案解析
评论
0/150
提交评论