linux 并發(fā)信號處理程序 android開發(fā)中怎樣解決多用戶并發(fā)問題?
android開發(fā)中怎樣解決多用戶并發(fā)問題?既然是多用戶,就要把用戶數(shù)據(jù)分開,否則無法體現(xiàn)多用戶的機(jī)制體系,除非用戶提供共享,系統(tǒng)支持共享,否則用戶下的數(shù)據(jù)應(yīng)該是私有的。對于Android,也就是Li
android開發(fā)中怎樣解決多用戶并發(fā)問題?
既然是多用戶,就要把用戶數(shù)據(jù)分開,否則無法體現(xiàn)多用戶的機(jī)制體系,除非用戶提供共享,系統(tǒng)支持共享,否則用戶下的數(shù)據(jù)應(yīng)該是私有的。
對于Android,也就是Linux系統(tǒng)來說,一個(gè)用戶就是一個(gè)文件目錄,用戶目錄之間的相互訪問是通過權(quán)限來控制的。在沒有指定權(quán)限的情況下,用戶除非獲得了系統(tǒng)權(quán)限,否則無法擁有相互控制的能力,也就是我們常說的root權(quán)限。存儲在系統(tǒng)中,如果你獲得root權(quán)限,這將是一種將文件寫入系統(tǒng)目錄的。root權(quán)限不容易獲得,存在安全風(fēng)險(xiǎn),不建議使用。我們可以繞道走。內(nèi)部存儲不好,但是有外部存儲(比如SD卡)。這是很多用戶共有的,相關(guān)數(shù)據(jù)可以放到外部存儲上,達(dá)到共享的目的??梢宰鰝€(gè)參考。
linux最大端口數(shù)超過65535怎么辦?
區(qū)分端口數(shù)和連接數(shù)!
事實(shí)上,可用的計(jì)算機(jī)端口數(shù)量只有65,536,這是一個(gè)事實(shí)。但是,也要注意,如果端口被占用,它并不總是你的,如果你不占用,你可以釋放它。;不要用它。發(fā)布后,其他程序可以繼續(xù)使用它。因此,在動態(tài)利用下,很難占用所有端口。
第二,要區(qū)分端口和連接。一個(gè)端口可以有幾個(gè)連接,比如nginx。在普通linux上,一個(gè)80口可以有10萬個(gè)并發(fā)連接,極端情況下可以近百萬。所以因?yàn)槎丝趶?fù)用,其實(shí)不會用那么多端口。
所以65536端口用完的神話基本不會出現(xiàn)。
spinlock和Semaphore信號量的區(qū)別?
互斥是一個(gè)關(guān)鍵。一個(gè)人可以帶著它進(jìn)入一個(gè)房間,出來時(shí)把它給排隊(duì)的第一個(gè)人。一般的用法是序列化對臨界區(qū)代碼的訪問,以確保這些代碼不會并行運(yùn)行。
旗語是可以容納n個(gè)人的房間。如果人們不滿意,他們可以進(jìn)去。人滿了就要等人出來。在N1的例子中,它被稱為二元語義。通常的用法是限制對資源的同時(shí)訪問。
二元語義和互斥的區(qū)別;
在一些系統(tǒng)中,二進(jìn)制語義和互斥沒有區(qū)別。在某些系統(tǒng)上,主要的區(qū)別在于互斥體必須由獲得鎖的進(jìn)程來釋放。Semaphore可以被其他進(jìn)程釋放(此時(shí)semaphore實(shí)際上是一個(gè)原子變量,可以加減),所以semaphore可以用于進(jìn)程間同步。信號量的同步功能是所有系統(tǒng)都支持的,但是互斥是否能被其他進(jìn)程釋放是不確定的,所以建議互斥只用于保護(hù)criti。cal部分.信號量用于保護(hù)變量或同步。
另一個(gè)概念是自旋鎖,這是一個(gè)內(nèi)核狀態(tài)概念。自旋鎖和信號量的主要區(qū)別在于自旋鎖忙于等待,而信號量處于休眠狀態(tài)。對于一個(gè)可以休眠的進(jìn)程來說,忙著等待當(dāng)然沒有意義。對于單CPU系統(tǒng)來說,忙著等待當(dāng)然更沒有意義(沒有CPU可以釋放鎖)。所以只有多CPU的內(nèi)核態(tài)非進(jìn)程空間才會使用自旋鎖。在非SMP的情況下,Linux內(nèi)核的自旋鎖只關(guān)閉irq,沒有其他操作保證這個(gè)程序的運(yùn)行不會被中斷。實(shí)際上,它類似于互斥體的作用,序列化對臨界區(qū)的訪問。但是互斥體可以。;t保護(hù)中斷和can 不能在中斷處理程序中調(diào)用。對于可以睡眠的進(jìn)程空間,自旋鎖通常不是必需的。
-
內(nèi)核同步措施
為了避免并發(fā)和競爭。內(nèi)核提供了一組同步方法來保護(hù)共享數(shù)據(jù)。我們的重點(diǎn)不是介紹這些方法的詳細(xì)用法,而是為什么要使用這些方法以及它們之間的區(qū)別。
Linux使用的同步機(jī)制,從2.0到2.6可以說是不斷發(fā)展完善的。從最初的原子操作到后來的信號量,從大內(nèi)核鎖到今天 s旋轉(zhuǎn)鎖。這些同步機(jī)制的發(fā)展伴隨著Linux從單處理器向?qū)ΨQ多處理器的過渡;隨著非搶占式內(nèi)核向搶占式內(nèi)核的轉(zhuǎn)變。鎖定機(jī)制變得越來越有效和復(fù)雜。
目前內(nèi)核中的原子操作多用于計(jì)數(shù)。在其他情況下,兩種鎖和它們的變種,:,是最常用的。一個(gè)是旋轉(zhuǎn)鎖,另一個(gè)是信號量。讓 我們將重點(diǎn)介紹這兩種鎖定機(jī)制。
旋轉(zhuǎn)鎖
自旋鎖是一種專門為防止多個(gè)處理器并發(fā)而引入的鎖。廣泛應(yīng)用于中斷處理和內(nèi)核中的其他部分(對于單個(gè)處理器,可以簡單地關(guān)閉中斷,防止中斷處理中的并發(fā),無需自旋鎖)。
自旋鎖最多只能由一個(gè)內(nèi)核任務(wù)持有。如果一個(gè)內(nèi)核任務(wù)試圖請求一個(gè)已經(jīng)被競爭(已經(jīng)持有)的自旋鎖,那么這個(gè)任務(wù)將繼續(xù)經(jīng)歷一個(gè)繁忙的周期?!D(zhuǎn)動——,等待鎖再次可用。如果鎖沒有被競爭,請求它的內(nèi)核任務(wù)??梢择R上拿到,繼續(xù)。自旋鎖可以防止多個(gè)內(nèi)核任務(wù)在任何時(shí)候進(jìn)入臨界區(qū),所以這種鎖可以有效防止多個(gè)處理器上并發(fā)運(yùn)行的內(nèi)核任務(wù)爭奪共享資源。
其實(shí)自旋鎖的初衷是:短時(shí)間內(nèi)輕量級鎖。爭用的自旋鎖會使請求它的線程在等待該鎖再次可用時(shí)自旋(特別是浪費(fèi)處理器時(shí)間),因此自旋鎖不應(yīng)該持有太久。如果你需要長時(shí)間鎖定,你 最好使用信號量。
自旋鎖的基本形式如下:
自旋鎖(mr鎖);
//臨界區(qū)域
spin _ unlock(Mr _ lock);
因?yàn)樽孕i一次最多只能由一個(gè)內(nèi)核任務(wù)持有,所以一次只允許一個(gè)線程存在于臨界區(qū)中。這很好地滿足了對稱多處理機(jī)所需的鎖定服務(wù)。在單處理器上,自旋鎖僅用作設(shè)置內(nèi)核搶占的開關(guān)。如果內(nèi)核搶占不存在,那么自旋鎖將在編譯時(shí)從內(nèi)核中完全排除。
簡單來說,自旋鎖主要用在內(nèi)核中,防止多個(gè)處理器并發(fā)訪問關(guān)鍵區(qū)域,防止內(nèi)核搶占帶來的競爭。此外,自旋鎖不允許任務(wù)休眠(持有自旋鎖的任務(wù)休眠會導(dǎo)致自死鎖),——可能會再次申請他已經(jīng)持有的鎖,因?yàn)樾菝呖赡軙?dǎo)致持有該鎖的內(nèi)核任務(wù)被重新調(diào)度。它可以在中斷環(huán)境中使用。
死鎖:假設(shè)有一個(gè)或多個(gè)內(nèi)核任務(wù)和一個(gè)或多個(gè)資源,每個(gè)內(nèi)核都在等待其中一個(gè)資源,但是所有的資源都被占用了。所有的內(nèi)核任務(wù)都在互相等待,但是它們永遠(yuǎn)不會釋放它們已經(jīng)占用的資源,所以任何內(nèi)核任務(wù)都可以 得不到它所需要的資源。;t繼續(xù)運(yùn)行,這意味著發(fā)生了死鎖。就是你占據(jù)了某個(gè)資源,然后去申請你已經(jīng)擁有的資源。顯然是不可能再獲得資源了,所以你束縛了手腳。
旗語
Linux中的信號量是一個(gè)睡眠鎖。如果一個(gè)任務(wù)試圖獲取一個(gè)已經(jīng)被持有的信號量,信號量會把它推入等待隊(duì)列,然后讓它進(jìn)入睡眠狀態(tài)。此時(shí),處理器可以自由執(zhí)行其他代碼。當(dāng)持有信號量的進(jìn)程釋放信號量時(shí),等待隊(duì)列中的一個(gè)任務(wù)將被喚醒,從而可以獲得信號量。
信號量的睡眠特性使得信號量適合長時(shí)間持有鎖的情況;只能在進(jìn)程上下文中使用,因?yàn)樗荒茉谥袛嗌舷挛闹姓{(diào)度;此外,當(dāng)代碼持有信號量時(shí),它不能再持有自旋鎖。
信號量的基本使用形式是:
靜態(tài)聲明互斥體(Mr _ S:
如果代碼需要睡眠,——,這是經(jīng)常發(fā)生的,當(dāng)它與用戶空間同步,—— ;唯一的選擇是使用信號量。因?yàn)椴皇芩呦拗?,通常使用信號量更容易。如果您需要在旋轉(zhuǎn)鎖和信號量之間進(jìn)行選擇,這應(yīng)該取決于持有鎖的時(shí)間長度。理想情況下,所有鎖的持有時(shí)間應(yīng)該盡可能短,但是如果鎖持有時(shí)間很長,使用信號量是更好的選擇。此外,與自旋鎖不同,信號量不會關(guān)閉內(nèi)核搶占,因此持有信號量的代碼可以被搶占。這意味著信號量不會對調(diào)度響應(yīng)時(shí)間產(chǎn)生負(fù)面影響。
自旋鎖對信號量
需求建議的鎖定方法
低開銷鎖定優(yōu)先考慮旋轉(zhuǎn)鎖定。
短期鎖定優(yōu)先于自旋鎖定。
長期鎖定優(yōu)先考慮信號量。
中斷上下文中的鎖定使用旋轉(zhuǎn)鎖定。
持有鎖需要休眠和調(diào)度信號量。