程序、虛擬記憶體概念與擴充套件
阿新 • • 發佈:2019-01-26
程序
作業系統程序相關概念
關鍵名詞
- 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、在訪問狀態變數時使用同步鎖
記憶體
虛擬記憶體
- 虛擬記憶體圖解
- 頁面置換演算法