type
status
slug
date
summary
tags
category
password
icon
CPU硬件对并发的支持
硬件的中断轮询开销不大?
也是轮询(计组里面说个,有个专门的执行周期检查是否有中断到来,也就是每条指令执行完成后有个检查),但是这可以由一个简单电路来实现,所以开销会小。
User-Level Interrupts “N”- User Trap Setup
问题:
现在有N多个应用程序,如果都能接收中断的话,不像之前,只需要发给内核(对象/目标),那就得指明给谁发。而且你发送的时候,当前进程并不一定在运行,那发中断是什么意思呢?
操作系统对并发的⽀持
信号(Signal)
用户态的异常处理机制
- 信号(Signal)响应时机
- 发送信号并没有发生硬中断,只是把信号挂载到目标进程的信号pending队列
- 信号执行时机:进程执行完异常/中断返回用户态的时刻
- 用户注册的信号处理函数都是用户态的
- 先构造堆栈,返回用户态去执行自定义信号处理函数
- 再返回内核态继续被信号打断的返回用户态的动作
Rust语言对并发的支持
协程(通常认为应该是无栈的)
异步操作系统
目前我们需要考虑每个核跑什么,创建多少个线程这些内容,都是手动的管理,编写程序也需要考虑很多,而异步编程(语言的机制)方式是有办法释放这部分的考虑的。
看完视频后,补充看看课上讲的概念
无栈协程
无栈协程顾名思义就是不使用栈和上下文切换来执行异步代码逻辑的机制。这里异步代码虽然是异步的,但执行起来看起来是一个同步的过程。从这一点上来看 Rust协程与 Go协程也没什么两样。举例说明:
几乎是一样的流程。
Sleep
会导致睡眠,当时间已到,重新返回执行,局部变量 a
内容应该还是5。Go协程是有栈的,所以这个局部变量保存在栈中,而 Rust是怎么实现的呢?答案就是 Generator
生成的状态机。 Generator
和闭包类似,能够捕获变量a,放入一个匿名的结构中,在代码中看起来是局部变量的数据 a
,会被放入结构,保存在全局(线程)栈中。另外值得一提的是, Generator
生成了一个状态机以保证代码正确的流程。从 sleep.await
返回之后会执行 a=a+1
这行代码。async routine()
会根据内部的 .await
调用生成这样的状态机,驱动代码按照既定的流程去执行。
按照一般的说法。无栈协程有很多好处。首先不用分配栈。因为究竟给协程分配多大的栈是个大问题。特别是在32位的系统下,地址空间是有限的。每个协程都需要专门的栈,很明显会影响到可以创建的协程总数。其次,没有上下文切换,貌似性能也许会好一些?当然,更大的好处是并不需要与 CPU 体系相关代码,也就有了更好的跨平台的能力。当然,无栈问题也不少。例如, Rust著名的 PIN
问题。另外,个人觉得 Rust的无栈协程主要问题是不那么直观,理解起来会稍微吃力一些。
下面这个博客不错,算是对rust协程整体的一个补充:
‣主要是这段代码:
- 作者:liamY
- 链接:https://liamy.clovy.top/article/OScamp_prj6_pre02
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。