※ 引述《ch890333 (紅狼)》之銘言:
> Typically, at the completion of a device I/O, a single interrupt is raised
> and appropriately handled by the host processor. In certain settings,96
> however, the code that is to be executed at the completion of the I/O
> can be broken into two separate pieces, one of which executes imme-
> diately after the I/O completes and schedules a second interrupt for
> the remaining piece of code to be executed at a later time. What is the
> purpose of using this strategy in the design of interrupt handlers?
The purpose of this strategy is to ensure that the most critical
aspect of the interrupt handling code is performed first and the less
critical portions of the code is delayed for the future.
這種兩截式策略是為了確保中斷重要的部份可以先被執行,不那麼重要的部份可以稍晚執行。
For instance, when a device finishes an I/O operation, the device control
operations corresponding to declaring the device as no longer being busy are
more important in order to issue future operations.
像是一個裝置完成IO後,會馬上發表相對聲明︰『我很閒!!!』以表明未來可以接受排程。
However, the task of copying the data provided by the device to the
appropriate user or kernel memory regions can be delayed for a future
point when the CPU is idle.
不過,像是把IO動作所copy的內容顯示給使用者或塞進kernel記憶體這些事情就可以讓CPU在未來有空的時候再做。
In such a scenario, a latter lower priority interrupt handler is used to perform the copy operation.
在這種情況下,(比基尼…我是說兩截式通知的)下半截/延遲/沒那麼重要的通知就會被運用在copy操作中。
--
快來人找我去翻譯課本!!
2009-05-20
5/20 OS上課筆記
Memory Management
向slab要記憶體,slab跟body system要
用page為單位配置記憶體可以避免不同process互相讀取記憶體
libC的配置演算法可以多看看。
因為microC是及時OS,所以可以做出假設:
free除了要給指標外,還要知道要歸還給哪個partition,因為切的大小不一樣。
這邊要加後半部分的判斷據說很簡單。
partition彼此之間無法轉換空間,slab可以把partition中沒有在用的部分還給body system。
向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
但是...
├好的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-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需要改
2009-04-29
4/29 OS上課筆記
interrupt under uC/OSII
p.62
這個地方用驅動程式底層當例子。
基本上很難看出有interrupt過,除非詳細看過時間。
使中斷enable的code出現在程式開始沒多少。
水藍色:
橘紅色:
(2)的OSInNesting是因為中斷可巢狀,但在OSInNesting==1才需要寫irt。
排程器如果發現目前task和要切過去的task相同,則直接return,不動作。跳(8)
(5)中斷
(6)沒有這行就不能巢狀中斷
同一類的中斷不要用nesting發生第二次,會rest condition。因為重要性一樣,就FIFO就好了。
巢狀是為了在優先權低的中斷發生時,讓高權重的中斷可以搶先。
通常低優先權的中斷不能在高優先權中段時搶先,不論軟硬體皆然。不過也只是"通常"。
例外:Timer沒那麼重要,但是對系統架構很重要,所以可搶先。
窩窩窩喔喔 ch3結束
ch4開始
規定"ISR內不可以create task"
OSTCBInit()用來填參數,沒有就塞0。
OSTaskCreatHook() 方便大家使用的plug-in,本身就是空的大括號。
p.62
這個地方用驅動程式底層當例子。
基本上很難看出有interrupt過,除非詳細看過時間。
使中斷enable的code出現在程式開始沒多少。
水藍色:
橘紅色:
(2)的OSInNesting是因為中斷可巢狀,但在OSInNesting==1才需要寫irt。
排程器如果發現目前task和要切過去的task相同,則直接return,不動作。跳(8)
(5)中斷
(6)沒有這行就不能巢狀中斷
同一類的中斷不要用nesting發生第二次,會rest condition。因為重要性一樣,就FIFO就好了。
巢狀是為了在優先權低的中斷發生時,讓高權重的中斷可以搶先。
通常低優先權的中斷不能在高優先權中段時搶先,不論軟硬體皆然。不過也只是"通常"。
例外:Timer沒那麼重要,但是對系統架構很重要,所以可搶先。
窩窩窩喔喔 ch3結束
ch4開始
規定"ISR內不可以create task"
OSTCBInit()用來填參數,沒有就塞0。
OSTaskCreatHook() 方便大家使用的plug-in,本身就是空的大括號。
2009-04-13
2009-04-08
4/08 OS上課筆記
p.34~35
全部都放在critical section內一定不會出錯(沒保護到),但是在多序執行時速度會變慢,網路傳輸狀況就是封包會掉。
這邊的保護可否用semephor來取代?
DI semlock EI semunlock
台灣的劉小姐:最好不要,因為.....
重點:要保護的東西在哪?有誰會讀取?
這邊的物件在ready queue內,只有ap本身可以存取。
後面這邊(p.35)
老師認為不可以
ISR結束後會去抓,.....
Linux:比較短的寫在前面,比較長的寫後面。方便閱讀。
p.36
Ready Queue
p.37
電腦如何知道在表中找到ready(1)者?
1)for loop
p.40 41
會考算法,必考。
全部都放在critical section內一定不會出錯(沒保護到),但是在多序執行時速度會變慢,網路傳輸狀況就是封包會掉。
這邊的保護可否用semephor來取代?
DI semlock EI semunlock
台灣的劉小姐:最好不要,因為.....
重點:要保護的東西在哪?有誰會讀取?
這邊的物件在ready queue內,只有ap本身可以存取。
後面這邊(p.35)
老師認為不可以
ISR結束後會去抓,.....
Linux:比較短的寫在前面,比較長的寫後面。方便閱讀。
p.36
Ready Queue
p.37
電腦如何知道在表中找到ready(1)者?
1)for loop
p.40 41
會考算法,必考。
2009-03-25
3/25 OS上課筆記
3/23老師放假
TCB 第一個欄位擺的是sp(stack pointer),指向目前task堆疊用到的位置。
之後上到組語部分,就會進行更進一步的介紹。
要用syscall->contask switch,不要直接修改。
1個contask最多等一個時間中斷。
prio算出值很無聊,改變頻率也不高,所以就先算好。
以上就是恐龍本中的tcb。
暫存器why only one??
sp Regs PC psw
有出現 這些都在stack中
從TCB中把p30那四行拿掉,在每次的scadal都抓一次就好。
Q: 只能在critical section中,表示有改變外面的全域變數。可不可以用secmafer取代??
TCB 第一個欄位擺的是sp(stack pointer),指向目前task堆疊用到的位置。
之後上到組語部分,就會進行更進一步的介紹。
要用syscall->contask switch,不要直接修改。
1個contask最多等一個時間中斷。
prio算出值很無聊,改變頻率也不高,所以就先算好。
以上就是恐龍本中的tcb。
暫存器why only one??
sp Regs PC psw
有出現 這些都在stack中
從TCB中把p30那四行拿掉,在每次的scadal都抓一次就好。
Q: 只能在critical section中,表示有改變外面的全域變數。可不可以用secmafer取代??
2009-03-18
3/18 OS上課筆記
了解這個章節恨重要
ready queue CPU使用率
當被兩個行程(process)鎖定時,XX要xxxxx。
最主要還是要看規格對reader和writer的解讀。
criitical section 用enable / disable interrupt 來保護。
在xxxx,全部執行在kernel mode。
AP1(void* pdata){
semlock();
counter ++;
semunlock();
}
AP2(){
sem
print(counter);
sem
}
關於sem的程式大概2.30行,用這些去保護一行有點浪費.....
在嵌入式當中
AP1(){
PI();
print(counter);
EI();
}
AP2(){
DI;
print(counter);
EI;
}
這兩三個cycle就做完了,用兩行保護一行比較划算。
因為這樣(disable interrupt),所以小型嵌入式系統長期下timer會少算,一段時間後就需要調校。
有一種不可以用!!!!!不然系統會一睡不醒!!!!
****有包含timer的東西不可以包在disinterrupt內,因為不知道時間過了沒.....
-> 晚上嫌鬧鐘滴答聲吵拆電池,結果早上就起不了床....
在x86中,剛好可以執行。
生:剛好???
五哥:剛剛好會講到XDDD
因為在86的idel task中,有一行程式碼會把中斷打開。
fu1(){
PI();
fn2();
EI(); 這邊之後的保護被fu2打開了!!!!
}
fu2(){
DI;
print();
EI;
}
有兩種可以把interrupt的狀態存起來
第一種:stack
第二種:任何都可以
第三種:在這種情況下和第二種一樣 p12
因為xxx,有的時候會因為指定task id所以無法運作,這是ucosII中的小瑕疵。
Idel task會織毛線(counter+1)
TCB (Task Control Blocks)
只要TCB存在,就會出現在link-list中。
double link-list就是刪除很方便XDDD
p22
Cur / Rdy
這兩個變數重複了,因為普通狀況下都一樣,只有在發生contask switch的時候會不一樣。
A換到B時,Cur指A,Rdy指B。
第五個變數表示陣列,之前講過。
裡面都存指標,用來指到TCB。
contask switch時,就是在算新task的優先權。
查表 -> 比較優先權 -> 抓task -> 完成cntask switch
查TCB在上學期恐龍本中,要存什麼東西?
那些東西在p23中,是不是都一樣?恐龍本中的少了哪些?
ready queue CPU使用率
當被兩個行程(process)鎖定時,XX要xxxxx。
最主要還是要看規格對reader和writer的解讀。
criitical section 用enable / disable interrupt 來保護。
在xxxx,全部執行在kernel mode。
AP1(void* pdata){
semlock();
counter ++;
semunlock();
}
AP2(){
sem
print(counter);
sem
}
關於sem的程式大概2.30行,用這些去保護一行有點浪費.....
在嵌入式當中
AP1(){
PI();
print(counter);
EI();
}
AP2(){
DI;
print(counter);
EI;
}
這兩三個cycle就做完了,用兩行保護一行比較划算。
因為這樣(disable interrupt),所以小型嵌入式系統長期下timer會少算,一段時間後就需要調校。
有一種不可以用!!!!!不然系統會一睡不醒!!!!
****有包含timer的東西不可以包在disinterrupt內,因為不知道時間過了沒.....
-> 晚上嫌鬧鐘滴答聲吵拆電池,結果早上就起不了床....
在x86中,剛好可以執行。
生:剛好???
五哥:剛剛好會講到XDDD
因為在86的idel task中,有一行程式碼會把中斷打開。
fu1(){
PI();
fn2();
EI(); 這邊之後的保護被fu2打開了!!!!
}
fu2(){
DI;
print();
EI;
}
有兩種可以把interrupt的狀態存起來
第一種:stack
第二種:任何都可以
第三種:在這種情況下和第二種一樣 p12
因為xxx,有的時候會因為指定task id所以無法運作,這是ucosII中的小瑕疵。
Idel task會織毛線(counter+1)
TCB (Task Control Blocks)
只要TCB存在,就會出現在link-list中。
double link-list就是刪除很方便XDDD
p22
Cur / Rdy
這兩個變數重複了,因為普通狀況下都一樣,只有在發生contask switch的時候會不一樣。
A換到B時,Cur指A,Rdy指B。
第五個變數表示陣列,之前講過。
裡面都存指標,用來指到TCB。
contask switch時,就是在算新task的優先權。
查表 -> 比較優先權 -> 抓task -> 完成cntask switch
查TCB在上學期恐龍本中,要存什麼東西?
那些東西在p23中,是不是都一樣?恐龍本中的少了哪些?
2009-03-16
3/16 OS上課筆記
今天的小考題目:semaphore oprtation 和 dis/enable interrupt 兩者都是衛了保護資料的程式。那投影片37頁的程式可不可以帶換成後者?
在xx狀況之下,zz會掉封包。
在xx狀況下,任何interrupt都進不去,所以I/O會有問題。
五哥:今天題目出的不錯,不過有點難,啊,不過分數也不要緊。
critical section藉由鎖定程式,來保護資料。
五哥:早知道就上個禮拜六(白色情人節)來補課。
生:why??
五哥:因為我見不得人好!!!!(崩潰~~ 強烈的去死光芒啊~~)
TASK1:這兩個fun只能在PC平台上使用。
p52: task5回'嗯',task4聽到後就繼續講。
p.55
Linux2.6中幾個行程就會出現幾個堆疊,都是全4k或全8k。
Linux2.4堆疊和2.6剎不多,就少了xx的stack。堆疊量的配置一定是8k,因為要預留4k給isr使用。所以比較浪費空間。
xxxxxxxxxx
μC/OSII最快,因為它最浪費記憶體。
在xx狀況之下,zz會掉封包。
在xx狀況下,任何interrupt都進不去,所以I/O會有問題。
五哥:今天題目出的不錯,不過有點難,啊,不過分數也不要緊。
critical section藉由鎖定程式,來保護資料。
五哥:早知道就上個禮拜六(白色情人節)來補課。
生:why??
五哥:因為我見不得人好!!!!(崩潰~~ 強烈的去死光芒啊~~)
TASK1:這兩個fun只能在PC平台上使用。
p52: task5回'嗯',task4聽到後就繼續講。
p.55
Linux2.6中幾個行程就會出現幾個堆疊,都是全4k或全8k。
Linux2.4堆疊和2.6剎不多,就少了xx的stack。堆疊量的配置一定是8k,因為要預留4k給isr使用。所以比較浪費空間。
xxxxxxxxxx
μC/OSII最快,因為它最浪費記憶體。
訂閱:
文章 (Atom)