スピンロック
#Fleeting_Notes
スピンロック(spin lock)
ロックが解放されるまで何もしない繰り返し処理(while, for loop)をするロック処理の手法
何もしないループのことを指してスピンと呼ばれている
ビジーウェイトの方がより広い概念で、前提条件が満たされるまで何もしないループを繰り返すこと
stdatomic.hの関数を使った例
code:c
// ロックの獲得: フラグが0になるまでスピン
void spinlock_acquire(atomic_flag *flag) {
// スピンロックの取得
// _Bool atomic_flag_test_and_set(volatile atomic_flag *);
while (atomic_flag_test_and_set(flag))
; /* spin */
}
// ロックの解放: フラグを0に戻す
void spinlock_release(atomic_flag *flag)
{
// void atomic_flag_clear(volatile atomic_flag *);
atomic_flag_clear(flag);
}
code:c
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <unistd.h>
typedef struct {
atomic_flag flag; /**< スピンロック用フラグ */
long counter; /**< 共有カウンタ */
} shared_t;
#define NUM_PROC 4
int main(void)
{
/*
* void *mmap(void *addr, size_t length, int prot, int flags,
* int fd, off_t offset);
* mmap 引数の説明:
* NULL : アドレスはカーネルに任せる
* sizeof(shared_t) : マップするバイト数
* PROT_READ | PROT_WRITE:
* - PROT_READ : PROT は PROTection(保護) の略。読み取りを許可
* - PROT_WRITE : 書き込みを許可。違反すると SIGSEGV が発生する
* MAP_SHARED | MAP_ANONYMOUS:
* - MAP_SHARED : fork した子プロセスと同じ物理ページを共有する
* (MAP_PRIVATE だと書き込み時にページがコピーされ共有されない)
* - MAP_ANONYMOUS : ファイルと紐付けない匿名マッピング。fd は -1 を渡す
* -1 : MAP_ANONYMOUS 使用時はファイルディスクリプタ不要なので -1
* 0 : MAP_ANONYMOUS 使用時はオフセット不要なので 0
*/
shared_t *sh = mmap(NULL, sizeof(shared_t),
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (sh == MAP_FAILED) {
perror("mmap");
return EXIT_FAILURE;
}
atomic_flag_clear(&sh->flag);
sh->counter = 0;
int iterations = 100000;
for (int j = 0; j < iterations; j++) {
spinlock_acquire(&sh->flag);
sh->counter++;
spinlock_release(&sh->flag);
}
/* 全子プロセスの終了を待機 */
for (int i = 0; i < NUM_PROC; i++) {
wait(NULL);
}
printf("Expected: %d, Got: %ld\n", NUM_PROC * iterations, sh->counter);
munmap(sh, sizeof(shared_t));
return EXIT_SUCCESS;
}
pthread_spin
qspinlock
確認用
Q. スピンロック
関連
pthread
メモ
/mrsekut-p/スピンロック
Spinlocks - Part 7 | CoffeeBeforeArch.github.io
CoffeeBeforeArch/spinlocks: Example implementations of spinlocks
調査用
Google.icon スピンロック(日)
Google.icon Spin lock(英)
Wikipedia.icon
スピンロック - Wikipedia(日)
スピンロック(検索) - Wikipedia(日)
Wikipedia.icon
Spin lock - Wikipedia(英)
Spin lock(検索) - Wikipedia(英)