java程序員須要知道的底層知識(四)

筆記開始java

1. 進程

進程:就是一個程序運行起來的狀態,進程是操做系統用來分配資源的基本單位,分配資源指的是獨立的內存空間 linux

image
image

殭屍進程:當A進程fork(底層調的clone)了一個B進程,那麼A叫作B的父進程,父進程當中會維護子進程的PCB結構,若是子進程已經退出,父進程沒有釋放子進程的pcb,那麼這個子進程在系統當中看到的就是一個被defunct標記的殭屍進程,(殭屍進程只佔pcb,影響不是太大,若是太多的話就有影響,殭屍進程的標記是defunct)segmentfault

孤兒進程:子進程還沒退出,父進程先退出了,那麼子進程就沒有了父親,這個時候系統會將這個子進程分配給父進程的父進程去管理(系統會交給一個特殊的進程去處理,沒有太大影響,只是換了個爹)
image服務器

2. 線程

線程:是一個進程中不一樣的執行路徑,線程是操做系統進行執行調度的基本單位,線程調度執行(線程共享進程的內存空間,沒有本身獨立的內存空間)
線程在linux中的實現:就是一個普通的進程,只不過和其餘進程共享資源(內存空間 全局數據等等);其餘系統都有各自的LWP(Light Weight Process輕量級進程)的實現,高層面理解:一個進程中不一樣的執行路線併發

3. 纖程

纖程/協程(Fiber)(線程中的線程):jvm是運行在用戶空間的,jvm的線程與操做系統的線程是一 一對應的,jvm新開一個線程須要經過系統調用,經過內核建立,而後再同步回用戶態;而纖程是在jvm的一個線程裏面分出來的分支,不須要跟操做系統內核打交道,也不會跟操做系統的線程一 一對應,切換快速,是在jvm層面調度的,用戶態的線程,切換和調度不須要通過osjvm

優點:
一、佔資源少,os線程須要1M,Fiber:4k, 二、切換比較簡單,
三、啓動不少個 目前支持內置纖程的語言:Kotlin,Scala,Go,Python(lib),java(沒有內置、盼望內置)在類庫(quasar-core)級別能夠支持
應用場景:很短的計算任務,不須要和內核打交道,併發量高
imagespa

4. 內核線程

內核線程:內核啓動以後常常要作一些後臺操做,這些由Kernel Thread來完成,只在內核空間運行,用戶態不能訪問操作系統

5. 進程調度

進程(任務)調度:內核進程調度器決定,該哪一個進程容許,什麼時候運行,運行多長時間,這個過程叫作進程調度,linux下:每一個進程都有本身的調度方案,能夠自定義,可是linux內核有許多內置的調度方案,不須要咱們本身寫線程

5-1.單任務:一個操做系統上面只能幹一件事兒

image

5-2.多任務:

能夠多個進程運行,分搶佔式和非搶佔式,(如今呢大可能是搶佔式,由進程調度器控制)
image協程

5-3.linux2.5採用O(1)調度策略

linux2.5採用O(1)調度策略,好比每一個進程分配10毫秒,偏向服務器,可是對交互不友好,好比有的進程比較着急,可是也須要排隊等待一個10毫秒

linux2.6採用CFS(Completely Fair Scheduler)調度策略,按優先級分配時間片的比例,記錄每一個進程的執行時間,若是有一個進程執行時間不到應該分配的比
image

5-4.進程調度的基本概念

image

5-5.linux默認的調度策略:

實時進程(急診)優先級分高低-FIFO(優先級高的先執行),優先級同樣-RR(round robin);普通進程:CFS
image

6.中斷:

硬中斷:鍵盤、網卡、打印機等硬件進行的中斷,中斷處理機制的實現細節,好比: 一、鍵盤按下會產生一箇中斷信號傳遞給一個芯片(中斷處理器),而後中斷處理器告訴給cpu,二、cpu根據中斷向量表找到固定的處理程序,三、而後這個處理程序將這個中斷信號交給內核(kernel),四、內核找到中斷處理程序開始處理,找到正在運行的程序當中正在等待鍵盤輸入的程序,五、而後纔是程序開始處理
image

軟中斷(十六進制的80中斷):軟件給的中斷,系統調用的操做都會進行軟中斷,如今的硬件層面的支持有sysenter
image

上一篇:https://segmentfault.com/a/11...
下一篇:https://segmentfault.com/a/11...

相關文章
相關標籤/搜索