操作系统之进程与线程2——用户级线程及其切换

一、用户级线程


——此节都是在用户态下编写程序,属于用户程序,为用户级进程/线程。

如何只切换指令,而资源不动?

——内核级线程切换+映射表切换=进程切换(在内存管理之后讲),先搞懂多线程切换(先用户级线程,再核心级线程),再做多进程切换。

  • 线程切换即只切换指令序列(即只有PC变化和寄存器变化),而其他资源不进行变化。——因此,线程时单个进程内部创建的共享资源的“似进程”。
  • 即将资源和指令分开管理,同时产生线程切换和进程切换。
  • 在进程中间可以启动多个轻巧的指令序列:多线程,并可以进行切换。


进程和线程的联系和区别?

  • 线程可以进行类似进程的操作。
  • 线程时进程的一种补充,避免了进程切换时的代价,并保证并发特点。


如何进行线程切换?

实例:浏览器

打开浏览器界面先显示文本再显示图片视频,而不是先等待再全部显示。即整个过程中间进行了程序的切换,但若是多个进程,即各个程序有各自的内存映射表,内存分离。则工作过程即:从服务器下载数据到一个映射表,显示文本进程再从该映射表拷贝内容到自己的映射表,非常麻烦。并且两个操作之间不涉及安全问题,本身为合作、共享关系,所以引入“线程”,在多线程之间共享资源(共享映射表),只完成指令的切换。

——相当于线程之间完全对资源实现共享。


浏览器的骨干代码实现

1、获取网址、申请共享缓冲区 —> 2、创建多个线程:create(线程同时推进),每个线程执行一段程序(一个函数):此处两个线程仍然相当于同时推进 —> 3、在各自函数内设置主动切换:yield(线程切换的核心


线程切换核心:Yield

线程1运行: B() 为函数调用,此时将函数调用的下一条指令地址入栈,即104入栈,随即进入B()内执行 ——> 线程切换(用户级线程)函数也为函数调用,即要执行yield(),则204入栈,随即执行yield() ——> 跳至内存中地址为300的指令执行,此时即进行了线程切换,执行C() ——> 类似,304、404入栈,随即执行线程2的yield() ——> 切换至线程1执行204 ,之后B() 结束,因此要出栈,为404 ,实则return应该返回至线程1的104处执行,而此时调用执行完进入线程2的404,出错。


  • 出错原因是因为两个线程共用了一个栈,导致线程之间切换和内部运行出现错乱。
  • 一个函数调用是在一个指令序列内部发生的,即在一个线程中返回,因此发生错误,所以改变:每个指令序列都得有自己的栈。

——> 每个指令序列对应一个栈(TCB:全局数据结构),因此多线程切换时需要同时保存、切换相应的栈。

——>yield切换只需要切换各线程的栈即可(先保存现场栈,再更新新栈)

yield() 函数内,先完成线程2线程栈保存,再调整栈顶为线程1的204处,再jmp跳至204执行,B()函数结束后出栈(新esp栈:线程1栈),仍返回至204,出错。——>体会一下程序运行时的 函数调用入栈、函数返回出栈 操作(当前栈的入栈、出栈)。


  • C语言中B()执行前104入栈,B()执行完return至当前栈栈顶104,执行yield() 函数内部调整当前栈为线程1栈,此时站定为204,因此若无jmp语句,yield()即可以return至204。而jmp至204执行,后再B() 返回至栈顶204,出错。
  • 因此,去掉yield() 中的jmp,在yield()函数执行完后return至204即可。

综上,线程切换只需要 1、每个指令序列对应一个栈; 2、线程切换只需要切换栈即可,不需要切换PC指针(切换的PC在栈中)。

线程创建:Create

线程切换需要:1、各个线程的TCB;2、栈;3、栈中存放切换的PC。因此create即需要创建这三样东西。


申请一段内存作为TCB(用户级线程)——> 申请一段内存作为栈——> 再栈中添加程序的初始地址——> 把栈和TCB关联

用户级线程和内核级线程

用户级线程由用户主动实现线程的切换,用户级线程属于内核级线程的子部分,并且可以由用户单独使用。

用户级线程缺点:多个用户级线程往往隶属于一个进程,并且完全在操作系统内核之外,因此线程1阻塞,即浏览器进程阻塞,会切换至别的进程,则进程内线程并发无效。——>内核级线程的并发性更好。


  • 内核级线程schedule() 为内核调度
  • 用户级线程yield() 为用户主动释放的函数






  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值