在分析alarm類之前,首先來了解一下什麼是nachos作業系統。
nachos的全稱是「not another completely heuristic operating system」,它是乙個可修改和跟蹤的作業系統教學軟體。它給出了乙個支援多執行緒和虛擬儲存的作業系統骨架,可讓學生在較短的時間內對作業系統中的基本原理和核心演算法有乙個全面和完整的了解。所以我們可以通過實現alarm類,來了解作業系統是如何控制程序的執行,模擬「定時器」作用。
(一)什麼是alarm類?它的作用是什麼?
alarm類相當乙個定時器,在實際對執行緒操作中非常有用,可以控制乙個執行緒在等待了具體的乙個時間之後再被執行,比如,游標的閃爍。具體到執行緒層面,就是讓執行緒中斷執行,睡眠乙個設定的時間之後再被喚醒繼續執行。
(二)alarm類實現思想
為了實現alarm類,對執行緒的執行進行控制,就要為每個執行緒繫結乙個「喚醒」的時間,這利用內部類很容易實現;為了設定定時器的時間間隔,還要有乙個方法來設定執行緒在等待多長時間後被喚醒;在等待時刻到來時,還要有乙個方法來喚醒應該被喚醒的執行緒,即到達了等待時間,需要喚醒系統中所有滿足時間要求應該被喚醒的執行緒。
系統應該如何判斷執行緒是否被喚醒呢?這就需要使用硬體中斷,每產生一次硬體中斷,就判斷一次,判斷是否有執行緒需要被喚醒加入到就緒佇列中。如果有,就迴圈喚醒它們。不過很容易地看出,通過「硬體中斷」產生的時間作為喚醒時間時,線**正被喚醒的時間刻與其理論上被喚醒的時刻有可能是不同的。比如:乙個執行緒在500時刻應該被喚醒,但硬體中斷產生的時間是480時刻、600時刻,那麼執行緒就會在600時刻被喚醒,而非480時刻。
(三)方法實現
(1)alarm類的初始化
linkedlist linklist=new linkedlist();//定義了乙個動態陣列
分析:為了實現「定時器」的作用,則alarm類要有乙個資料結構用來管理所有被「中斷等待一段具體時間」的執行緒,使用鍊錶來實現非常方便。
(2)將執行緒與乙個具體的「甦醒時間」繫結在一起的內部類。
public class kthreadwaketime
public kthread getthread()
public long getwaketime()
}
分析:該類的物件有兩個屬性:執行緒和時間,將執行緒與其可以被喚醒的時間繫結在一起。
(3)waituntil(long x)方法。設定執行緒在「至少」等待乙個「x」時間後被喚醒,擁有可以被執行的權利。
public void waituntil(long x)
}kthread.currentthread().sleep();//當前要等到waketime才被喚醒,所以加入到等待佇列中,並執行下一線程
machine.interrupt().restore(status);
}
分析:該方法的作用是把當前正在執行的執行緒睡眠「至少」x個ticks。在產生時間中斷的時候判斷其是否可以被喚醒。乙個在等待佇列中的執行緒必須在(current time) >= (waituntil called time)+(x)條件第一次符合時就被喚醒。
在乙個新的執行緒加入到alarm類的linklist動態陣列中時,要先計算其被喚醒的時間,然後為該執行緒建立乙個kthreadwaketime物件,將其加入到乙個記錄了所有等待執行緒的動態陣列。為了後續喚醒時的方便,在加入時按照被喚醒的時間從小到大進行排序。
在完成一系列操作之後,還要將當前執行緒睡眠,執行下一線程。
(4)timeinterrupt方法。判斷被中斷的執行緒是否可以被喚醒。
public void timerinterrupt()
else
}break;
}kthread.currentthread().yield();
machine.interrupt().restore(intstatus);
}
分析:在硬體每次產生時鐘中斷時會條用該方法,判斷是否有可以被喚醒的執行緒。
大約每500個時鐘週期就會被呼叫一次。
如果有可以被喚醒的執行緒,那麼就將其加入到就緒佇列中。通過乙個while迴圈判斷,所有滿足時間要求的執行緒,並將它們依次加入到就緒佇列中。
如果有需要執行的執行緒,就把當前執行緒強制退出,進行上下文切換,然後執行符合時間要求的第乙個執行緒。
(四)alarm類的測試
如果有在對alarm類進行測試時,可以建立幾個執行緒,然後呼叫waituntil(long x)方法,將執行緒等待乙個具體的時間,然後執行過程中,列印出產生中斷的時間和執行緒被喚醒的時間來理解執行緒延遲執行的具體過程。
(五)總結
總的來說,alarm類的實現還是比較簡單的。實現時最關鍵的部分是把執行緒與乙個喚醒的時間關聯在一起,用乙個動態陣列來管理所有被「停住」的執行緒。每次硬體產生中斷的時候都要判斷是否有滿足條件被喚醒的執行緒,執行timeinterrupt()方法進行判斷。如果有的話,當前執行緒讓出cpu,被喚醒的乙個執行緒開始執行。如果有多餘乙個執行緒同時被喚醒,則這個時候就會出現執行緒實際執行的時間並不是最初開始所設定的時間這種情況。
nachos作業系統 基於優先順序的執行緒排程
基於優先順序的執行緒排程 1.實驗目的 熟悉nachos作業系統,掌握執行緒優先順序的排程,深入理解作業系統核心,了解使用者程式的載入過程以及多使用者程序的記憶體分配機制。2.實驗內容 nachos 的執行緒管理模組公升級源 及實現執行緒的優先順序排程 3.實驗方法 實驗步驟 thread.h 檔案...
作業系統 中
1.什麼是虛擬記憶體?2.作業系統是如何管理虛擬位址與實體地址之間的關係?記憶體分頁 固定大小的頁 頁號 頁內偏移量。將虛擬記憶體和物理記憶體切成乙個個固定尺寸的大小,通過乙個中間值 頁表 來對應,每乙個頁表有固定數量的 頁表項 每乙個程序對應乙個頁表,所以每乙個頁表都是 固定的 大小,linux佔...
作業系統 作業系統介面
介面表現為函式呼叫,由作業系統提供,連線作業系統和應用軟體。出於安全性考慮,應用程式不能直接在記憶體中任意訪問 將核心程式和使用者程式隔離 通過比較訪問資料段cpl和rpl的特權級和當前段dpl的特權級之間的關係 應用程式呼叫庫函式printf printf呼叫庫中的write函式 write將函式...