| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> MIT 6.S081 Lab7: Multithreading -> 正文阅读 |
|
[嵌入式]MIT 6.S081 Lab7: Multithreading |
写在前面这个实验是多线程安全和同步的内容,实验地址在这里。说实话,有点简单,用了一天时间就写完了,感觉最近的实验,从实验三之后难度就降低了很多。但是实验的内容还是很有用的,主要学习了一遍线程的切换过程,感觉受益很多,建议看一下课程里对应的多线程部分。我的实验代码在 github 上,感觉这个实验没太多代码和步骤需要分析,主要是基础知识,这里就随便写点我觉得重要的了。 线程调度线程调度的过程大概是以下几个步骤:
线程调度过程如下图所示: 线程调度的过程主要是保存 contex 上下文状态,因为这里的切换全都是以函数调用的形式,因此这里只需要保存被调用者保存的寄存器(Callee-saved register)即可,调用者的寄存器会自动保存。 进程、线程和协程
在 xv6 中,一个进程只有一个线程,因此本实验中区分不大。 第一个实验的内容很像协程的概念,即用户线程切换时,不进入内核态,而是直接在用户线程上,让用户线程自己主动出让 cpu,而不是接受时钟中断。 更具体的区别可以查一查其他人写的博客。 实验内容感觉整个实验,最核心的还是任务一,后面两个实验与 xv6 没啥关系。 任务一(Uthread)实现一个用户线程调度的方法。
第一步,上下文切换首先是 uthread_switch.S 中实现上下文切换,这里可以直接参考(复制) swtch.S:
先将一些寄存器保存到第一个参数中,然后再将第二个参数中的寄存器加载进来。 第二步,定义上下文字段从 proc.h 中复制一下 context 结构体内容,用于保存 ra、sp 以及 callee-saved registers:
在线程的结构体中进行声明:
第三步,调度 thread_schedule在 thread_schedule 中调用 thread_switch:
第四步,创建并初始化线程
线程栈是从高位到低位,因此初始化时栈指针 sp 应该指向数组底部(好像直接加 返回地址 ra 直接指向该函数的地址就行,这样开始调度时,直接执行该函数(线程)。 任务二(Using threads)利用加锁操作,解决哈希表 race-condition 导致的数据丢失问题。 主要是,在加大锁还是小锁的问题。如果只加一个锁,锁的粒度很大,会导致丢失性能,结果还不如不加锁的单线程。因此需要将锁的粒度减小,为每个槽位(bucket)加一个锁。
在 main 函数中初始化锁:
任务三(Barrier)这个做着有点懵,莫名其妙的做完了!? 主要是条件变量:
这里是生产者消费者模式,如果还有线程没到达,就加入到队列中,等待唤起;如果最后一个线程到达了,就将轮数加一,然后唤醒所有等待这个条件变量的线程。
总结线程调度很牛,感觉刚好写了一下精髓部分。最后的条件变量现在还不是很懂,。。 文章同步在知乎。 参考文章 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:32:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |