操作系统:协程和上下文切换

首先,我们明确一个观点:程序的用线程来执行的。

同步执行序

如上图用户线程执行的一段时间片,线程从起点 A 开始执行,执行用户代码到终点 B 结束,执行到 C 点需要执行系统调用,用户线程就会在 C 点阻塞,执行序进入系统内核状态,剩下的时间片在系统内核执行。

执行系统调用是操作系统内核的异步调用,系统内核的时间片是由操作系统提供的内部时间片。系统调用不使用剩下的时间片,在用户线程阻塞,剩下的用户线程的时间片被阻塞造成浪费,根据阻塞的方式有两种处理时间片流程,一种方式阻塞什么都不干,一种方式是向操作系统交还剩下时间片给其他程序或者线程执行,但是这两种方式对进程执行都会造成性能损失。

异步执行序

还有一种模式,当线程执行到 C 点执行系统调用被阻塞,异步执行系统调用,剩下来的时间片不交还,执行调度把这段时间片交给其他线程执行。当系统调用完成后利用selectepoll机制实现线程唤醒,唤醒后把系统调用结果返还线程。这样在同一个线程执行多个并发任务,这些并发任务在用户态完成,和操作系统无关。

例如调用open系统调用,重新实现openAsync异步版本,这个异步版本是本来被阻塞变成异步调用,这个异步调用向操作系统注册epoll事件,告知调度器这个线程暂时被阻塞并已经注册相应的事件,调度器把剩下的时间片执行其他线程。对于操作系统来说,线程 A 和线程 B 是属于一套完整的逻辑,操作系统并不关心,这样完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值