0827

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寄存器狀態等數據。

進程切換損耗較大:進程切換虛擬內存空間不同,需要從硬盤加載對應的頁,重構頁表;另外一個隱藏的損耗是上下文的切換會擾亂處理器的緩存機制

發佈了34 篇原創文章 · 獲贊 7 · 訪問量 2362
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章