西电Pintos操作系统课程设计 实验四
生活随笔
收集整理的這篇文章主要介紹了
西电Pintos操作系统课程设计 实验四
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)驗(yàn)四:Priority Scheduling—Donation for Locks
一、實(shí)驗(yàn)?zāi)康?/strong>
解決由lock造成的優(yōu)先級(jí)反轉(zhuǎn)問題。
二、實(shí)驗(yàn)方案
使用優(yōu)先級(jí)捐贈(zèng)(Priority Donation)來解決由lock造成的優(yōu)先級(jí)反轉(zhuǎn)問題。
優(yōu)先級(jí)捐贈(zèng)是指高優(yōu)先級(jí)的線程將自身優(yōu)先級(jí)捐給與其競爭資源的低優(yōu)先級(jí)線程,以促使其盡快釋放資源,進(jìn)而保證自身能盡快得到運(yùn)行所需資源的策略。
優(yōu)先級(jí)捐贈(zèng)主要分以下幾種情況:
1.簡單捐贈(zèng),這是最為平常和簡單的一種捐贈(zèng)情況。lock、優(yōu)先級(jí)流動(dòng)及線程執(zhí)行時(shí)間順序如下圖所示:
2.遞歸捐贈(zèng),這是一種較為復(fù)雜的情況。lock、優(yōu)先級(jí)流動(dòng)及線程執(zhí)行時(shí)間順序如下圖所示:
3.多重捐贈(zèng),這種情況也較為復(fù)雜。lock、優(yōu)先級(jí)流動(dòng)及線程執(zhí)行時(shí)間順序如下圖所示:
三、詳細(xì)實(shí)現(xiàn)
(1) 修改thread結(jié)構(gòu)體,新增三個(gè)量,一個(gè)base_priority記錄線程的初始優(yōu)先級(jí),一個(gè)locks記錄線程當(dāng)前擁有的鎖(多個(gè)),一個(gè)lock_waiting用來記錄線程等待被釋放的鎖。
(2) 修改lock結(jié)構(gòu)體,新增兩個(gè)量,一個(gè)elem記錄優(yōu)先級(jí)捐贈(zèng)的列表元素,一個(gè)max_priority記錄請求鎖的所有線程的最大優(yōu)先級(jí)。
(1) 修改init_thread()函數(shù),實(shí)現(xiàn)對thread結(jié)構(gòu)體中新增變量base_priority和lock_waiting的初始化。
(2) 修改lock_acquire()函數(shù),在獲取鎖之前循環(huán)更新所有參與嵌套的線程的優(yōu)先級(jí),即在P操作之前解決遞歸捐贈(zèng)的情況。然后在線程被喚醒之后讓該線程持有該鎖。
(3) 定義函數(shù)thread_hold_the_lock實(shí)現(xiàn)將一個(gè)鎖資源賦給線程。
(4) 定義函數(shù)thread_donate_priority實(shí)現(xiàn)較高優(yōu)先級(jí)線程將優(yōu)先級(jí)捐贈(zèng)給某一持有鎖的較低優(yōu)先級(jí)的線程。這里的優(yōu)先級(jí)捐贈(zèng)是通過修改鎖的最高優(yōu)先級(jí), 然后調(diào)用thread_update_priority ()更新被捐贈(zèng)線程的當(dāng)前優(yōu)先級(jí)實(shí)現(xiàn)的。
(5) 定義函數(shù)thread_update_priority ()實(shí)現(xiàn)線程優(yōu)先級(jí)的更新。該函數(shù)一方面被thread_donate_priority()函數(shù)調(diào)用以實(shí)現(xiàn)優(yōu)先級(jí)捐贈(zèng)操作,另一方面考慮到當(dāng)某線程釋放鎖之后,該線程的優(yōu)先級(jí)可能發(fā)生變化,可用thread_update_priority()函數(shù)來處理這個(gè)邏輯。
(6) 定義函數(shù)lock_cmp_priority()實(shí)現(xiàn)鎖隊(duì)列的排序。
(7) 定義函數(shù)thread_remove_lock()實(shí)現(xiàn)線程釋放鎖時(shí)進(jìn)行的操作,該函數(shù)將被synch.c中的lock_release()函數(shù)調(diào)用。
(8) 在lock_release()函數(shù)中添加相應(yīng)的語句調(diào)用(6)中的thread_remove_lock()函數(shù)。
(9) 在lock_release()函數(shù)中添加相應(yīng)的語句調(diào)用(6)中的thread_remove_lock()函數(shù)。
(10) 修改thread_set_priority()函數(shù)。如果沒有鎖,那么優(yōu)先級(jí)捐贈(zèng)的情況不用考慮,直接更新;如果更新的優(yōu)先級(jí)大于當(dāng)前線程的優(yōu)先級(jí),則更新當(dāng)前線程優(yōu)先級(jí)。總之,base_priority一定要在該函數(shù)中得到更新。
(11) 修改sema_up()和seme_down()函數(shù),將信號(hào)量的wait_list實(shí)現(xiàn)為優(yōu)先級(jí)隊(duì)列,即將wait_list中的線程按優(yōu)先級(jí)降序排列,該過程在實(shí)驗(yàn)三中已經(jīng)完成過一遍。
(12) 定義cond_sema_cmp_priority()函數(shù)實(shí)現(xiàn)條件變量wait_list中線程的優(yōu)先級(jí)比較,便于(12)中使用該函數(shù)作為list_sort()排序函數(shù)的參數(shù)。
(13) 修改 cond_signal()函數(shù),將條件變量的wait_list也改成優(yōu)先級(jí)隊(duì)列,其中l(wèi)ist_sort()排序函數(shù)使用(11)中的定義的比較函數(shù)作為參數(shù)。
四、實(shí)驗(yàn)結(jié)果
總結(jié)
以上是生活随笔為你收集整理的西电Pintos操作系统课程设计 实验四的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银河麒麟桌面操作系统 V10 SP1 安
- 下一篇: Unity3D脚本编程读书笔记——第3章