review
- 内核空间与用户空间,通过页表项来标识访问这一页需要的权限。prevelige 位。物理内存本身不标识权限。指令的特权态,ring0-3寄存器,mmu会比较指令(cpu特权态。)与访问(页表项)权限。riscv模式有一种模式,当两者特权态不等,也不可以读。隔离机制。
- 硬件上的权限变更机制。中断,pc被劫持到特定地方,提升运行权限,代码被预设好,发生的行为在Os的掌控中,
- 系统调用 函数;打电话。调用者和被调用者。一系列约定。有大量安全检查操作,比普通的函数调用更慢。不相信调用者。
- 进程间通信。内核空间相同。
- 共享内存。 b+树根节点。一块物理内存,多个虚拟地址,cache 虚拟地址索引 physical tag 访问.虚拟地址发在tlb,返回pt。一系列复杂的操作。。。
- 线程在游戏开发中出现的概念。每个npc独立的时间循环。每个npc是一个线程。
- 用户态线程→内核态线程
- 内核态线程上下文切换:权限 内核陷入 +寄存器
- 协程纤程 不作系统调用 高速切换
IPC
concept about mutual exclusion
- 临界区,critical section

临界区的访问原则
- 空闲则入 没有进程在临界区时,任何进程可进入
- 忙则等待 有进程在临界区时,其他进程均不能进入临界区
- 有限等待 等待进入临界区的进程不能无限期等待
- 让权等带 不能进入临界区的进程,应释放CPU(如转换到阻塞状态)
关中断
- 不想发生调度 打断代码的执行 时间片轮转。
解决方法
lock variable
难以控制的上下文切换
strict alternation 轮转
交替
没有人使用的peterson算法。。。
tsl test and set lock
一条指令完成两个操作。打断不了 被进程的调度。原子指令。要么执行成功 要么失败。。
锁
争抢和读取value值
忙等待
阻塞状态。
sleep-wake up
前提:单核处理器.没有锁 睡觉 到你了 醒来。没有争抢。 也是不能打断 检测与执行。
qpi 总线? numa结构 现代处理器连接
test and set 接的是内存地址,内存在?最好离cpu近的物理内存cpu所管理的,非对称内存,non unified memory adress space。 value所在的内存和线程所在cpu在同一个区域里。如何做到?线程调度,内存分布。 QuickPath Interconect
欧拉操作系统
Semaphore 信号量
- Probern down Verhogen up 操作 资源数量
- dijkstra 荷兰
- 车站的例子 可用资源
共享打印机 打印队列,标识最后一个可用文件的位置。不是没有了上下文切换,而是会进入到阻塞状态。
互斥/竞争 risk condition
使用信号量实现条件同步
三个进程 挖坑 种树 填土 待查 苏联冷笑话 同步:顺序;坑挖好后 ,树放进去。
互斥与同步问题。
典型问题
生产者 -消费者问题
仓库 商品
缓冲区 仓库
n个空位 0个商品;放东西 取东西 ???
同步先后 调用不同pv
变换顺序。两者都休眠了。
面向对象的思路:管程 封装信号量
wait() signal() p() v() 不同的是 等待过程中可以释放锁,让其他线程可以执行,这里wait的作用:释放传入的lock锁,并释放CPU(运行权),直到获得下一次调度机会后,并重新获取lock锁后才返回。在调用者看来,wait的执行期并不长(因为发生了调度),并且没有占据锁。使用接口更加友好。
- hansen 管道与hoare管道:一般使用hansen管道,上下文切换更少

dining philosophers
筷子 共享资源 互斥
reader-writer
读者不会对数据产生影响(修改),与消费者生产者区别。
第一个读者 最后一个读者 rcount全局变量 作互斥 读者连续可读