Memory Management
向slab要記憶體,slab跟body system要
用page為單位配置記憶體可以避免不同process互相讀取記憶體
libC的配置演算法可以多看看。
因為microC是及時OS,所以可以做出假設:
free除了要給指標外,還要知道要歸還給哪個partition,因為切的大小不一樣。
這邊要加後半部分的判斷據說很簡單。
partition彼此之間無法轉換空間,slab可以把partition中沒有在用的部分還給body system。
2009-05-20
2009-05-18
5/18 OS上課筆記
雖然把for loop攤開來寫這個區段的執行速度會變快。
但是...
├好的compiler會自動攤開手動容易出握不容易抓bug
├雖然這段速度變快但是整體程式效率不一定會提升
└程式效率下降
┌→從ready queue搬到waiting queue或其他的搬運
程式在搬運時,是參照task的priority般的。
OS_EventTO()
─TimeOut
如果等太久,那就把他kill掉。ex:因為網路線掉了封包沒等到
在程式裡加上timeout,基本上可以避免Deadlock。
被叫醒的task要看是誰叫醒的(檢查flag),像白馬王子叫醒的話要微笑史瑞克的話要尖叫。
pend可以這樣用
xxx_pend() 集合後
xxx_post()一起執行
Semaphore
但是...
├好的compiler會自動攤開手動容易出握不容易抓bug
├雖然這段速度變快但是整體程式效率不一定會提升
└程式效率下降
┌→從ready queue搬到waiting queue或其他的搬運
程式在搬運時,是參照task的priority般的。
OS_EventTO()
─TimeOut
如果等太久,那就把他kill掉。ex:因為網路線掉了封包沒等到
在程式裡加上timeout,基本上可以避免Deadlock。
被叫醒的task要看是誰叫醒的(檢查flag),像白馬王子叫醒的話要微笑史瑞克的話要尖叫。
pend可以這樣用
xxx_pend() 集合後
xxx_post()一起執行
Semaphore
2009-05-13
5/13 OS上課筆記-2
while loop外無保護
跳出ctrial section時,有可能會把while loop所在的task拆掉,那要再回去while loop就會爛掉...
剩下的時間在看網概...
跳出ctrial section時,有可能會把while loop所在的task拆掉,那要再回去while loop就會爛掉...
剩下的時間在看網概...
5/13 OS上課筆記
如果算tic的部分priority太低,會出現時間半卡住狀態。
idle task是ready queue中最後一個,也是系統開起來的第一個task。
休息狀態(waiting queue)的task要
1)在等的資源可以被使用
2)休息時間到了
3)其他task用resume呼叫
4)輪到了
idle task是ready queue中最後一個,也是系統開起來的第一個task。
休息狀態(waiting queue)的task要
1)在等的資源可以被使用
2)休息時間到了
3)其他task用resume呼叫
4)輪到了
2009-05-11
5/11 OS上課筆記-2
ossched要call時,要看是在啥狀態下calldelete。
OSTimeDelay
1)task從ready queue移除
2)OsTCBDelay 這個task想要睡多久
OSTimeTick()
├完全使用c語言
└重要的是他的演算法
cpu最後會呼叫中斷向量
OSTCBList()
語無倫次我腦袋有洞漏掉了...
OSTimeDelay
1)task從ready queue移除
2)OsTCBDelay 這個task想要睡多久
OSTimeTick()
├完全使用c語言
└重要的是他的演算法
cpu最後會呼叫中斷向量
OSTCBList()
語無倫次我腦袋有洞漏掉了...
5/11 OS上課筆記
如果有一段critical section的程式碼太長,會有task被暫停過長、IO效率低落等後果。
DI
preemption point : INT/HPT(hight priority task)
EI
TaskDelete
1) 為了刪掉task 把狀態設為ready 這樣就不會被rusume叫起來繼續執行
(髒寫法:和原來意思南轅北轍)
2)
os ctrtical section太常對系統效能不好
至於kernel tast允不允許nesting interrupt巢狀中斷,要看對kernel的設計。
當A把B殺掉後不需要重新排程,A不等於B。
因為A還在執行,最高先權還是他,所以不用排。
換言之,只有自殺才需要重新排成,因為現在執行的位置空出來了。
但是自殺也有好處,因為如果是threed自殺,會順便free掉占用的resource。
另外直接讓A砍掉B也會有問題,因為那些佔用的資源還沒有終止。
while loop內要寫一個OsTimeDelay,不然大者恆大!!
五哥曰:要理解一下喔
OS:i well try to...
傳參數進去判斷是誰要他掛:自己、TaskMenerger、HighPriorityTask
刪完之後要記得跑os_tcb,把waiting/reacy queue還有其他東西都重新整理。
將複雜運算提到criticl section外,縮短長度。
必須等到所有的事件都發生了才可以執行。
DI
preemption point : INT/HPT(hight priority task)
EI
TaskDelete
1) 為了刪掉task 把狀態設為ready 這樣就不會被rusume叫起來繼續執行
(髒寫法:和原來意思南轅北轍)
2)
os ctrtical section太常對系統效能不好
至於kernel tast允不允許nesting interrupt巢狀中斷,要看對kernel的設計。
當A把B殺掉後不需要重新排程,A不等於B。
因為A還在執行,最高先權還是他,所以不用排。
換言之,只有自殺才需要重新排成,因為現在執行的位置空出來了。
但是自殺也有好處,因為如果是threed自殺,會順便free掉占用的resource。
另外直接讓A砍掉B也會有問題,因為那些佔用的資源還沒有終止。
while loop內要寫一個OsTimeDelay,不然大者恆大!!
五哥曰:要理解一下喔
OS:i well try to...
傳參數進去判斷是誰要他掛:自己、TaskMenerger、HighPriorityTask
刪完之後要記得跑os_tcb,把waiting/reacy queue還有其他東西都重新整理。
將複雜運算提到criticl section外,縮短長度。
必須等到所有的事件都發生了才可以執行。
2009-05-06
5/6 OS上課筆記
XXXXX用來看堆疊使用率。
mem由下往上填0。
因為都填0會造成誤判,所以microC就填怪值。
kernel內的大array要記得malloc,不可直接用。
不能用StackPointer(SP值)來算堆疊使用率,因為SP值是目前使用率,不是最高使用率。
所以要數0!!
一般來說stack不需要初始化,除非在debug。
Deletimg a Task
─判斷在ready/waiting queue,並從中移走。
刪除task,之前跟系統要的resource都要free掉。
─要的記憶體、open的file、開的socket
microC/OSII中沒有辦法直接free,只會刪除。(????)
1)錯誤檢查:存在與否
2)從queue中移走
3)插入一個preemption point
─和卡位很像,打開中斷向量(interrupt)。
4)
5)從priority table中移走
6)叫OSSched()
─自殺才需要→最高優先權者才有辦法自殺→因為最高優權者不見了所以ready queue需要改
mem由下往上填0。
因為都填0會造成誤判,所以microC就填怪值。
kernel內的大array要記得malloc,不可直接用。
不能用StackPointer(SP值)來算堆疊使用率,因為SP值是目前使用率,不是最高使用率。
所以要數0!!
一般來說stack不需要初始化,除非在debug。
Deletimg a Task
─判斷在ready/waiting queue,並從中移走。
刪除task,之前跟系統要的resource都要free掉。
─要的記憶體、open的file、開的socket
microC/OSII中沒有辦法直接free,只會刪除。(????)
1)錯誤檢查:存在與否
2)從queue中移走
3)插入一個preemption point
─和卡位很像,打開中斷向量(interrupt)。
4)
5)從priority table中移走
6)叫OSSched()
─自殺才需要→最高優先權者才有辦法自殺→因為最高優權者不見了所以ready queue需要改
訂閱:
文章 (Atom)