【南京大学jyy操作系统(蒋炎岩)】(四)并发控制: 同步 | 真实世界的并发编程


前言

学习链接 : 链接点击跳转
在这里插入图片描述

同步

什么是同步??

  • 例子
    在这里插入图片描述
    在这里插入图片描述

生产者-消费者模式

在这里插入图片描述
在这里插入图片描述

  • 测试代码的正确性
    在这里插入图片描述

条件变量

分析

在这里插入图片描述

  • pc.c 中的自旋变成睡眠
  • 测试不通过
    在这里插入图片描述
    • 尝试在完成操作时唤醒
      在这里插入图片描述

条件变量

API

在这里插入图片描述

条件变量:实现生产者-消费者


在这里插入图片描述
在这里插入图片描述

  • 解决方案 ; 设置俩个不同类型的 条件变量
  • 多一点线程
    在这里插入图片描述

在这里插入图片描述

  • 10
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

信号量

复习:互斥锁和更衣室管理

操作系统 = 更衣室管理员
先到的人 (线程)
成功获得手环,进入游泳馆
*lk = 🔒,系统调用直接返回
后到的人 (线程)
不能进入游泳馆,排队等待
线程放入等待队列,执行线程切换 (yield)
洗完澡出来的人 (线程)
交还手环给管理员;管理员把手环再交给排队的人
如果等待队列不空,从等待队列中取出一个线程允许执行
如果等待队列为空,*lk = ✅
管理员 (OS) 使用自旋锁确保自己处理手环的过程是原子的

  • 更衣室管理
    完全没有必要限制手环的数量——让更多同学可以进入更衣室
    管理员可以持有任意数量的手环 (更衣室容量上限)
    先进入更衣室的同学先得到
    手环用完后才需要等同学出来

  • “手环” = “令牌” = “一个资源” = “信号量” (semaphore)

  • pc-sem.c
    在这里插入图片描述

在这里插入图片描述

哲学家吃饭问题

在这里插入图片描述

在这里插入图片描述

初始的时候 每个哲学家只有一把叉子
在这里插入图片描述
在这里插入图片描述
因为每人都只拿左手的叉子 , 导致

在这里插入图片描述

总结

在这里插入图片描述

真实世界的并发编程

在这里插入图片描述

高性能计算中的并发编程

在这里插入图片描述

  • 超级计算(目前) : 把同多个步操作 分给多个cpu 然后汇总起来 (eg 。 拓扑结构 计算二维dp)
  • 超级计算机 : 分哪些机器 , 再想机器上有哪些进程 最后线程是如何通信的
  • MPI接口 同步的库: 多节点程序 如何保证多节点发消息通信同步
    在这里插入图片描述

数据中心里的并发编程

  • 特点
    在这里插入图片描述

在这里插入图片描述

  • 在俩个数据中间是有延迟的 ,CAP是不可能同时三个都做到的
    在这里插入图片描述
    在这里插入图片描述
  • such 1 second 完成 1w的请求??
  • . QPS:全名 Queries Per Second,意思是“每秒查询率”
  • tail latency 尾延迟
    在这里插入图片描述
  • 实现切换 存在代价
    在这里插入图片描述

在这里插入图片描述

go

在这里插入图片描述

  • go的 canal 相对于队列 (也可以实现容量)
  • go : 不用和c 一样去约束 ,实现 xx并发协议 (贴纸 。。) , 直接做就就可以 (PC 模式) 解决高并发 IO的问题

我们身边的并发编程

并发 Bug 和应对

总结

目录 I 基础知识9 1 MINIX操作系统简介11 1.1 MINIX与UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2 探索MINIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 编辑器:vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 编译器:CC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 Intel 8086体系结构19 2.1 8086 CPU结构. . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2 运算器与指令部件. . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 寄存器组. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 主存. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5 堆栈. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.6 系统启动. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.7 二进制文件结构. . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 ACK 8086汇编语言27 3.1 寻址. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 数据移动指令. . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3 常量、标号、数据与全局变量. . . . . . . . . . . . . . . . . . 29 3.4 运算指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5 标志位操纵指令. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.6 串操作指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.7 跳转、分支与循环. . . . . . . . . . . . . . . . . . . . . . . . 33 3.8 堆栈与子程序. . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5 6 目录 4 实习:Hello World 37 4.1 Hello World程序. . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 II 汇编语言进阶41 5 C与汇编联合开发43 5.1 函数调用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2 全局与局部变量. . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3 编译与连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6 中断与I/O 49 6.1 中断. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 输入输出设备. . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.3 编写中断处理程序. . . . . . . . . . . . . . . . . . . . . . . . 51 6.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7 实习:小游戏55 7.1 make工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 III 操作系统内核59 8 进程切换61 8.1 进程模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 8.2 进程的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 8.3 进程切换. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 8.4 中断嵌套. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.5 MiniOS中的进程切换. . . . . . . . . . . . . . . . . . . . . . . 68 8.6 操作系统实现原则. . . . . . . . . . . . . . . . . . . . . . . . 69 9 进程通信71 9.1 信号量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 9.2 消息机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 9.3 消息机制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . 76 9.4 调试消息内核. . . . . . . . . . . . . . . . . . . . . . . . . . . 78 目录7 10 实习:操作系统内核83 10.1 引导操作系统. . . . . . . . . . . . . . . . . . . . . . . . . . . 83 10.2 微内核与层次式操作系统结构. . . . . . . . . . . . . . . . . . 83 10.3 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 IV 轻量操作系统实现87 11 设备驱动程序89 11.1 设备驱动程序原理. . . . . . . . . . . . . . . . . . . . . . . . 89 11.2 键盘设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.3 屏幕设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 11.4 死锁的产生与预防. . . . . . . . . . . . . . . . . . . . . . . . 93 12 存储管理95 12.1 存储管理与系统调用服务进程. . . . . . . . . . . . . . . . . . 95 12.2 进程映像的创建与终止. . . . . . . . . . . . . . . . . . . . . . 97 12.3 替换进程映像. . . . . . . . . . . . . . . . . . . . . . . . . . . 98 13 文件系统101 13.1 文件与目录. . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 13.2 文件与目录管理. . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3 文件描述符. . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 14 实习:迷你操作系统109 14.1 一个简易的Shell . . . . . . . . . . . . . . . . . . . . . . . . . . 109 14.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 附录111 A vi常用命令113 B 虚拟机与外部的文件交换117
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CPT1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值