定義:
最多只能被乙個可執行執行緒持有。如果乙個執行執行緒試圖獲得乙個被爭用的自旋鎖,那麼該執行緒就會一直進行忙迴圈----旋轉----等待鎖重新可用。
自旋鎖有「加鎖」和「解鎖」兩種狀態。「加鎖」一直在尋求「解鎖」,「解鎖」馬上會尋求「加鎖」,並原地打轉,所以加鎖位置的**進入臨界區執行,直到解鎖。
注意:1.占用臨界區的時間必須短;
2.擁有自旋鎖期間所在的cpu程序搶占被關閉
3.占有自旋鎖期間不能呼叫引起阻塞的函式(原子上下文)比如:copy_from_user(), kmalloc(), msleep()
4.自旋鎖可以被用於中斷上下文
特殊化自旋鎖:讀寫自旋鎖,順序鎖,rcu鎖
用例:
#include spinlock_t lock; //定義自旋鎖
spin_lock_init(&lock); //初始化自旋鎖
spin_lock(&lock); // 獲取自旋鎖
...臨界區...
spin_unlock(&lock)
驅動程式**:
#include #include #include #include #include #include #include #include #include #include #include #include #include /*s5pv210_gph3_base*/
#define eint_device_id 1
#define driver_name "key_eint_race"
#define err(msg) printk(kern_err "%s: " msg "\n", driver_name)
#define __debug(fmt, arg...) printk(kern_debug fmt, ##arg)
#define gph3con (unsigned long)(s5pv210_gph3_base+ 0x00)
#define gph3dat (unsigned long)(s5pv210_gph3_base + 0x04)
#define gph2up (unsigned long)(s5pv210_gph2_base + 0x08)
static int major = 0; /* driver major number */
static int minor = 0; /* driver minor number */
struct class *key_class;
static struct device *key_device;
static unsigned int key;
static spinlock_t my_spin_lock; //
static unsigned int deal_key_value(unsigned int data)
static unsigned int deal_key_value_excl(unsigned int data)
irqreturn_t buttons_interrupt(int irq, void *dev_id)
static void key_io_port_init(void)
static ssize_t key_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
/* driver operation structure */
static struct file_operations key_fops = ;
static int __init key_eint_init(void)
retval = request_irq(irq_eint(20), buttons_interrupt, irqf_disabled,
"key1", (void *)eint_device_id);
if(retval)
/* driver register */
major = register_chrdev(major, driver_name, &key_fops);
if(major < 0)
key_class=class_create(this_module,driver_name);
if(is_err(key_class))
key_device=device_create(key_class,null, mkdev(major, minor), null,driver_name);
if(is_err(key_device))
__debug("register mydriver ok! major = %d\n", major);
return 0;
error_device:
class_destroy(key_class);
error_class:
unregister_chrdev(major, driver_name);
error_register:
free_irq(irq_eint(20), (void *)eint_device_id);
error:
return retval;}
static void __exit key_eint_exit(void)
module_init(key_eint_init);
module_exit(key_eint_exit);
module_license("gpl");
module_author("eric");
應用程式**:
#include #include #include #include #include /*linux核心是搶占式核心,在乙個系統呼叫未結束前,另乙個系統呼叫也可以進入程序上下文,訪問同一緩衝區*/
int main(void)
//建立子程序
if((pid = fork()) < 0)
else if(pid == 0)
close(fd_driver);
}else
pid = wait(&status);
close(fd_driver);
}}
核心同步機制之自旋鎖 讀 寫鎖
自旋鎖 spin lock 是用來在多處理器環境中工作的一種特殊的鎖。如果核心控制路徑發現自旋鎖 開著 就獲取鎖並繼續自己的執行。相反,如果核心控制路徑發現由執行在另乙個cpu上的核心控制路徑 鎖著 就在一直迴圈等待,反覆執行一條緊湊的迴圈指令,直到鎖被釋放。自旋鎖與互斥鎖有點類似,只是自旋鎖不會引...
Linux 同步機制 讀寫鎖
讀寫鎖也叫 shared exclusive 鎖,也是一種同步機制。讀寫鎖有三種狀態 讀模式下加鎖,寫模式下加鎖,不加鎖。有如下的使用約定 讀模式共享,寫模式獨佔,適合讀頻率遠大於寫頻率的場景。這些api位於 pthread.h 下。initialize read write lock rwlock...
核心同步機制
1.通過鎖機制來實現同步,有兩種不同的鎖,一種是鎖被持有時選擇忙等,一種是選擇睡眠等待。2.如何避免死鎖 a.按順序加鎖 b.不要重複加鎖 3.自旋鎖 spin lock 忙等鎖,樂觀 適合持有時間非常短,這是因為要考慮程序上下文切換的開銷。4.訊號量 檢視獲取乙個鎖時候,如果不可用則進入睡眠佇列 ...