Skip to content

Commit

Permalink
complete update logic
Browse files Browse the repository at this point in the history
  • Loading branch information
AstatineAi committed Mar 5, 2024
1 parent 5cc92c5 commit 3e3d6f7
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lecture_note/docs/lec0.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

64 位系统.

WLS 提示无法安装请参考 https://learn.microsoft.com/zh-cn/windows/wsl/troubleshooting#installation-issues.
WSL 提示无法安装请参考 https://learn.microsoft.com/zh-cn/windows/wsl/troubleshooting#installation-issues.

## 其他可能 (显然) 更优的教程

Expand Down
3 changes: 3 additions & 0 deletions lecture_note/docs/lec3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Lec 3: Process

##
30 changes: 29 additions & 1 deletion lecture_note/docs/pintos/proj1.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ alarm-negative

### priority-preempt

高优先级线程 `thread_create()` 时可以抢占.
高优先级线程就绪 (`thread_create()` / `thread_unblock()`) 时, 抢占.

### priority-sema

Expand Down Expand Up @@ -171,6 +171,34 @@ lock_acquire (struct lock *lock)
等待锁 = donate 给别的 thread
thread -> lock:
- donate 发生的时间: acquire 失败, 被 block 之前 donate 给锁
- donate 结束的时间: 由 semaphore unblock, 获得锁
lock -> thread:
- donate 发生的时间: acquire 失败, 接受别的 donate 之后 donate 给 holder
- donate 结束的时间: release, 原 holder 可以接受其他锁的 donation
#### 如何更新 `priority`?
无死锁的 donation 的关系构成一个内向树: 所有的线程最多等待一个锁, 对那个锁 donate, 一个线程可以同时持有多个锁, 从多个锁获得 donation.
`lock_release()` 只发生在根节点, 此时会得到一个新的根节点, 那个节点不需要更新, 更新老的根节点.
`lock_acquire()` 是加边, 需要向父亲贡献, 直到达到根节点.
`thread_set_priority()` 只发生在根节点, 无影响.
两个更新的方向:
1. thread->lock_waiting (--捐赠给->) lock->holder (--捐赠给->) thread->lock_waiting (--捐赠给->) ...
2. thread->locks_holding_list (--获取捐赠->) lock->semaphor->waiters (--获取捐赠->) thread->locks_holding_list (--获取捐赠->)...
一个重要的行为是: 捐赠优先级 (即等待锁) 的 thread, 在得到锁之前, 这个 thread 的 priority 可能改变.
- 不会 `thread_set_priority`
- 可能从别处得到新的 donation, 如 TA 拿着锁 A 等待锁 B, TB 拿着锁 B, 此时 TC 请求锁 A, TB 的优先级因此受到 TC 捐赠.
#### `thread_set_priority()`
更新非捐赠所得的优先级 `priority_original`
Expand Down

0 comments on commit 3e3d6f7

Please sign in to comment.