linux核心同步機制之自旋鎖

2021-09-13 15:33:43 字數 3294 閱讀 1360

定義:

最多只能被乙個可執行執行緒持有。如果乙個執行執行緒試圖獲得乙個被爭用的自旋鎖,那麼該執行緒就會一直進行忙迴圈----旋轉----等待鎖重新可用。

自旋鎖有「加鎖」和「解鎖」兩種狀態。「加鎖」一直在尋求「解鎖」,「解鎖」馬上會尋求「加鎖」,並原地打轉,所以加鎖位置的**進入臨界區執行,直到解鎖。

注意: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.訊號量 檢視獲取乙個鎖時候,如果不可用則進入睡眠佇列 ...