Linux通訊之同步阻塞模式

2022-05-21 10:40:40 字數 1146 閱讀 8211

【參考】韋東山 教學筆記

1. 原子操作

原子操作指的是在執行過程中不會被別的**路徑所中斷的操作。

常用原子操作函式舉例:

atomic_t v = atomic_init(0); //定義原子變數v並初始化為0

atomic_read(atomic_t *v); //返回原子變數的值

void atomic_inc(atomic_t *v); //原子變數增加1

void atomic_dec(atomic_t *v); //原子變數減少1

int atomic_dec_and_test(atomic_t *v); //自減操作後測試其是否為0,為0則返回true,否則返回false。

2. 訊號量

訊號量(semaphore)是用於保護臨界區的一種常用方法,只有得到訊號量的程序才能執行臨界區**。

當獲取不到訊號量時,程序進入休眠等待狀態。

定義訊號量

struct semaphore sem;

初始化訊號量

void sema_init (struct semaphore *sem, int val);

void init_mutex(struct semaphore *sem);//初始化為0

static declare_mutex(button_lock); //定義互斥鎖

獲得訊號量

void down(struct semaphore * sem);

int down_interruptible(struct semaphore * sem);

int down_trylock(struct semaphore * sem);

釋放訊號量

void up(struct semaphore * sem);

3. 阻塞

阻塞操作

是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。

被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。

非阻塞操作

程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。

fd = open("...", o_rdwr | o_nonblock);

IO之同步 非同步 阻塞 非阻塞

stevens在文章中一共比較了五種io model blocking io nonblocking io io multiplexing signal driven io asynchronous io 由於signal driven io在實際中並不常用,所以我這只提及剩下的四種io model...

6410之同步互斥阻塞

同步互斥 目的 在同一時間只有乙個應用程式開啟裝置節點 dev buttons。linux是乙個多工系統,在讀寫同乙個節點的時候,可能會有多個應用程式。這就需要進行同步操作,保證應用程式的完整執行。方法1 在linux中使用原子操作 1.原子操作 原子操作指的是在執行過程中不會被別的 路徑所中斷的操...

NIO基礎之同步 非同步 阻塞 非阻塞

這裡區分幾個概念,也是常見但是容易混淆的概念,就是標題中的同步 非同步 阻塞 非阻塞。同步與非同步,關心的是訊息通訊的機制。也就是呼叫者和被呼叫者之間,訊息是如何進行通知的。如果是呼叫者主動等待呼叫的結果,那麼就是同步。如果是被呼叫者主動去通知呼叫者,就是非同步。從上面的描述中,我們可以看到。同步還...