1、Java併發包(3種)
2、系統調用和中斷(中斷處理過程)
3、紅黑樹插入終止條件、如何紅節點變黑節點
4、線程池,以及線程池的實現
5、進程切換和線程切換
1、Java併發包
基於鎖:LinkedBlockingQueue
基於CAS:基於分段鎖:ConcurrentHashMap(數組+鏈表(紅黑樹)):無hash衝突,CAS;有hash衝突,則Synchronized加數組中對應槽的鎖
基於CopyOnWrite:CopyOnWriteArrayList,CopyOnWriteArraySet
2、系統調用和中斷
中斷:外部中斷(硬件中斷)、內部中斷(軟中斷)
內部中斷:內存和CPU引起的中斷
外部中斷:可屏蔽中斷、不可屏蔽中斷(CPU,IF標誌位對其無影響;很嚴重,斷電,損壞)
條件:
①中斷源有中斷請求。
②CPU允許中斷(IF)及開中斷。
③一條指令執行完畢,沒有更緊迫的任務。
注意:I/O設備的就緒時間是隨機的,而CPU是在統一的時刻即每條指令執行階段結束前後,接口發出中斷查詢信號,以獲取I/O的中斷請求,
也就是說,CPU響應中斷的時間是在每條執行階段的結束時刻。這裏說的中斷僅指外中斷,內中斷不屬於此類情況。
系統調用 是一個軟中斷,中斷號是0x80,它是上層應用程序與Linux系統內核進行交互通信的唯一接口。
###中斷處理過程#####
牢記中斷處理過程:
1.關中斷(在此中斷處理完成前,不處理其它中斷)
2.保護現場
3.開中斷
4.執行中斷服務程序
5.關中斷
6.恢復現場
7.開中斷
①關中斷。
處理器響應中斷後,首先要保護程序的現場狀態,在保護現場過程張,CPU不應該響應更高級中斷源的中斷請求。
否則,如果現場保存不完整,在中斷服務程序結束後,就不能正確地恢復並繼續執行現行程序。
②保存斷點。爲了保證中斷服務程序執行完畢後正確地返回到原來的程序,必須將原來程序的斷點保存起來。
斷點可以壓入堆棧,也可以存入主存的特定單元中。
③引出中斷服務程序。取出中斷服務程序的入口地址(中斷向量)並傳送給程序計數器(PC).
通常由兩種方法尋址中斷服務程序的入口地址:
硬件向量法和軟件查詢法。
硬件向量法是通過引薦產生中斷向量地址,再由中斷向量地址找到中斷服務的入口地址,
軟件查詢法是用軟件編程的辦法找到入口地址。
注意:硬件產生的實際是中斷類型號。而中斷服務程序後首先要保存現場,
現場信息一般指的是程序狀態字、中斷屏蔽寄存器和CPU中某些寄存器的內容。
④保護現場和屏蔽字。進入中斷服務程序後首先要保存現場,現場信息一般指的是程序狀態字,中斷屏蔽寄存器和CPU中某些寄存器的內容。
⑤開中斷。這將允許更高級中斷請求得到響應,實現中斷嵌套。
⑥執行中斷服務程序。這是中斷系統的核心。
⑦關中斷。保證在恢復現場和屏蔽字時不被中斷。
⑧恢復現場和屏蔽字。將現場和屏蔽字恢復到原來的狀態。
⑨開中斷、中斷返回。中斷服務程序的最後一條指令通常是一條中斷返回指令,使其返回到源程序的斷點處,以便繼續執行遠程序。
其中,①-③在CPU進入中斷週期後,由中斷隱指令(硬件自動)完成;④-⑨由中斷服務程序完成。
注意:恢復現場是指在中斷返回前,必須將寄存器的內容恢復到中斷處理前的狀態,這部分工作由中斷服務程序完成,
中斷返回由中斷服務程序的最後一條中斷返回指令完成。
缺頁中斷與普通中斷的區別
1、缺頁中斷由軟件發起
2、可以在一條指令中發起多次。
3、缺頁中斷髮生在一條指令執行的時候
4、缺頁中斷後執行的語句還是被中斷的語句
3、紅黑樹插入終止條件、如何紅節點變黑節點
①插入爲紅色節點 ②滿足紅黑樹的5個條件
4、線程池,以及線程池的實現
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
public class MyThreadPool{
public static void main(String[] args) throws InterruptedException {
MyThreadPool excutor = new MyThreadPool(3);
for (int i = 0; i < 10; i++) {
excutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("線程 " + Thread.currentThread().getName() + " 在幫我幹活");
}
});
}
Thread.sleep(1);
excutor.shutdown();
}
private boolean SHUTDOWN = false;
LinkedBlockingQueue<Runnable> queue=new LinkedBlockingQueue<>();
private int coreThreadNum;
private int threadNum=0;
List<Thread> threads=new ArrayList<>();
class Worker implements Runnable{
Runnable firstTask=null;
public Worker(Runnable runnable) {
firstTask=runnable;
}
@Override
public void run(){
while(true){
if(SHUTDOWN){
break;
}
try {
if(firstTask!=null||(firstTask=queue.take())!=null){
firstTask.run();
firstTask=null;
}
}catch (Exception e){
System.out.println(e.toString()+"this?");
}
}
}
}
public MyThreadPool(int coreThreadNum) {
this.coreThreadNum = coreThreadNum;
}
public void execute(Runnable work){
if(threadNum+1>coreThreadNum){
try {
queue.put(work);
}catch (Exception e){
System.out.println(e.toString());
}
}else {
addThread(work);
}
}
private void addThread(Runnable work){
synchronized (this){
threadNum++;
Worker worker=new Worker(work);
Thread thread=new Thread(worker);
threads.add(thread);
thread.start();
}
}
private void shutdown(){
this.SHUTDOWN=true;
for(Thread thread:threads){
thread.interrupt();
}
}
}
5、進程切換和線程切換
進程切換:1.切換頁表以及使用新的地址空間;2、切換內核棧和硬件上下文
線程切換:切換內核棧和硬件上下文
進程上下文是進程執行活
動全過程的靜態描述:
①各種寄存器(例如通用寄存器,程序計數器PC,程序狀態字寄存器PS等)的值,
②程序段在經過編譯過後形成的機器指令代碼集,③數據集及各種堆棧值④PCB結構。
線程上下文:程序計數器、CPU寄存器狀態等數據。
進程切換損耗較大:進程切換虛擬內存空間不同,需要從硬盤加載對應的頁,重構頁表;另外一個隱藏的損耗是上下文的切換會擾亂處理器的緩存機制