操作系统线程互斥,锁死机制的简单介绍
生活随笔
收集整理的這篇文章主要介紹了
操作系统线程互斥,锁死机制的简单介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用戶線程的切換,是內核決定,由調度器分配時間片調度到內核空間,轉換成內核線程,然后指令重排序交給CPU.CPU沒有執行過程中的中斷時間,是不斷的在運行,只是調度器提前將線程調度好,將多個線程的指令排好交給CPU。那么這種混合插入就是我們上層理解的線程調度。對CPU而言,所有的線程都是 串行的。
對于一個多線程并發的多次處理或者重復處理一個任務,如果這個任務就是原子操作,(如讀、寫操作,先是尋址,然后讀出數據,再然后尋址找到要寫回來的地址將數據寫進來;也有可能是指針操作,先是尋址,讀出改地址里存儲的地址數據,然后尋址跳轉,找到指向的地址,將數據讀出來,然后再尋址,將數據寫進去。那么這一長串的操作就是原子操作,中間不可能有調度器在調度指令的時候,將這些指令分割開來處理。)對于單個CPU系統而言,那么沒有必要同步或者互斥同步。互斥就是單個CPU最基本的特性,只要有一個線程在執行,那么其他的互斥線程都在停止狀態。調度器會記錄有互斥的線程,在調度的時候不會去調度。對于原子操作不可能有調度器的中斷,這是硬件指令集決定的,所以是硬件決定的。硬件會在原子操作上,分配一定時長的操作時間。而調度器分配的時間片就是基于這個操作時間的,是操作時間的整數倍。對于單個CPU系統,兩個線程互斥,但是又存在競爭,比如說一個線程resume,但是又調度了terminated;那么這個線程被調度器調回來,又調回去,換句話說就是兩個線程被調度器切換來又立即切換回去。那么這兩個線程出現了死鎖。死鎖、互斥、同步是兩個線程之間的概念。怎么減少死鎖的風險,很明顯是在線程調度處理上我們加上一些機制。比如對于某一線程正在被CPU執行一段代碼,這段代碼加有鎖(只允許單個線程執行完畢之后,才能有下一下線程執行),但是時間片結束,調度器又調了另外的線程,但是這個線程也是執行這段代碼,那么兩個線程出現了,互斥區域中的競爭,那么內核要將這個線程直接從對應的內核空間剔除到用戶內存空間,再次由系統依據調度算法調到內核空間。這就是阻塞。說白了,就是線程被調度了,但是不能執行當前的代碼指令,只能被調度器剔除掛起,那么這個線程在一輪的調度中沒有任何的執行,相當于阻塞中。
阻塞,內核將線程剔除到用戶空間,這樣很耗費資源,因為系統內核是不能被用戶空間訪問的;因為內核是完全保護起來的,這也是系統穩定很重要的因素。但是內核空間可以訪問用戶空間,通知線程被調度到內核區。那么線程從用戶區進去到內核區,那么必然有存儲空間在內核區重新建立,數據重新讀取到內核中。相反,從內核中將線程剔除,依然有數據從內核區讀到用戶存儲區。為了優化或者減少線程的阻塞,首先可以判斷線程將要執行的代碼是不是有鎖,而且和已執行或者執行過的線程存在鎖互斥。如果存在就不被調度,等待下一次調度。或者在調度的時候沒有鎖機制的判斷,如果被調度的線程存在所互斥,那么暫停被調度,直接將分配的時間片轉移到下一個要調度的線程。也可以
在調度處理的時候發現要執行的代碼是含有鎖互斥的代碼,那么轉移到沒有鎖存在的代碼先執行。總之減少線程什么也沒有做,便從內核剔除到用戶空間。
那么為什么操作系統發現,互斥的線程,將其剔除到用戶空間呢,重新排隊進入到內核空間,然后逐步分配時間片等待調度呢?這個是出于安全考慮,或者系統內核的設計。系統內核設計上,在內核中的線程都會安排到時間片,也就是都會被調度器調度。沒有等待的概念,等待的概念只在用戶空間。在用戶空間等待排隊,那么在內核中就沒有對應的執行的內核線程(將用戶空間的線程指令copy到內核空間去執行)。所以這也是為什么將互斥的線程調到用戶空間排隊,是防止再被調度到。
那么為什么操作系統分為用戶空間和內核空間呢?你可以想象,用戶在操作的時候很可能隨時刪除一個線程(關閉),和創建(打開)一個新的線程,用戶這些操作如果直接映射對應到內核上,會導致調度器自我調整的時間很少,內核還要拋出一部分資源來監聽和相應用戶操作(這也就是將現在的操作系統將用戶空間和內核合并在一起而且也可以通信)。那么系統可能不穩定,綜合設計經驗,操作系統將只顧和CPU打交道的部分封裝為內核,相應用戶的部分封裝為用戶區。
對于多核處理器系統,那么線程的并發可以是多個CPU同時處理,也可以多個線程在切換時間片中處理,那么考慮線程的死鎖和同步,互斥就要考慮其他cpu是不是會處理。
同步處理的數據如何同步,保證數據的統一性。
總結
以上是生活随笔為你收集整理的操作系统线程互斥,锁死机制的简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遍地开花!比亚迪在淄博开汽车销售公司 注
- 下一篇: http并发,操作系统如何识别对应的进程