1前言
周末時間過得很快,最近在看一個電視劇《歲歲年年柿柿紅》,那些年代的感觸還是很深的,當年我們家也是那樣的狀態。想不到幾十年就過來了。同是農村過來的可以一起看看。
這次想說一下互斥鎖,原子操作,主要是上次說的那個賣票的程序,在出票的時候沒有加鎖,很容易造成同時出一張票的問題,在Linux內核里面,信號量和鎖機制非常重要。大家先了解其中的原理,寫代碼和看代碼的時候才游刃有余。
本想把幾個鎖機制都一次一起寫了,但是周末時間有限,總是沒有一個連貫的時間,先把原子操作整理一下。
2正文
原子操作
為什么有原子操作?
1、多進程之間對同一個資源操作導致問題
2、多CPU對同一資源操作導致問題
什么是原子操作?
答:所謂的原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷linux 信號量使用,也就是說,它的最小的執行單位,不能有比它更小的執行單元,因此這里的原子實際是使用了物理學里物質微粒的概念。
舉個栗子:
1、多線程操作
正常對一個變量自加需要三步操作
如果有兩個進程同時對變量i操作的話,可能會出現下面的情況
進程1執行第一條執行后,進程2開始對i進行操作,這時候進程2執行完了,i的值是1,回到進程1,因為eax寄存器的值是0,自增1后也變成了1,但是我們希望兩次操作得到的是i變成2。這樣問題就出現了。
如何解決?
把三條指令變成一條指令,那就可以解決單CPU多進程的搶占問題
上面三條指令可以變成 inc [i]
2、多cpu操作
上面的情況雖然解決了單cpu問題,但是在多cpu上,多個cpu對同一個資源搶占,同樣問出現上面的問題
舉個栗子:
看上面的圖片,這樣操作之后,i 還是1,這又出現問題了
如何解決問題?
在CPU操作之前,先上鎖Lock,操作完后才釋放鎖,這樣就避免了問題。
加上lock之后linux 信號量使用,操作就正常了
我們在寫嵌入式代碼,不只是Linux,在寫其他微處理器,rtos代碼的時候,也會有這樣的問題,嵌入式雖然這些年工資比不上互聯網,但是里面的精髓需要慢慢錘煉的,也希望這一波AI人工智能能把嵌入式的薪水提高一個檔次。