高頻面經彙總:https://blog.csdn.net/qq_40262372/article/details/116075528
十二、作業系統
12.1 (1次)程序與線程
12.1.1程序
程序是程式的一次執行過程,是系統運作的基本機關,是以程序是動态的(很多次執行)。系統運作一個程式是一個程序建立、運作到消亡的過程。
在JAVA中,當我們啟動Main函數其實就是啟動了一個JVM的程序,而Main函數所在的線程就是這個程序中的一個線程,也稱為主線程。
在Windows中,我們可以通過任務管理器看我們電腦運作着這那些程序。
12.1.2線程
線程與程序相似,但線程是一個比程序更小的執行機關。一個程序在其執行過程中可以産生多個線程。與程序不同的是同類的多個線程共享程序的堆和方法區資源,但每個線程有自己的程式計數器、本地方法棧、虛拟機棧。是以系統在産生一個線程,或是在各個線程之間做切換工作時,負擔要比程序小得多,也正因為如此,線程也被稱為輕量級程序。
Java程式天生就是多線程程式我們可以通過JMX來看一下一個普通的Java程式有那些線程,代碼如下。

輸出下面的多個線程。
從上面的輸出内容可以看出:一個Java程式的運作是main線程和多個其他線程同時運作。
12.2(2次)程序通信
什麼方式通信最快
共享記憶體是最快的
實作原理:當兩個程序通過頁表将虛拟位址映射到實體位址時,在實體位址中有一塊共同的記憶體區,即共享記憶體,這塊記憶體可以被兩個程序同時看到。這樣當一個程序進行寫操作,另一個程序讀操作就可以實作程序間通信。但是,我們要確定一個程序在寫的時候不能被讀,是以我們使用信号量來實作同步與互斥。
12.3 (2次)僵屍程序
運作程式的時候,一個父程序可能會有多個子程序跑
子程序執行完畢後會發送一個exit()信号,父程序沒有去處理,導緻這個子程序一直在程序表中。
解決方法:
1.重新開機伺服器電腦
2.找到僵屍程序的父程序殺掉 kill -9,而不是去殺僵屍線程。
12.4(1次)孤兒程序
父程序退出後,而它的子程序還在運作,那麼這些子程序就是孤兒程序。
解決方法:
成了孤兒程序後,有init程序對它進行操作,最後孤兒程序在init程序下結束生命周期。
12.5(2次)實體記憶體和虛拟記憶體
實體記憶體:硬體實際的記憶體大小,比如常見的500G硬碟,32G的U盤等。500G、32G指的是實體記憶體
虛拟記憶體:是計算機系統中一種記憶體管理技術,因為計算機記憶體的造價比較高,一般常見記憶體8G,而計算機的應用軟體都是在記憶體中運作,每個應用都會占一定的記憶體,這就導緻一個問題,如果計算機同時運作很多軟體,使計算機的記憶體空間很容易被占滿,那麼計算機就無法運作使用者的下一個應用了,直到空出足夠的記憶體。虛拟記憶體技術就是解決使用者記憶體不足的問題,當執行程式占用了大部分記憶體,導緻目前記憶體不足以支撐下一個應用時,系統便會”拿”出一部分實體記憶體來充當記憶體使用。具體操作流程是這樣的,程勳運作的時候,可以先将一部分需要運作的程式裝入記憶體,剩餘部分暫且放在外存,當這部分運作結束需要運作下一部分時,将已運作的部分從記憶體轉移到外存,同時将外存需要的那部分轉移到記憶體,這樣就可以避免因為記憶體不足引起的程式無法運作的問題。
12.6Linux指令
Kill
指令格式:kill [參數][程序号]
工作原理:
向Linux系統的核心發送一個系統操作信号和某個程式的程序辨別号,然後系統核心就可以對程序辨別号進行操作。
應用:
1.強行中止程序 kill -9 324 強行終止程序辨別号為324的程序
2.解除Linux系統的死鎖 可以發生程式崩潰,并且處于死鎖狀态,我們不需要重新開機,直接殺死程序即可。
3.使用指令回收記憶體。 可以用使用top 指令發現無用的程序,然後殺死。
12.7Linux的硬連結和軟連結
硬連結:假設B是A的硬連結,那麼他們兩個指向了同一個檔案!允許一個檔案擁有多個路徑,使用者可以通過這種機制來建立硬連結到一些重要檔案上,防止誤删!
軟連結:類似Windows下的快捷方式,删除了源檔案,快捷方式也通路不了
建立方式: