mit6.s081 lecture11
发表于|更新于
|总字数:187|阅读时长:1分钟|浏览量:
Thread
why need it
希望计算机在同一时间可以执行多个任务
将代码以更加优雅的方式组织 解耦 减少运行的复杂度
并行运算 利用现代计算机多核CPU的硬件优势
一个线程 = 一个串行执行代码的单元
他本身自己是有状态的(PCB)
含有:
PC 程序计数器
存储变量(寄存器)
Stack 程序当前的执行点 与PC不同 pc是记录运行的位置 stack则是记录当前程序的执行点(具体的执行信息)
而多线程的并行运行策略
主流是为 一个CPU在多个线程之间来回切换 即俗称的线程上下文切换
文章作者: Ivorysillegal
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Ivorysillegal's Blog!
相关推荐
2025-04-08
mit6.s081 lecture10
Lecture 10有一段时间没看了 忘了好多 锁why need it多个CPU核的并行计算可以带来倍数级的提升 但是假如一个程序运行在多个核上 会同时带来一些竞态的问题 并且需要内核能够正确的处理它们 有很多老生常谈的环境 例如说什么生产者消费者模式 共享内存的情景下 我们都需要使用锁来保证多个核之间 数据的一致性 简而言之 多核并行计算带来了效率提升 也带来了多核时的并发控制成本 和编码难度 实际的情况有些令人失望,因为我们想要通过并行来获得高性能,我们想要并行的在不同的CPU核上执行系统调用,但是如果这些系统调用使用了共享的数据,我们又需要使用锁,而锁又会使得这些系统调用串行执行,所以最后锁反过来又限制了性能。 那么除了使用锁还有其他的方法可以提高性能吗 肯定是有的 但是之前的技术发展路线已经解释了 为什么锁的使用频率会越来越高 text 从这图可以看到 从2000年开始: CPU时钟频率就没有再增加过了(绿) 意味着...
2025-04-03
mit6.s081 lab5
不知道官网上为什么找不到lazylab 仓库中也没有lazy的分支 暂时跳过了 Copy On Writework: 复制进程的时候 共享页面而非复制 将所有页面设置为只读(标记COW情景) 修改uvmcopy函数 识别页面错误时 分配新页面 新页面可以设置PTE_W位 设计引用计数法 添加时机:fork 删除时机:删除引用的时候 RSW中记录当时是否为COW场景 RSW记录引用次数 √ 页表数据组织格式页表相关数据 在xv6中 页表并没有其他信息 是通过一个指针来进行保存的 页表条目(PTE)位按照以下结构来组织: 位范围 含义 0 PTE_V (Valid) 1 PTE_R (Read) 2 PTE_W (Write) 3 PTE_X (Execute) 4 PTE_U (User) 5 PTE_G (Global) 6 PTE_A (Accessed) 7 PTE_D...
2025-03-08
mit6.s081 lecture9
Lecture9在进入Lecture9内容前 先复盘一下xv6 Chapter中的内容 控制台输入先用使用者的角度讲起 在输入的时候我们通常是一行行进行输入 即以\n或ctrl + D进行分界 在xv6中 是通过几个板块进行读取的 首先在程序启动的时候 可以在kernel/main.c中看到consoleinit() 程序会在这个函数当中配置硬件的参数等信息(其中注册的比特率 数据结构等 都是直接写入寄存器 使硬件按照该规定生效的) 同时此处配置了consoleread()和consolerwrite()的两个方法 12345678910111213void consoleinit(void) { // 初始化锁 initlock(&cons.lock, "cons"); // 配置硬件参数 uartinit(); // connect read and write system calls // to consoleread and consolewrite. // 注册读写系统调用用到的方法 ...
2025-03-08
mit6.s081 lecture8
Lecture8在xv6中现有的实现当中,当出现了pagefault,会直接panic报错,然后杀掉对应的进程 而在实际上的操作系统当中 往往会利用这个产生一个缺页中断 来实现一个 lazy allocation的效果 本质上就是通过标志位 状态变量等方法 判断此次中断是否需要加载资源的情况 然后捕获该次异常(中断) 对资源进行加载即可 怎么进行判断呢? stval:存储出错时的虚拟地址 或访问出错的目标地址 up to具体的错误类型 scause:存储出错的原因 存储,读取异常等 sepc:存储出错时的位置 计数器 以下为scause值所对应的具体错误类型: 某个角度上就在中断的时候得到了 哪里出错 为什么出错 谁出错了 Lazy按需加载 本质上是一种设计模式 体现在懒汉式单例模式 等等乱七八糟的场景下 定义不赘述 Lazy Page Allocation本质上就是动态分配内存,默认的xv6实现的分配内存的模式是eager的,也就是在sbrk()等指令调用的时候,就立马执行对于大小的内存空间分配与缩小。 但是在实际的使用过程中 由于局部性原理等...
2025-03-08
mit6.s081 lab4
RISC-V assembly这个lab是回答一下问题并记录 此处就直接把问题分析和答案打上来了 答案通过chatGPT查验 call.asm中的g、f、main具体的代码 123456789101112131415161718192021222324252627282930313233343536373839404142int g(int x) { 0: 1141 addi sp,sp,-16 2: e422 sd s0,8(sp) 4: 0800 addi s0,sp,16 return x+3;} 6: 250d addiw a0,a0,3 8: 6422 ld s0,8(sp) a: 0141 addi sp,sp,16 c: 8082 ret000000000000000e...
2025-03-08
mit6.s081 lecture6
6和7中是陷入的代码相关的问题和页表的复盘 很多涉及的内容已经在前面的文章中描述过 这里不赘述 Lecture6Trap机制trap机制是指用户从用户空间切换到内核空间的渠道方法 而触发它的情况包括: 执行系统调用 出现除零错误 等异常 需要进行handle 设备主动触发中断 可能是在需要IO设备交互等的前提下触发 从用户空间陷入以系统调用为例,从顶层开始描述有: eg: 在user/sleep.c中调用了用户侧的sleep()方法 该方法是通过usys.pl文件生成的usys.S汇编脚本文件 提供了一个调用的汇编接口 12345.global sleepsleep: li a7, SYS_sleep ecall ret 上方就是用户侧sleep()方法的实际代码 这里调用了一个ecall指令 该指令准备好一切进入内核空间的环境: 设置当前为supervisor mode 存原程序计数器PC值到sepc寄存器当中 将程序计数器设置为控制寄存器stvec寄存器当中 同时设置scause寄存器中的值 该寄存器存储中断原因 这里存储的值是8...
公告
喜欢听歌喜欢敲代码喜欢打游戏喜欢看剧喜欢看动漫FollowMe!