今天和兩位群友討論了很長一段自旋鎖的使用方法,記錄下來,以后參考:
北京-司令(117838621) 19:50:25
大家好,有誰理解自旋鎖。。。?
北京-司令(117838621) 19:51:02
我是否可以再open里面加鎖,release里面解鎖呀..?
鍵指江山(1791120766) 19:51:17
不行!
北京-司令(117838621) 19:51:21
?
鍵指江山(1791120766) 19:51:40
自旋鎖只允許短時間鎖定
北京-司令(117838621) 19:51:46
為什么,這樣不就是只允許app一個進程可以打開這個設備
鍵指江山(1791120766) 19:51:49
這樣的話你應該用信號量
北京-司令(117838621) 19:52:14
樓上說的很好。。。不過為什么這個不行呢。。。
北京-司令(117838621) 19:52:35
我試了一下,竟然系統死機了。。(我app調用了2次)
鍵指江山(1791120766) 19:52:37
或者用complete
鍵指江山(1791120766) 19:52:41
肯定死機
城關少主(1007936447) 19:52:45
要不然待鎖的進程會移植占有CPU
北京-司令(117838621) 19:52:48
?
鍵指江山(1791120766) 19:52:51
導致死鎖
鍵指江山(1791120766) 19:53:14
什么叫自旋?
鍵指江山(1791120766) 19:53:25
類似於while(1)
北京-司令(117838621) 19:53:27
我是否可以再open里面加鎖,release里面解鎖呀..?
,我的意思是,我一個app打開,處理完后close后不久解鎖了。。。?
北京-司令(117838621) 19:53:36
何來自鎖。。。?
阿九(617330220) 19:53:40
死鎖了當然死機
鍵指江山(1791120766) 19:53:47
自旋鎖不是這么用的
阿九(617330220) 19:53:40
死鎖了當然死機
鍵指江山(1791120766) 19:54:04
complete
鍵指江山(1791120766) 19:54:18
加鎖的目的?
北京-司令(117838621) 19:54:28
而另一個app在得到鎖這個地方就忙等了。。一直等到第一個app close不就行了。。。
鍵指江山(1791120766) 19:54:34
鎖保護的只是數據,不是代碼
鍵指江山(1791120766) 19:54:51
那你就不能用自旋鎖啊。
北京-司令(117838621) 19:55:06
我知道,這個用信號量道理我明白。。
鍵指江山(1791120766) 19:55:05
你就用信號量
鍵指江山(1791120766) 19:55:28
自旋鎖一般是鎖很短的時間內
鍵指江山(1791120766) 19:55:41
因為自旋鎖鎖定過程中不允許睡眠
鍵指江山(1791120766) 19:55:49
會關掉內核的搶占
北京-司令(117838621) 19:55:59
結果呢
鍵指江山(1791120766) 19:56:13
結果就出現那種現象了
北京-司令(117838621) 19:56:15
也就是說當前進程一直占用cpu
鍵指江山(1791120766) 19:56:21
嗯
鍵指江山(1791120766) 19:56:33
然后你那個close怎么去執行?
鍵指江山(1791120766) 19:56:50
內核對內核代碼是沒有安全檢查的
鍵指江山(1791120766) 19:56:55
很信任的
北京-司令(117838621) 19:57:08
那不更好么?它一直占用cpu,豈不很快就把app執行完了,然后close,然后就釋放鎖呀。。。
鍵指江山(1791120766) 19:57:15
北京-司令(117838621) 19:57:22
鍵指江山(1791120766) 19:57:29
你的是多核還是單核額
北京-司令(117838621) 19:57:31
怎么了。。我說的不對么?
鍵指江山(1791120766) 19:57:31
大哥
北京-司令(117838621) 19:57:37
單核呀
鍵指江山(1791120766) 19:57:54
是等待鎖的那個進程在占用CPU。。。。。
北京-司令(117838621) 19:57:56
驅動中占用cpu,那么是app調用drv的。。。
鍵指江山(1791120766) 19:57:59
你說呢
鍵指江山(1791120766) 19:58:18
你的close怎么執行?
北京-司令(117838621) 19:58:29
你的意思是第二個app占用么?
鍵指江山(1791120766) 19:58:33
你可以做做實驗用printk什么的輸出看看
鍵指江山(1791120766) 19:58:40
應該是
北京-司令(117838621) 19:58:45
我什么也輸出不來。。。
鍵指江山(1791120766) 19:59:06
那不就是沒跑到哪里去嘛
北京-司令(117838621) 19:59:13
不過按你說的,那么短時間的鎖,豈不也執行不了了。。。
鍵指江山(1791120766) 19:59:35
此話怎講?
北京-司令(117838621) 20:00:29
比如說:
spin_lock(&spin);
//臨界資源訪問
globalvar_count++;
spin_unlock(&spin);
鍵指江山(1791120766) 20:00:47
對
鍵指江山(1791120766) 20:01:00
中間好像一睡眠就肯定出問題
鍵指江山(1791120766) 20:01:26
好像scheduler就有問題
鍵指江山(1791120766) 20:01:30
做做實驗看
北京-司令(117838621) 20:01:35
當我第一個app得到鎖了,執行globalvar_count++; 誰知還沒執行,第二個app又開始獲鎖,那么第二個app就死了,在占用cpu,那么globalvar_count++; 還怎么執行。。。
鍵指江山(1791120766) 20:02:18
等等
鍵指江山(1791120766) 20:02:21
我想想
鍵指江山(1791120766) 20:02:31
我覺得應該是scheduler就會出問題
北京-司令(117838621) 20:02:38
?
鍵指江山(1791120766) 20:02:46
有任務調度
鍵指江山(1791120766) 20:02:49
就會出問題
北京-司令(117838621) 20:02:58
怎么個說法
鍵指江山(1791120766) 20:03:08
因為spin_lock(&spin);會禁止搶占和SMP
鍵指江山(1791120766) 20:03:24
我等會做下實驗看
北京-司令(117838621) 20:03:29
好的。。。
鍵指江山(1791120766) 20:03:33
兄弟,建議你也做做實驗
鍵指江山(1791120766) 20:03:48
這玩意就是多看多試
北京-司令(117838621) 20:03:50
嘻嘻。。
北京-司令(117838621) 20:03:56
我就是一直死。。。
鍵指江山(1791120766) 20:04:05
看下LDD3
鍵指江山(1791120766) 20:04:10
強烈推薦
鍵指江山(1791120766) 20:04:12
呵呵
北京-司令(117838621) 20:04:12
不過我試過了后面的那個做法。。是可以執行的。。。
北京-司令(117838621) 20:04:28
我看了一半,有點看不下去了。呵呵
鍵指江山(1791120766) 20:05:09
是比較枯燥
無錫-蘿卜(136904743) 20:05:20
cramfs 掛載 yaffs2 怎么樣才算陳公告掛載yaffs2
鍵指江山(1791120766) 20:05:21
我的眼都看大了
鍵指江山(1791120766) 20:05:25
看了好幾本
北京-司令(117838621) 20:05:34
呵呵。。。
鍵指江山(1791120766) 20:05:53
UNIX高級編程3本+LDD3+深入理解Linux內核
鍵指江山(1791120766) 20:06:05
還得多實踐
阿九(617330220) 20:06:22
LDD3是講什么的??
北京-司令(117838621) 20:06:39
我一般使用信號量。。。不用自旋鎖,不過近來找到本《linux設備驅動開發入門》照着上面在試驗着。。。
鍵指江山(1791120766) 20:06:38
yaffs2是做root文件系統嗎?
鍵指江山(1791120766) 20:06:53
這玩意還是要系統的看看
鍵指江山(1791120766) 20:07:04
對應用編程最好也多了解下
北京-司令(117838621) 20:07:07
對,是的。。
鍵指江山(1791120766) 20:07:24
很多問題就明白了
鍵指江山(1791120766) 20:07:31
要不總是雲里霧里
鍵指江山(1791120766) 20:09:20
阿九兄弟 LDD3就是Linux Device Driver
鍵指江山(1791120766) 20:09:40
Edition3
鄭州-司令(117838621) 20:16:00
大家好,有誰理解自旋鎖。。。?
我是否可以再open里面加鎖,release里面解鎖呀..?
雄哥(309683352) 20:25:25
你自旋鎖是鎖什么數據的啊
雄哥(309683352) 20:27:29
自旋鎖一般是多cpu或是可搶占內核中斷上下文中使用
鄭州-司令(117838621) 20:27:51
我的目的不是鎖數據。。就是感覺這樣應該也能執行的。。。
鄭州-司令(117838621) 20:28:11
可是,當我app調用兩次的時候,竟然死機。。
雄哥(309683352) 20:28:14
自旋鎖不會掛起,不會交出cpu的使用權,只會一直在那讓cpu空轉
雄哥(309683352) 20:28:27
相當於while (1)
雄哥(309683352) 20:28:42
建議你用信號量
鄭州-司令(117838621) 20:29:04
信信號量我懂,可是一直不理解這個自旋鎖
鄭州-司令(117838621) 20:29:05
比如說:
spin_lock(&spin);
//臨界資源訪問
globalvar_count++;
spin_unlock(&spin);
雄哥(309683352) 20:29:26
自旋鎖就相當於while(1)
雄哥(309683352) 20:29:39
直到條件滿足才會往下執行
鄭州-司令(117838621) 20:29:43
我又兩個app,第一個spin_lock(&spin); 得到了,開始 globalvar_count++; 此時第二個又來了。。該當如何
雄哥(309683352) 20:30:08
那他就會永遠執行自旋鎖
鄭州-司令(117838621) 20:30:19
那么第二個是不是因為得不到鎖而占用cpu100%使用權
鄭州-司令(117838621) 20:30:25
那么第一個還怎么執行呀
雄哥(309683352) 20:30:33
第一個不會執行了
雄哥(309683352) 20:30:53
除非是多cpu機器
鄭州-司令(117838621) 20:31:07
那么這段代碼是不是有問題呀。。
雄哥(309683352) 20:31:10
自旋的意思就是一直在那不停的旋轉
雄哥(309683352) 20:31:18
不會掛起,不會釋放
鄭州-司令(117838621) 20:31:33
是app自鎖,還是內核自鎖。。。
鄭州-司令(117838621) 20:31:42
就是是哪個占用了100%
鄭州-司令(117838621) 20:32:08
不過,熊哥,這段代碼很常見:
spin_lock(&spin);
//臨界資源訪問
globalvar_count++;
spin_unlock(&spin);
雄哥(309683352) 20:32:30
怎么會有用戶的東西啊,執行open系統調用,肯定已經陷入內核了
鄭州-司令(117838621) 20:32:33
如果是系統死掉的話,豈不,內核源碼會有問題
鄭州-司令(117838621) 20:33:03
哦,也就是說一旦自旋鎖鎖住了,系統也就掛了。。。
雄哥(309683352) 20:33:03
這個一般是用非阻塞的形式
鄭州-司令(117838621) 20:33:37
信號量和自旋鎖不是處理並發控制么?
雄哥(309683352) 20:33:53
多cpu的情況下一般用自旋鎖
鄭州-司令(117838621) 20:33:59
那么如果用自旋鎖的話,該如何寫呀。。
雄哥(309683352) 20:34:01
比如你是雙核的cpu
鄭州-司令(117838621) 20:34:04
哦,多cpu
鄭州-司令(117838621) 20:34:22
也就是說如果是單核的話,基本上不用自旋鎖了。。。
雄哥(309683352) 20:34:25
一個cpu鎖住了,還可以由別的cpu解鎖
雄哥(309683352) 20:34:50
單核可搶占內核也可以用自旋鎖
雄哥(309683352) 20:34:59
但是一般用非阻塞形式
雄哥(309683352) 20:35:17
而且中斷下半段或是中斷上下文中用
鄭州-司令(117838621) 20:35:35
可搶占內核,豈不linux不行了。。。
雄哥(309683352) 20:35:37
因為中斷不能被掛起,所以不能用信號量
鄭州-司令(117838621) 20:35:48
哦
雄哥(309683352) 20:35:51
linux 2.6以后就是可搶占了
鄭州-司令(117838621) 20:36:13
哦,也就是說我上面這段代碼也是可以用的了。。。
雄哥(309683352) 20:36:51
不行啊
雄哥(309683352) 20:37:10
你不是在中斷上下文中,而是在進程上下文中
鄭州-司令(117838621) 20:37:45
熊哥:還是這個:
我又兩個app,第一個spin_lock(&spin); 得到了,開始 globalvar_count++; 此時第二個又來了。。該當如何
我在我機器上試了一下,這時第一個還是可以執行的。。。
鄭州-司令(117838621) 20:38:13
不過我的代碼不是這個樣子
鄭州-司令(117838621) 20:38:50
是這個樣子:
static int globalvar_open(struct inode *inode, struct file *filp)
{
//獲得自旋鎖
spin_lock(&spin);
//臨界資源訪問
printk("got the spin\n");
if (globalvar_count)
{
spin_unlock(&spin);
return - EBUSY;
}
globalvar_count++;
//釋放自旋鎖
spin_unlock(&spin);
return 0;
}
/*因為設備打開后,如果沒有執行 讀寫操作,應用層的close(fd)就沒 執行,globalvar_count的值不變
只有應用層讀寫完以后,才進行*/
static int globalvar_release(struct inode *inode, struct file *filp)
{
globalvar_count--;
return 0;
}
鄭州-司令(117838621) 20:39:14
這是我看《linux設備驅動開發入門》照着上面做的。。。
雄哥(309683352) 20:39:44
spin_trylock
雄哥(309683352) 20:40:00
用這個獲得自旋鎖,就不會鎖死
鄭州-司令(117838621) 20:40:08
哦
鄭州-司令(117838621) 20:40:12
這個呀
鄭州-司令(117838621) 20:40:16
好的。。
鄭州-司令(117838621) 20:41:13
好的,我記下了。。。
雄哥(309683352) 20:41:24
返回非0表示成功獲得了鎖,返回0表示沒有獲得鎖
鄭州-司令(117838621) 20:41:36
哦,好
風清霧明(779804667) 20:46:40
如果當前的CPU持有自旋鎖時,是不允許進入睡眠的。
風清霧明(779804667) 20:46:59
LDD3上有詳細論述。
鄭州-司令(117838621) 20:48:13
?
鄭州-司令(117838621) 20:48:38
spin_lock(&spin);
//臨界資源訪問
globalvar_count++;
spin_unlock(&spin);
鄭州-司令(117838621) 20:49:58
應該說是第一個app進程持有了,而第二個app進程又來了。。因而導致第二個一直100%,那么第一個豈不一點也不能執行了。。
風清霧明(779804667) 20:50:00
也就是說當第一個在運行並持有自旋鎖時,該CPU不會被調度出去。而別的CPU運行第二個時,會停在原地等待另一個CPU釋放自旋鎖。
鄭州-司令(117838621) 20:52:28
哦,這是從2個cpu角度來說明的,呵呵
鄭州-司令(117838621) 20:52:35
這個我理解了。。
鄭州-司令(117838621) 20:52:53
不過如果單核的話,就是系統死掉了。。。
鄭州-司令(117838621) 20:54:18
也就是說,一般如果是單核的話,基本上不要使用自旋鎖,是么?
鄭州-司令(117838621) 20:54:23
風清霧明(779804667),,還在么?
風清霧明(779804667) 20:58:15
司令 20:55:32
風清哥。。。
司令 20:55:35
在么?
風清霧明 20:55:52
恩
司令 20:56:08
就是我剛才在群里面文的問題。。。
風清霧明 20:56:10
自己上網一搜,全是。
風清霧明 20:56:20
http://topic.csdn.net/u/20100909/18/79787565-7b1a-404b-97f7-44b9f81319d3.html
司令 20:56:36
哦,好,我看看
有關單核非搶占式內核的自旋鎖問題
http://topic.csdn.net/u/20100909/18/79787565-7b1a-404b-97f7-44b9f81319d3.html
鄭州-司令(117838621) 20:58:59
好的,謝謝了,小弟有點開竅了。。。
風清霧明(779804667) 20:59:37
不客氣。上網搜資料是成長的必要途徑。
鄭州-司令(117838621) 20:59:51
哦,對
到最后也真有點明白,咳,記錄下來吧。。。
http://topic.csdn.net/u/20100909/18/79787565-7b1a-404b-97f7-44b9f81319d3.html這個頁面講的也可以,也就說是如果是單核的話,在編譯的時候系統自動把自旋鎖給去掉了。