例項篇:1.定義帶有裝置併發控制方案的結構體(諸如訊號量,自旋鎖等,反正前邊那麼多了)
我是一名高手,告訴大家乙個高手的習慣,就是喜歡也習慣把將某裝置所使用的自旋鎖,訊號量等輔助手段也放到裝置結構體中,就像下邊這樣:
struct csyncontrol_dev
然後,將訊號量的初始化工作放到模組初始化部分裡
int csycontrol_init(void)
以後在訪問csyncontrol_dev中的共享資源時,需要首先獲取這個訊號量,訪問完成後,隨即釋放掉這個訊號量,比如下面的,寫操作:
//csycontrol_read函式static ssize_t csycontrol_read(struct file *filp,char __user *buf, size_t size, loff_t *ppos)
if (copy_to_user(buf,(void *)(dev->mem + p),count))else
up(&dev->sem); //釋放訊號量
return ret;}//csycontrol_write
static ssize_t csycontrol_write(struct file *filp, const
char __user *buf,size_t size, loff_t *ppos)
if (copy_from_user(dev->mem + p,buf, count))ret = -efault;
else
up(&dev->sem); //釋放訊號量
return ret;}
//csycontrol_ioctl函式static
int csycontrol_ioctl(struct inode *inodep, struct file *filp,unsigned
int cmd, unsigned
long arg)
memset(dev->mem, 0,globalmem_size);
up(&dev->sem); //釋放訊號量printk(kern_info "globalmem is set to zero\n");
break;
default:
return - einval;//其他不支援的命令
} return 0;
}
**部分也講完了,說句真的,心裡真是不平衡,前邊講了那麼多,這裡體現的時候它怎麼就只有那兩行**呢..
各種同步機制的比較 型別
機制應用場合
spinlock
使用忙等方法,程序不掛起
(1)用於多處理器間共享資料
(2)在可搶占的核心執行緒裡共享資料
(3)自旋鎖適合於保持時間非常短的情況,它可以在任何上下文使用,比如中斷上下文
訊號量阻塞式等待,程序掛起
(1)適合於共享區保持時間教長的情況
(2)只能用於程序上下文
原子操作
資料的原子訪問
(1)共享簡單的資料型別:整型,比特性
(2)適合高效率的場合
rwlock
特殊的自旋鎖
(1)允許同時讀共享資源,但只能有乙個寫
(2)讀優先於寫,讀寫不能同時
順序鎖一種免鎖機制,基於訪問計數
(1)允許同時讀共享資源,但只能有乙個寫
(2)寫優先於讀,讀寫不能同時
rcu通過副本的免鎖訪問
(1)對讀佔主要的場合提供高效能
(2)讀訪問不必獲取鎖,不必執行原子操作或禁止中斷
關閉中斷
通過禁止中斷的手段,排除單處理器上的併發,會導致中斷延遲
(1)中斷與正常程序共享資料
(2)多個中斷共享資料
(3)臨界區一般很短
linux併發控制
一.概念 1.併發 concurrency 指多個執行單元同時,並行被執行。2.併發的執行單元對共享資源,比如說,硬體資源,全域性變數,靜態變數等 訪問很容易導致競態 race conditions 舉個簡單事例,古代皇帝有很多妃子,皇帝第乙個時辰是宜妃的,第二個時辰是萱妃,最後時間是皇后的,這是原...
Linux併發控制
目錄 併發和競態 編譯亂序和執行亂序 中斷遮蔽 原子操作 位原子操作 自旋鎖訊號量 互斥體完成量 1.併發是多個執行單元同時並行的執行。2.競態是指併發操作對共享資源的訪問。競態的發生情況如下 1.對稱多處理器 smp 的多個cpu的程序 中斷之間的併發為核間併發。2.單個cpu內的多個程序併發訪問...
linux 併發控制總結
atomic t atomic t atom atomic init 1 atomic dec and test atom atomic inc atom spin lock t spinlock t lock spin lock init lock define spinlock lock spi...