我們的作業系統裡面會有很多應用,比如手機裡面的各種應用,每乙個應用都有乙個或多個程序,而且每個應用執行時又會用到很多不同的資源。程序就幫助我們隔離了不同的資源,利用各種資源幫助應用管理著各種狀態,因此,我們經常說程序是資源分配的最小單位。
多程序的目的是為了滿足使用者的需要,同時對多個資源進行處理,簡單來說就是同時做多個事情。
程序擁有了資源之後,就需要去利用它們,所以就需要執行緒的幫忙了,每個程序都至少需要乙個執行緒作為執行單位,同時也可以開啟新的執行緒執行。另外,乙個 cpu 核心乙個時刻只能執行乙個執行緒,多個執行緒之間需要不斷進行排程,因此我們經常說執行緒是cpu排程的最小單位
有了執行緒之後,程序間可以併發,而且乙個程序內部的多個執行緒之間也是可以併發的。
而多執行緒的目的就是為了充分利用併發帶來的效率上的提高。
對於乙個 cpu 核心,乙個時刻只能執行乙個執行緒(因此也只能執行乙個程序),為了實現併發執行,引入了分時的概念,即將時間分為多個時間片,不同的時間片執行不同的執行緒,以實現乙個時間段內執行多個執行緒
程序正在 cpu 上執行,對於 cpu 的單個核心來說,乙個時刻最多只能有乙個程序處於執行狀態
→ 就緒態:當分派給當前程序的時間片用完以後,該程序就必須讓出 cpu,變回就緒態等待下一次程序排程分派時間片;或者,如果是可剝奪的作業系統,有更高優先順序的程序進入就緒態時,也需要讓出 cpu
→ 阻塞態:當程序請求某一資源(如外設)的使用和分配或等待某一事件的發生(如i/o操作的完成)時,它就從執行狀態轉換為阻塞狀態。
準備執行,已經獲得了出 cpu 以外的所有需要的資源,等待 cpu 分派時間片
→ 執行態:當前程序被分派了 cpu 時間片後,也就獲得 cpu 資源(分派處理機時間片),可以使用 cpu 了,因而進入執行態
因為要等待某個資源或者某個事件的發生而被阻塞因此暫停執行。
就緒狀態是指程序缺少 cpu 資源;而等待狀態是指需要除了 cpu 以外的其他資源或者某個事件
→ 就緒態:當程序等待的事件到來時,如i/o操作結束或中斷結束,或者獲得了等待的資源,中斷處理程式就會把該程序的狀態轉換為就緒狀態
一種低階的通訊方式。在作業系統這種多執行緒,多程序環境中,我們要密切關注資源的同步互斥問題
互斥:指一次只能有乙個執行緒對共享資源進行操作
為了解決共享資源的同步互斥問題,我們將具體的資源的數量抽象為訊號量 semaphore,通過 p 操作和 v 操作分別對訊號量進行減和增。
如果我們將訊號量看作為資源設定的資源鎖,那麼 p 操作相當於加鎖操作,而 v 操作相當於解鎖操作 。
隨著作業系統的發展,用於程序之間實現通訊的機制也在發展,並已由早期的低階程序通訊機制發展為能傳送大量資料的高階通訊工具機制。
在通訊的程序之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作實現程序之間的資訊交換。
當然,在對共享空間進行寫讀操作時,也需要使用同步互斥工具(如 p操作、v操作),對共享空間的寫讀進行控制。
通訊的程序之間不存在可直接訪問的共享空間,則必須利用作業系統提供的訊息傳遞方法實現程序通訊。
利用乙個「管道」實現程序間的通訊。這個管道是乙個連線讀程序和寫程序的共享檔案。
寫程序以字元流的方式將資料輸入到這個共享檔案中,供讀程序讀取。當然這一系列操作也需要管道提供同步和互斥的能力。
什麼是執行緒安全,你真的了解嗎?
記得今年3月份剛來杭州面試的時候,有一家公司的技術總監問了我這樣乙個問題,說你給我說說有哪些執行緒安全的類,我心裡一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什麼是執行緒安全,然後就gg了,說真的,我們整天說執行緒安全,但是你對什麼是執行緒安全真的了解嘛?說真的,我之前真的是了解甚微...
你真的了解Java嗎?
三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...
你真的了解restful api嗎?
在以前,乙個 的完成總是 all in one 頁面,資料,渲染全部在服務端完成,這樣做的最大的弊端是後期維護,擴充套件極其痛苦,開發人員必須同時具備前後端知識。於是慢慢的後來興起了前後端分離的思想 後端負責資料編造,而前端則負責資料渲染,前端靜態頁面呼叫指定api獲取到有固定格式的資料,再將資料展...