關於驅動中的併發

2021-07-03 02:52:16 字數 2038 閱讀 8149

核心程式設計中,我們不能使用使用者態的c庫函式的printf()函式輸出資訊,而只能使用printk();

每個printk都 有個優先順序,核心一共有8個優先順序,預設default_message_loglevel,如果優先順序數字比int console_loglevel變數小的話,訊息就會列印到控制台上,

如果syslogd和klogd守護程序執行的話,則不管是否向控制台輸出,訊息都會被追加進/var/log/messages檔案,klogd只處理核心訊息,syslogd處理其他系統訊息,比如應用程式;

模組引數,2.4核心下,include/linux/module.h中定義的巨集module_parm(var,type),用於向模組傳遞命令列引數,var為接受引數值的變數名,type為字串;

程序驅動中的併發控制

當多個執行緒同時訪問相同的資源時(驅動程式中的全域性變數是一種典型的共享資源,可能會引發競態,因此我們必須對共享資源進行併發控制;最常用的解決併發控制的方法是自旋鎖和訊號量;

與訊號量有關的api:

定義訊號量: struct semaphore sem;

初始化訊號量 void sema_init(struct semaphore *sem,int val); //初始化訊號量,並設定訊號量sem的值為val;

初始化互斥鎖void init_mutex(struct semaphore *sem);//這個函式用來初始化乙個互斥鎖,但它把訊號量sem的值設定為1,等同於sema_init(struct semaphore *sem,1)

初始化互斥鎖:void init_mutex_locked(struct semaphore *sem);//該函式也用於初始化乙個互斥鎖,但它把訊號量sem的值設定為0,等同於sema_init(struct semaphore *sem,0);

獲得訊號量:void down(struct semaphore * sem);//該函式用於獲得訊號量sem,它會導致睡眠,因此不能在中斷上下文長期使用

int down_interruptible(struct semaphore *sem);//該函式功能與down類似,不同之處為down不能被訊號打斷,但 down_interruptible能被訊號打斷;

int down_trylock(struct semaphore *sem);//該函式嘗試獲得訊號量sem,如果能夠立刻獲得,它就獲得該訊號量並返回0,否則,返回非0值,它不會導致呼叫者睡眠,可以在中斷上下文使用;

釋放訊號量 void up(struct semaphore *sem);//該函式釋放訊號量sem,喚醒等待者

與自旋鎖有關的api主要有:

定義自旋鎖:spinlock_t spin;

初始化自旋鎖:spin_lock_init(lock); //該巨集用於動態初始化自旋鎖lock

獲得自旋鎖:spin_lock(lock);//該巨集用於獲得自旋鎖lock,如果能夠立即獲得自旋鎖,它馬上返回,否則,它將自旋在那裡,直到該自旋鎖的持有者釋放

spin_trylock(lock);//該巨集嘗試獲得自旋鎖lock,如果能立即獲得鎖,它獲得並返回真,否則立即返回假,實際上,可以不再原地打轉了

釋放自旋鎖:spin_unlock(lock);//該巨集釋放自旋鎖lock,它與spin_trylock或spin_lock配對使用

int register_chrdev(unsigned int major,const char * name,struct file_operations *fops);//註冊字元裝置,如果major!=0表示系統靜態分配註冊裝置號,=0表示動態分配註冊裝置號,major:主裝置號,name為裝置名,fops表示包含基本函式入口的裝置結構體

如何實現阻塞操作;

在執行裝置操作時,若不能獲取資源,則程序掛起直到滿足可操作的條件再進行操作,非阻塞操作的程序在不能進行裝置操作時,並不掛起。

被掛起的程序進入sleep狀態,被從排程器的執行佇列移走,直到等待的程序被滿足;

我們可以通過等待佇列(wait queue)來實現阻塞操作,它以隊列為基礎資料結構,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制,

等待佇列可以用來同步對系統資源的訪問,

裝置驅動中的併發控制 (2)

訊號量也是一種保護臨界資源的一種方法。訊號量與自旋鎖的使用方法基本一樣。與與自旋鎖不同的是,當獲取不到訊號量時,程序不會原地打轉而是進入休眠等待狀態。在linux中,訊號量的定義如下 struct semaphore成員變數 1.lock自旋鎖 對count變數起保護作用 2.count變數 是訊號...

Linux 裝置驅動中的併發控制

是指作業系統中,乙個時間段中有幾個程式都處於啟動執行到執行完畢間,且這幾個程式都是同乙個處理器上執行,但任何乙個時間點只有乙個程式在處理機器上執行。併發容易導致競爭問題。是兩個或者多個程序同時訪問乙個資源,從而引起的資源錯誤。所謂的原子操作就是該作業系統不會在執行完畢前被任何其他任務或者事件打斷。也...

關於效能測試中的併發

不少負載工具在實際的意義中也可以進行壓力測試的分析。其中經常談到併發及集合點的概念。集合點是為了大資料量的指令碼,設定1個集合點,利於指令碼分批量執行,也近似模擬乙個較真實的場景。併發目的引入併發是為了提高資源利用率,從而提高系統效率。併發是1個會受作業系統所影響,是指在單位一定時間內的執行內 物理...