系統程式5. 以軟硬體來區分
硬體
電腦
系統程式:與硬體相關的程式,例如WINDOWS,
軟體 UNIX,SERVER2003, WinCE(PDA)
應用程式:解決一般的應用問題,使用者無需
知道硬體細節內容
8. 作業系統(OS)
作業系統(Operating System):負責控管電腦
O
的軟體及硬體的工作方式。
I/O(Input/Output):滑鼠,鍵盤,螢幕
硬體控管:CPU,記憶體管理,I/O,主機板上的晶片組,介面卡,硬碟
機,光碟機,磁碟機,USB,網路…
軟體控管:批次作業,多程式作業,分時作業,即時作業,行程控制,
BIOS程式,CMOS設定,DRIVER(驅動程式)…
14. 重新定位
有效位址 重新定位暫存器
8192 16384
原始程式 ⊕ 24576
重新定位後
做加法
重新定位暫存器內的值由OS給與
33. 識別識別字流程
取字元
字母? NO
YES
合成識別字及取下一字元
字母或數字? NO
YES
34. 語法分析
依據規則判定一個算式是一個合法的敍述。
1 <指定叙述> → <識別字> = <運算式>
2 <運算式> → <項> + <運算式>
3 <運算式> → <項>
優
先 4 <項> → <因子> * <項>
權
5 <項> → <因子>
6 <因子> → <識別字>
7 <因子> → <常數>
8 <因子> → (<運算式>)
35. 推導算式 id1=id1+id2*20 是否是一個合法的叙述。
語法錯誤?
由規則1,得到<指定叙述>→<識別字> = <運算式>
由規則2,將<運算式>替換成<項> + <運算式>,得到<識別字> = <項> + <運算式>
由規則5,將<項>替換成<因子>,得到<識別字> = <因子> + <運算式>
由規則6,將<因子>替換成<識別字>,得到<識別字> = <識別字> + <運算式>
由規則3,將<運算式>替換成<項>,得到<識別字> = <識別字> + <項>
由規則4,將<項>替換成<因子> * <項>,得到<識別字> = <識別字> + <因子> * <項>
由規則6,將<因子>替換成<識別字>,得到<識別字> = <識別字> + <識別字> * <項>
由規則5,將<項>替換成<因子>,得到<識別字> = <識別字> + <識別字> * <因子>
由規則7,將<因子>替換成<常數>,得到<識別字> = <識別字> + <識別字> * <常數>
結論:語法正確! 1 <指定叙述> → <識別字> = <運算式>
2 <運算式> → <項> + <運算式>
3 <運算式> → <項>
4 <項> → <因子> * <項>
5 <項> → <因子>
6 <因子> → <識別字>
7 <因子> → <常數>
8 <因子> → (<運算式>)
36. 語法樹
指定叙述
<指定叙述>→<識別字> = <運算式>
識別字 = 運算式 <識別字> = <項> + <運算式>
<識別字> = <因子> + <運算式>
<識別字> = <識別字> + <運算式>
項 + 運算式 <識別字> = <識別字> + <項>
<識別字> = <識別字> + <因子> * <項>
因子 <識別字> = <識別字> + <識別字> * <項>
<識別字> = <識別字> + <識別字> * <因子>
識別字 <識別字> = <識別字> + <識別字> * <常數>
項
1 <指定叙述> → <識別字> = <運算式>
2 <運算式> → <項> + <運算式>
因子 * 項
3 <運算式> → <項>
識別字 4 <項> → <因子> * <項>
5 <項> → <因子>
因子
6 <因子> → <識別字>
7 <因子> → <常數>
整數
8 <因子> → (<運算式>)
41. 四元式
例如:
SUM=SUM+DATA*20 (SUM及DATA為浮點數,使用ITR表示型態轉換)
OP ARG1 ARG2 RESULT
1 ITR 20 - T1
2 * DATA T1 T2
3 + SUM T2 T3
4 = T3 SUM
42. 四元式
例如:
ID1=ID1+ID2*20 (ID1及ID2為浮點數,使用ITR表示型態轉換)
OP ARG1 ARG2 RESULT
1 ITR 20 - T1
2 * ID2 T1 T2
3 + ID1 T2 T3
4 = T3 - ID1
43. 四元式
例如:
a||b&&c==d (布林代數運式,「&&」的優先權大於「||」)
OP ARG1 ARG2 RESULT
1 == c d T1
2 && b T1 T2
3 || a T2 T3
44. 四元式
例如:
if A then B else C (jnz:jumpNotZero若為真則跳。 j:jump跳躍)
OP ARG1 ARG2 RESULT
1 jnz A - K
2 j - - M+1
K B的動作……
OP ARG1 ARG2 RESULT
M j - - R
M+1 C的動作……
R
49. 代碼最佳化(共同子運算式删除)
k=1; k=1;
m=k*20; m=k*20;
n=j+y; n=j+y;
p=k*20; p=m;
因為m=k*20的
值保留到執行
p=k*20都没有
變化,所以令
p=m即可
50. 代碼最佳化(迴圈不變數外提)
k=0;
k=0;
r=1;
r=1;
do{ f=r+100;
w=6*r; d=c+50;
f=r+100; do{
d=c+50; w=6*r;
}while(r<3); }while(r<3);
將其移
迴圈內的二行指令 到迴圈
的值在迴圈內是維 外圍
持一個常數,反覆
的計算只會浪費時
間
54. 上下文無關文法
Backus-Naur Form(BNF)規則:
1 <ex> := <ex> + <term>
2 <ex> := <ex> - <term>
3 <ex> := <term>
4 <term> := <term> * <factor>
5 <term> := <term> / <factor>
6 <term> := <factor>
7 <factor> := (<ex>)
8 <factor> := 0|1|2|3|4|5|6|7|8|9
如果可以導出,則稱為語法正確,否則稱為語法錯誤
55. 優先權
低 高
ex term factor
+ * ()12345
- / 67890
優先權:决定那一個運算子要先做,例如先乘除後加減
57. 導出「1+2*3」的文法
1
<ex> → <ex> + <term>
3
→ <term> + <term> 1 <ex> := <ex> + <term>
2 <ex> := <ex> - <term>
6
→ <factor> + <term> 3 <ex> := <term>
8 4 <term> := <term> * <factor>
→ 1 + <term> 5 <term> := <term> / <factor>
4 6 <term> := <factor>
→ 1 + <term> * <factor> 7 <factor> := (<ex>)
6 8 <factor> := 0|1|2|3|4|5|6|7|8|9
→ 1 + <factor> * <factor>
8
→ 1 + 2 * <factor>
8
→ 1+2*3
執行時,由下往上,由左至右,優先權愈高,愈會在下方
58. 畫出「1+2*3」的剖析樹
<ex>
1
1 <ex> := <ex> + <term>
2 <ex> := <ex> - <term>
<ex> + <term>
3 <ex> := <term>
3 4
4 <term> := <term> * <factor>
<term>
<term> * <factor> 5 <term> := <term> / <factor>
6 <term> := <factor>
6 6
8 7 <factor> := (<ex>)
<factor> 3 8 <factor> := 0|1|2|3|4|5|6|7|8|9
<factor>
8 8
1 2
剖析樹
59. 練習1*2+3
<ex>
1
1 <ex> := <ex> + <term>
<ex> + <term> 2 <ex> := <ex> - <term>
3 6 3 <ex> := <term>
<term> <factor> 4 <term> := <term> * <factor>
4 5 <term> := <term> / <factor>
8
6 <term> := <factor>
<term> * <factor>
7 <factor> := (<ex>)
6 3
8 8 <factor> := 0|1|2|3|4|5|6|7|8|9
<factor> 2
8
1
剖析樹
60. 導出(1+2)*3
3
<ex> → <term>
4
→ <term> * <factor> 1 <ex> := <ex> + <term>
2 <ex> := <ex> - <term>
6
→ <factor> * <factor> 3 <ex> := <term>
7 4 <term> := <term> * <factor>
→ (<ex>) * <factor>
5 <term> := <term> / <factor>
1→ (<ex> + <term>) * <factor> 6 <term> := <factor>
7 <factor> := (<ex>)
3→ (<term> + <term>) * <factor> 8 <factor> := 0|1|2|3|4|5|6|7|8|9
6
→ (<factor> + <term>) * <factor>
8→ (1 + <term>) * <factor>
6
→ (1 + <factor>) * <factor>
8
→ (1 + 2) * <factor>
8
→ (1 + 2) * 3
61. 練習1+(2*3)
<ex>
1
1 <ex> := <ex> + <term>
<ex> + <term> 2 <ex> := <ex> - <term>
3 6 3 <ex> := <term>
<term> <factor> 4 <term> := <term> * <factor>
6 5 <term> := <term> / <factor>
7
6 <term> := <factor>
<factor> (<ex>)
7 <factor> := (<ex>)
8 3 8 <factor> := 0|1|2|3|4|5|6|7|8|9
<term>
1
4
<term> * <factor>
6 8
<factor> 3
8 剖析樹
2
62. 練習1*(2+3)
<ex>
3
<term> 1 <ex> := <ex> + <term>
4
2 <ex> := <ex> - <term>
<term> * <factor> 3 <ex> := <term>
6 7 4 <term> := <term> * <factor>
<factor> 5 <term> := <term> / <factor>
(<ex>)
6 <term> := <factor>
8 1 7 <factor> := (<ex>)
8 <factor> := 0|1|2|3|4|5|6|7|8|9
<ex> + <term>
1
3 6
<term>
6 <factor>
<factor> 8
8 3 剖析樹
2
64. 文法規則、語法圖與c語言程式碼
文法規則
<A>→<B> <C> <D>
角括角代表
函數呼叫 語法圖
A B C D
void A()
呼叫副函數 {
B();
C();
D();
c語言程式碼
}
68. 文法規則、語法圖與c語言程式碼
<A>→C|(<B>)
A
C
( B ) void A()
{
if(symbol == 'C') return;
else if (symbol == '(' )
{ B();
if(symbol != ')') syntax_error=1;
}
else syntax_error=1;
}
71. 文法規則、語法圖與c語言程式碼
void S()
{
S A( );
A ‧
if(symbol == '.') return;
else error();
}
A
X voidA()
{
switch(symbol)
( A ) {
case 'x': return;
case '(': A( );
while(symbol == '+') A( );
A + if(symbol != ')' ) error( );
break;
default:
文法部分: error( );
<S>→<A>. }
<A>→X|(A{+<A>}) }
72. 文法規則範例
角括角代表
函數呼叫
上例文法部分:
<S>→<A>.
<A>→X|(A{+<A>})
OR
while迴圈(大括號)
遞迴
遞迴:程式自己呼叫自己
78. 由後序式算出答案
98 7 2 ^ / 4 5 * + 2 3 * -
狀況 處置
數字 放入堆疊
pop上面两個數值出來,
運算符號
運算後,再放回堆疊
79. 由後序式算出答案
98 7 2 ^ / 4 5 * + 2 3 * -
2 3
5
7 20 2 * 6 -
^ 49 / 4 * +
98 2 22 22 16
98 2
狀況 處置
數字 放入堆疊
pop上面两個數值出來,
運算符號
運算後,再放回堆疊
82. 中序轉後序語法圖
第一運算元 運算子
void E()
{
E char OP;
T
T( );
while(symbol=='+' || symbol=='-')
+ {
T OP = symbol;
putchar(OP); GetNextSymbol( );
- T( );
putchar(OP);
}
}
運算子
第二運算元
將運算符號放在兩
個運算元的後面
OP = symbol;
GetNextSymbol( );
1/3
83. 中序轉後序語法圖
void T()
{
T char OP;
F
F( );
while(symbol=='*' || symbol=='/')
* {
F OP = symbol;
putchar(OP); GetNextSymbol( );
/ F( );
putchar(OP);
}
}
將運算符號放在兩
個運算元的後面
2/3
84. 中序轉後序語法圖
void F()
{
F if (symbol == '(' )
( E )
{
GetNextSymbol( );
E( );
GetNextSymbol( );
}
else if(operand(symbol))
{
0 1 ‧‧‧ 9
putchar(symbol);
GetNextSymbol( );
}
}
輸出數值
輸出數值
3/3
90. 處理單元之狀態
OS 將尚未載入
記憶體的工作 由長程排班器(Long-
(JOB)記錄到磁 Term Scheduler)將工
碟工作區中 作(Job)從硬碟載入到
記憶體中
新工作
Complete
Running
Blocked
Time out
New Dispatch
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
預備狀態 Blocked
Suspend
Ready
91. 處理單元之狀態
短程排班器(Short-
Term Scheduler)將
CPU的使用時間交
執行中狀態 給預備佇列(Ready
List)中的某一處理單
新工作 元(Process)
完成狀態
Running Complete
Blocked
New Time out Dispatch 等待 狀態(Blocked)
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
預備狀態 Blocked
Suspend
Ready 暫停的等
暫停的等 待 狀態
待 狀態
93. 處理單元之狀態
等待 狀態(Blocked),等待
的原因:等待I/O,或執行
到wait()指令
Complete
Running
Blocked
Time out
New Dispatch
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
Blocked
Suspend
Ready
94. 處理單元之狀態
Complete
Running
Blocked
Time out
New Dispatch
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
Blocked
Suspend
Ready
睡醒 狀態(Wakeup),睡醒
的原因:已完成I/O指令,
或執行到Signal()指令
95. 處理單元之狀態
處理單元(process)執行完
畢,或使用者中止該處理單
元,或處理單元發生錯誤
Complete
Running
Blocked
Time out
New Dispatch
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
Blocked
Suspend
Ready
96. 處理單元之狀態
Complete
Running
Blocked 解除暫停
Time out
New Dispatch
Blocked
Ready Wakeup
Resume
Suspend Resume Suspend Suspend
Blocked
Suspend
Ready
暫停的等
待 狀態
暫停 狀態(suspend),可能的原
因:系統失常,或工作量太大需
要暫停一些處理單元的執行
99. 中斷
中斷:改變執行流程的事件。
1. 作業系統取得控制權。
2. 作業系統將被中斷的處理單元的狀態儲存到處理單元控制區塊(PCB)
中。
3. 執行中斷處理程式。
4. 取回處理單元控制區塊(PCB)的狀態,並恢復執行被中斷的程式。
102. 排班程式
CPU使用率:
CPU執行處理單元所佔用的時間
CPU使用率 = *100%
CPU執行處理單元所佔用的時間 + CPU閒置的時間
生產量:(Throughput):單位時間內完成處理單元的數量。
返轉時間(Turnaround Time):一個處理單元由進入到系統到處理完畢所需要的時間。
回應時間(Respond Time):一個處理單元由進入到系統到第一次產生輸出所需要的時間。
等待時間(Waiting Time):一個處理單元在佇列中等待的時間。
103. 排班程式
先到先服務 FCFS(First Come First Serve):有若排隊,先到的程式先
執行,後到的程式後執行。
A B C
0 22 26 35
0 + 22 + 26
平均等待時間 = = 16
3
22 + 26 + 35
平均返轉時間 = = 27.6
3
104. 排班程式
巡迴服務 RR(Round Robin):有若排隊,先到的程式先執行,後到的程
式後執行。但多了配額時間(Time Quantum),在時間用完後,若程式
尚未執行完畢,則必需重新排隊。例如:有三個程式A, B, C,執行
時間分別為18,6,3,則排班如下:
A B C A B A A A
0 4 8 11 15 17 21 25 27
0 + 4 + 8 + (11 − 4) + (15 − 8) + (17 − 15)
平均等待時間 = = 9 .3
3
27 + 17 + 11
平均返轉時間 = = 18.3
3
109. 死結的避免
處理單元的需求量
安全狀態 不安全狀態
銀行家演算法
分配資源 等待狀態
110. 死結的避免
Allocation Max
Process
A B C A B C
1 1 2 0 6 7 2
2 4 0 1 4 2 2
3 0 3 2 8 3 2
4 1 1 2 3 1 2
5 2 0 0 3 4 3
A, B, C的資源數量分別為12, 7, 9 Allocation: 已分配的資源數量
Max: 最大資源需求量
Process: 處理單元
112. 死結的避免
Allocation Max
Process
A B C A B C
1 1 2 0 6 7 2
2 4 0 1 4 2 2
3 0 3 2 8 3 2
4 1 1 2 3 1 2
5 2 0 0 3 4 3
Available[A]=12-(1+4+1+2)=4
Available[B]=7-(2+3+1)=1 Need
Process
Available[C]=9-(1+2+2)=4 A B C
1 5 5 2
2 0 2 1
3 8 0 0
4 2 0 0
5 1 4 3
116. 分頁系統
分頁系統需要有一個「頁映成表」 (Page Map
Table,PMT)來處理「動態位址轉換」 (Dynamic
Map Table,DAT)。
頁映成表需要有一個「頁映成表基底暫存器」(Page
Map Table Base Register,PMTBR)儲存頁映成表
的起始位址。
117. 頁映成表
索引 頁幅編號 頁幅位址 PRB
0 2 F800 1
1 4 D300 0
2 1 EF00 1
頁映成表的內容:
頁駐存位元(Page Resident Bit),若為1,則表示此頁儲
存在記憶體中,若為0,則表示此頁儲存在次記憶體中。
此頁在記憶體中的位址(頁幅位址)。
此頁在記憶體中的頁幅編號。
由邏輯記憶體所計算出來的索引值。
118. 分頁記憶體管理
邏輯位址
CPU p d OS
Base
實際位址
p f d
Base ⊕
頁映成表基底
暫存器
f f'
實際記憶體
A→ 邏輯位址
q→頁的大小 p = A div q
頁映成表
p→頁數 d = A mod q
d→位移量
div→取整數型式的商數。 mod→取餘數。
119. 分頁記憶體管理
高位元 低位元
部分 部分
頁幅 實際位址 資料
索引 頁幅 0
頁 頁位移 資料 0 2 0 1
0 D0 1 4 2
0 1 D1 2 1 3 D6
2 D2 1 4 D7
頁映成表
3 D3 5 D8
1 4 D4 6 D0
5 D5 2 7 D1
6 D6 8 D2
2 7 D7 9
8 D8 3 10
邏輯記憶體 頁映成表本身為一 11
張對照表 12 D3
原始程式 4 13 D4
14 D5
若4KB為一頁的話,則低位元的12bit會形成頁位移 實際記憶體
(offset),而高於12bit的部分會形成頁(page)。
120. 分頁記憶體管理
頁 頁位移 資料 索引 頁幅
0 D0 0 2 頁幅 實際位址 資料
0 1 D1 1 4 0
2 D2 2 1 0 1
3 D3 頁映成表 2
1 4 D4 3 D6
5 D5 1 4 D7
6 D6 5 D8
2 7 D7 6 D0
8 D8 2 7 D1
邏輯記憶體 8 D2
9
若每頁的大小為4個字組(Word),若資料D5的位址為5,頁映成表基
3 10
底暫存器值=0,計算頁與頁位移如下:
11
p = 5 div 4 = 1 (商數為頁) (div為整數除法)
12 D3
d = 5 mod 4 = 1 (餘數為頁位移) (mod 為求餘數)
4 13 D4
p + b = p + 0 = 1 (求出索引值) 14 D5
由索引值知道資料放在第四頁中,再由頁位移加上頁映成表中所記錄
實際記憶體
的頁幅的基底位址(起始位址),可得知實際位址。
125. 直接映成
邏輯位址
CPU p d OS
Base
實際位址
p f' d
Base ⊕
頁映成表基底
暫存器
f f'
實際記憶體
頁映成表
利用頁映成表基底暫存器找出頁映成表所在的地方,再由邏輯位址中的頁數找出相對應的實際記憶體
的頁數。實際記憶體的位移量仍引用原來的邏輯位址位移量。
126. 聨合映成
邏輯位址
CPU p d OS
實際位址
f d
搜尋 f f'
實際記憶體
頁映成表
頁映成表置於快取記憶體中,利用搜尋的方式,找出相對應的實際記憶體的頁數。 實際記憶體的位移
量仍引用原來的邏輯位址位移量。
127. 聨合/直接映成
邏輯位址
搜尋
CPU p d OS
Base
實際位址
p f d
Base ⊕
頁映成表基底
暫存器
f f'
實際記憶體
頁映成表
先到快取記憶體中找出相對應的實際記憶體的頁數,若找到,則使用之。若找不到,才利用頁映成表
基底暫存器找出頁映成表所在的地方,再由邏輯位址中的頁數找出相對應的實際記憶體的頁數。實際
記憶體的位移量仍引用原來的邏輯位址位移量。
128. 最久未用頁取代法(LRU)
1 2 3 4 5 6 7 8 9 10 11 12
A B C D C A A D B B E C
A 1 A 1 A 1 D 4 D 4 D 4 D 4 D 8 D 8 D 4 E 11 E 11
B 2 B 2 B 2 B 2 A 6 A 7 A 7 A 7 A 7 A 7 C 21
C 3 C 3 C 5 C 3 C 3 C 3 B 9 B 01 B 01 B 01
最久未用頁取代法(Least Recently Used):依照記錄的時間,將最近不常用的頁更換掉。為較常用的方法。
時間
欲使用的頁
129. 最久未用頁取代法(LRU)
1 2 3 4 5
A B C A D
A 1 A 1 A 1 A 4 A 4
B 2 B 2 B 2 D 5
C 3 C 3 C 3
與上例比較,若D在加入前,A又被使用一次,則B將被替換。