1. 程式人生 > >程序、虛擬記憶體概念與擴充套件

程序、虛擬記憶體概念與擴充套件

程序

作業系統程序相關概念

關鍵名詞

  • process:一個正在執行程式的例項,包括程式計數器、暫存器、變數的當前值。
  • critical region:對共享記憶體進行訪問的程式片段
  • semaphore:可以同時操作共享記憶體的數目
  • mutex:兩種狀態解鎖和枷鎖

程序執行緒區別

  • 程序:每個程序都有一個地址空間(存放可執行的程式、程式的資料、程式堆疊)和一個控制執行緒。
程序 執行緒
地址空間、全域性變數、開啟的檔案 程式計數器
子程序 暫存器、堆疊
賬戶資訊 狀態

程序、執行緒實現

程序維護一個數據結構:包含程序所必須的先關資源(程序控制塊)

執行緒:核心態、使用者態、混合使用

程序通訊

  • pipe(一個命令的輸出作為另一個命令的輸入) :shell bash(>ps -e | grep vmware //顯示vmware相關程序)
  • 訊息傳遞:kill -signal PID
  • 套接字、共享記憶體、檔案、訊號量

程序排程

Cooperative Threads-Scheduling:程式自主控制
Preemptive Threads-Scheduling:優先順序佇列

Java多執行緒相關概念

基本的執行緒機制

  • 定義任務:implements Runnable
public class
LiftOff implements Runnable {
protected int countDown = 10; //Default private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){} public LiftOff(int countDown) { this.countDown = countDown; } public String status() { return "#" + id + "("
+ (countDown > 0 ? countDown : "Liftoff!") + ")."; } @Override public void run() { while(countDown-- > 0) { System.out.print(status()); Thread.yield(); } System.out.println(id); } }
  • Thread類:使用new Thread(Runnable object).start()執行任務。由執行緒排程器排程執行。
public final static void main(String[] args) {
    //new LiftOff().run(); // 通過方法在一個執行緒內呼叫

    for(int i = 0; i < 5; i++) {
        new Thread(new LiftOff()).start();
    }
    System.out.println("Waiting for LiftOff.");
}
  • 使用Executor執行器
public static final void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool();
    //Executors.newFixedThreadPool(5);
    //Executors.newSingleThreadExecutor();

    for(int i=0; i<5; i++) {
        exec.execute(new LiftOff());
    }

    exec.shutdown();
    System.out.println("Waiting for LiftOff.");
}
  • 從任務中產生返回值 implements Callable<T>
  • 休眠:Thread.sleep(100);TimeUnit.MILLISECONDS.sleep(100);
  • 優先順序:
  • 讓步:yield

共享受限資源

  • 不正確訪問時導致資源的競爭衝突。
  • 解決共享資源競爭:synchronized、顯示靈活的加鎖Lock:new ReentrantLock()物件
  • 原子性與記憶體可見性volatitle變數和同步加鎖
  • 原子類AtomicInteger, AtomicLong, AtomicReference
  • 臨界區·synchronized(this)物件同步程式碼塊
  • 在其他物件上加鎖synchronized(object)
  • 執行緒本地儲存

終結任務

  • 統計進入各個門的人數。
  • 阻塞的方法
    • sleep
    • wait —— notify、notifyAll(signal,signalAll)
    • 等待輸入、輸出
    • 獲取同步控制方法時鎖不可用

執行緒之間的協作

  • wait,notify,notifyAll
  • 生產者、消費者:BlockingQueue

執行緒安全性、物件的共享

  • race condition:由於不恰當的執行時序而出現不正確的結果。
    • 例如:check-then-act;延遲初始化
    • 解決:
    • 原子變數類如java.util.concurrent.atomic.AtomicLong
    • 內建鎖(複合操作): synchronized——同步程式碼塊、方法。內建鎖的可重入性。
    • 加鎖機制既可以確保可見性又能確保原子性;volatile變數只能確保可見性。
//解決併發程式設計的方案
1、不線上程之間共享該狀態變數
2、將狀態變數修改為不可變的變數
3、在訪問狀態變數時使用同步鎖

記憶體

這裡寫圖片描述

虛擬記憶體

  • 虛擬記憶體圖解

【vm1】

【vm2】

  • 頁面置換演算法

【pa】

各種快取實現例項