排他制御
あるリソースに同時に1つの処理しかアクセスできなくする排他制御という仕組みがあります。
気づき
データベースの共有ロックや専有ロックとかあったな。
排他制御の大切さを知る
root@**********:***********# cat count
0
root@**********:***********# ./inc.sh
root@**********:***********# cat count
1
root@**********:***********# echo 0 > count
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc.sh ; done
root@**********:***********# cat count
1000
root@**********:***********# echo 0 > count
root@**********:***********# cat count
0
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc.sh & done ; wait
...
[993] 終了 ./inc.sh
root@**********:***********# cat count
407
クリティカルセクション
同時に実行されると困る一連の処理
のこと
アトミック処理
システムの外から見て一つの処理に見える一連の処理
のこと
気づき
クリティカルセッションがアトミック処理になっていると排他処理になって同時に一つしか実行できなくなるのか。
flock()システムコール
flock()やfcntl()といったシステムコールを使って、あるファイルについてロック/アンロックという状態を変更
します。
気づき
flock()システムコールなどを使ってシステムロックをアトミック処理にすることで排他制御を実現しているのか。
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc-wrong-lock.sh & done; for((i=0;i<1000;i++)); do wait; done
root@**********:***********# cat count
571
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc-lock.sh & done; for((i=0;i<1000;i++)); do wait; done
root@**********:***********# cat count
1000
気づき
どこをアトミック処理にするかが肝心だな
出典
感想
特に難しく感じなかったところがまだわかっていないと思う。