Operating system 作業系統
中斷(Interrupt)介紹
中斷是現今對稱多處理中重要的機制,一般CPU同一時間只能處理一個指令,當這個CPU被某個行程占用時,只有透過中斷來讓CPU處理其他行程的指令。一般作業系統的中斷分為硬體和軟體中斷:
- 硬體中斷: CPU運行某個指令,發生錯誤,應而被迫中斷。或者由I/O發起硬體訊號,而將CPU中斷。
- 軟體中斷: CPU執行組合語言中的中斷指令(像是 INT 3)
行程(process)形成的中斷有可能是由:
- 程式邏輯所導致,像是整數除以0、…(硬體中斷)
- 發生系統呼叫(fork, print,…),行程將會被kernel接手,處理完才將控制權交給行程(軟體中斷)
中斷的過程:
- CPU將當前的狀態(PCB)做暫存
- CPU根據中斷向量找尋到作業系統(OS)中所對應的中斷程式ISR (Interrupt Service Routine)
- CPU執行OS的中斷程式
- 執行完後,OS會讓行程回復之前狀態並繼續執行
Note: 使用者也可以自行增加Linux的中斷程式,需修改和重新編譯Kernel
Signal與中斷的關係:
Signal是一種行程與行程之間的溝通,被稱為Inter-Process Communication的一種,行程與行程的溝通也包含了Kernel對process的溝通。在執行自己所寫的C語言程式,如果執行期間中,使用者在命令列(bash)輸入Crtl+c,程式將會結束。此行為就是bash送"結束信號"給程式,而程式本身收到此信號會觸發對應結束信號的callback function(Signal handler),並結束。以下是C語言實作處理Signal的小程式:
#include <signal.h>#include <stdio.h>void sighandler(int signum) { if (signum == SIGINT){ printf("crtl+c: %d\n", signum); exit(1); } else if(signum == SIGTSTP) printf("crtl+z: %d\n", signum);}
int main(){ signal(SIGINT, sighandler); signal(SIGTSTP, sighandler);
while(1){}}
Linux中,Signal總共有64個,在bash 輸入 kill -l 會列出所有結束信號:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
…
以 SIGFPE來說,一般C語言程式接收到此信號,會透過組合語言執行中斷向量的 04H(溢出),並結束。