Text
暱稱: Hohshen
目前擔任: 肝苦碼農
By Hohshen
1. 那樣的夜色太美你太溫柔-都是xx惹的禍
2. 命中注定鎖定你-共享資源
3. 解鎖還需上鎖人-鎖的方式
4. 綑綁與羈絆-分散的鎖
5. 多共享變數
等
隱藏黑暗力量的鑰匙啊,
在我面前顯示真正的力量吧!
跟擬定下約定的BESG命令你,封印解除!
這是一個解鎖匠的故事, 在很久很久以前......
輸入完磁帶,才開始跑, 每run一次就要重新把磁帶在讀入
資料和程式可以在運行之中透過I/O輸入,
每次的執行,都會包裝成一個job,
cpu會一個一個job的處理
開始有process和schedule的概念,
基本上每個process執行中不會做切換,
但是當process正在等待i/o時,可以先把cpu使用權交給其他process
為了解決有其中一個process跑得特別久
有time Interrupt了,不管正在執行的process執行到哪裡了
該如何在容易被中途插入的過程中,
順利的完成理想的結果呢?
這是一個青澀的愛情的故事...
Text
介紹共享變數的互斥性
process
process
process
Text
但因多個process間共享資源,執行過程中有需多不確定性,也難以重現,錯誤也可能間歇性的發生
多個process同時併發,有需多好處
1. 共享資源: e.g.帳戶餘額可以在多台atm上做操作
2. 分工加速: e.g. 把功能切成數塊,分工運作
3. 模組化: e.g. 大程式切成小程式
getter=getter+1
LOAD mem reg1
STORE reg1 getter
INC reg1
STORE reg1 mem買麵包問題
if(no_bread){
if(no_note){
leave_note
buy_bread
remove_note
}
}leave_note
if(no_bread){
if(no_note){
buy_bread
}
}
remove_notetry3
A一直檢查是否有便利貼,沒有貼就馬上去買,
B先貼便利貼,在確認冰箱有沒有麵包,並且在便利貼上寫名字
//A
leave_note_A
while(no_note_B){}
if(no_bread){
buy_bread
}
remove_note_A//B
leave_note_B
if(no_note_A){
if(no_bread){
buy_bread
}
}
remove_note_B// 以下是A的code,B記得換成對方的變數
do{
note_A=true
turn=P_B //表示自己可以去,不過對方想去可以先給對方=>增加公平性
while(note_B===true&&turn=P_B){} //忙等待,對方想去,且對方真的有權要去
//c.s. start
buy_bread
//c.s. end
note_A=false
}while(true)環形演算法,類似Peterson的衍生
1. 成功就全部完成
2. 失敗就全部退回
3. 不會有部份成功發生
在訪問c.s.時,必須是互斥的,當有人在裡面時,其他人不可以進來
1. 空閒則入 2. 忙則阻塞等待
3. 有限阻塞 4. 讓權阻塞(option)
boolean TestAndSet(boolean * target){
boolean rv= *target
*target=true
return rv
}class Lock{
boolean value=0;
acquire(){
while(TestAndSet(value)){};//忙等待
}
release(){
value=0
}
}三個成員
sem:共享變數
P(): if(sem>0){ sem-- }else{ waitQueue.enqueue(threadA)}
V(): if(sem<=0){ sem++; waitQueue.dequeue(); }
使用點:
1. c.s.
2. 條件等待
class BoundBuf{
const mutex=Semphore(1)
const fullBuf=Semphore(0)
const eptBuf=Semphore(n)
const q=queue()
public productor(c){
eptBuf.P()
mutex.P()
q.enqueue(c)
mutex.V()
fullBuf.V()
}
public consumer(){
fullBuf.P()
mutex.P()
q.dequeue(c)
mutex.V()
eptBuf.V()
}
}一個鎖,n個條件,兩個操作
class BoundBuf{
const entryLock=lock()
const count=0
const notFull=Condition()
const notEmpt=Condition()
const q=queue()
public productor(c){
entryLock.acquire()
//滿時不能進
while(count==n){
notFull.wait(&entryLock)
}
q.enqueue(c)
count++
//告知非空
notEmpt.signal()
entryLock.release()
}
public consumer(){
entryLock.acquire()
//空時不能進
while(count==0){
notEmpt.wait(&entryLock)
}
q.dequeue(c)
count--
//告知非滿
notFull.signal()
entryLock.release()
}
}其實還是同一台
介紹共享變數在多個地方性
這是一個有關於影分身之術的故事...
process
process
process
等
R/W split
Sentinel(R/W split)
Cluster
進入點都是一樣在master上的
成功條件:只要過半 N/2+1
根本沒有一個叢集長這樣阿QAQ
RedLock 方法就是根除普通基於 Redis 分佈式鎖而生的(無論是主從模式、sentinel 模式還是 cluster 模式)
我們假設有 N 個 Redis Master。 這些節點完全互相獨立, 不存在主從複製或者其他集羣協調機制(重點!!
DEMO: