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全局变量 作互斥 读者连续可读

沉睡的理发师