2009-05-20

5/20 OS上課筆記

Memory Management

向slab要記憶體,slab跟body system要


用page為單位配置記憶體可以避免不同process互相讀取記憶體


libC的配置演算法可以多看看。


因為microC是及時OS,所以可以做出假設:


free除了要給指標外,還要知道要歸還給哪個partition,因為切的大小不一樣。
這邊要加後半部分的判斷據說很簡單。


partition彼此之間無法轉換空間,slab可以把partition中沒有在用的部分還給body system。

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

2009-05-13

5/13 OS上課筆記-2

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)輪到了

2009-05-11

5/11 OS上課筆記-2

ossched要call時,要看是在啥狀態下calldelete。



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外,縮短長度。


必須等到所有的事件都發生了才可以執行。

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需要改