1. 程式人生 > 其它 >作業系統原理實驗錯題&知識點

作業系統原理實驗錯題&知識點

作業系統原理實驗錯題&知識點

一、常見訊號
SIGHUP(1):從終端結束通話或退出正在執行的前臺程序
kill -1
SIGINT(2):中斷(同Ctrl-C)
kill -2
SIGKILL(9):強制殺死該程序。該訊號不能被捕獲或忽略,同時接收該訊號的程序在收到該訊號時不能執行任何清理。
kill -9
SIGALRM(14):鬧鐘。
(Kill預設情況)SIGTERM(15):終止。傳送訊號給程序,告訴程序,你需要被關閉,請自行停止執行並退出。
kill -15
SIGUSR1(16):使用者自定義訊號1
SIGUSR1(17):使用者自定義訊號2

二、程序管理重要命令
檢視程序
ps [選項] 檢視程序靜態統計資訊
top [選項] 檢視程序動態資訊,每3s重新整理一次
pstree [選項] 檢視程序樹,明確程序間父子關係
啟動程序
Shell命令& 手工啟動——後臺啟動
控制程序
kill [-9] 程序號 根據程序號PID強制終止程序和子程序

三、程序
1、建立pid_t fork(void); 標頭檔案#include<unistd.h> #include<sys/types.h>
2、獲取程序標識號pid_t getpid(void); pid_t getppid(void);
3、等待子程序終止 標頭檔案#include<sys/wait.h> #include<sys/types.h>
pid_t wait(int *status);
4、正常終止void exit(int status);

四、POSIX執行緒 標頭檔案#include<pthread.h>
1、建立int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
2、終止void pthread_exit(void *retval);
3、等待int pthread_join(pthread_t thread, void **retval);
4、建立互斥鎖int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t
*restrict attr);
5、鎖定互斥鎖(P操作)int pthread_mutex_lock(pthread_mutex_t *mutex);
6、解除互斥鎖(V操作)int pthread_mutex_unlock ( pthread_mutex_t *mutex );

五、POSIX訊號量 標頭檔案#include<semaphore.h>
1、初始化int sem_init(sem_t *sem,int pshared,unsigned int value);
2、訊號量-1(P操作)int sem_wait(sem_t *sem);
3、訊號量+1(V操作)int sem_post(sem_t *sem);
4、獲取訊號量的值int sem_getvalue(sem_t *sem);

六、System Ⅴ訊號量 標頭檔案#include<sys/sem.h>
1、建立訊號量semget()
2、改變訊號量值semop()

七、程序通訊——訊號


1、設定訊號 標頭檔案#include<signal.h>
(1)void (*signal(int signum,void(* handler) (int)))(int);
(2)int sigaction(int signum,conststruct sigaction *act,struct sigaction *oldact));
2、向任何程序/程序組傳送任何訊號 標頭檔案#include<signal.h> #include<sys/types.h>
(1)kill(pid_t pid, int sig);
(2新)int sigqueue(pid_t pid, int sig,const union sigval val)
3、定時傳送SIGALRM的訊號:unsigned int alarm(unsigned int seconds)
4、讓程序暫停直到訊號出現:int pause(void);

八、程序通訊——共享記憶體
1、建立 標頭檔案#include <sys/ipc.h> #include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg)
2、對映 標頭檔案#include <sys/types.h> #include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg)
對映到呼叫程序的地址空間,隨後就可方便地對共享區域進行訪問操作
3、解除對映 標頭檔案#include <sys/types.h> #include <sys/shm.h>
int shmdt(const void *shmaddr)
解除程序對共享記憶體區域地對映
4、共享記憶體管理 標頭檔案#include <sys/types.h> #include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf)

九、程序通訊——管道
int pipe(fildes);
int fildes[2];
建立程序間通訊,返回兩個描述
fildes[0]讀管道
fildes[1]寫管道

十、程序通訊——訊息佇列
1、建立或訪問 int msgget(key_t key,int msgflg);
2、操作——傳送訊息int msgsnd(int msqid,const void *msg,size_t nbytes,int msgflg);
3、操作——接收訊息ssize_t msgrcv(int msqid,void *msg,size_t nbytes,long msgtype,int msgflg);
4、控制int msgctl(int msqid,int cmd,struct msqid_ds *buf);

十一、常見裝置檔案
1、SCSI裝置:/dev/sd[a-z]
2、虛擬終端:/dev/tty[0-63]
3、/dev/cdrom

十二、下述程式碼執行後,共產生(4)個程序,輸出(8)個字元'a'?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i=0; i<2; i++)
{
fork();
printf("a");
}
wait(NULL);
wait(NULL);
return 0;
}
解析:i=0,父程序通過fork生成一個子程序,父程序和子程序各輸出一個a。
i=1,因為沒有\n,緩衝區未清空,兩個程序各輸出一個a,兩個程序各自通過fork生成一個子程序,此時共4個程序,然後4個程序各自輸出一個a,故總共輸出8個a。

十三、下述程式碼執行後,共產生(4)個程序,輸出(6)個字元'a'?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i=0; i<2; i++)
{
fork();
printf("a\n");
}
wait(NULL);
wait(NULL);
return 0;
}
解析:因為有\n,所以緩衝區會被清空,產生4個程序,輸出6個a。

十四、收到訊號的程序對各種訊號有不同的處理方法。處理方法可以分為三類:第一種是類似中斷的處理程式,對於需要處理的訊號,程序可以指定處理函式,由該函式來處理:第二種方法是,忽略某個訊號,對該訊號不做任何處理,就像未發生過一樣;第三種方法是,對該訊號的處理保留系統的預設值。程序通過系統呼叫(signal、sigaction)來指定程序對某個訊號的處理行為。

十五、下列哪些函式或系統呼叫涉及傳送訊號:
A、signal() 程序通訊——訊號 建立
B、alarm() 程序通訊——訊號 傳送ALRM訊號
C、sigqueue() 程序通訊——訊號 傳送
D、sigaction() 程序通訊——訊號 建立
E、raise()
F、pause() 程序通訊——訊號 掛起直至訊號出現
G、kill() 程序通訊——訊號 傳送訊號
答案:BCEG

十六、如果在程式碼中沒有使用IPC_RMID命令手動刪除共享記憶體,則共享記憶體並不會隨著程序的終止而自動清理。 √

十七、訊息佇列的資料結構msgid_ds中登記了訊息的最後傳送程序的PID,和最後接收程序的PID。
答案:× 包含最後傳送程序的時間和最後接收程序的時間。

十八、一般在一個程序中先用pipe建立管道,再用fork建立子程序,然後通過管道,再用fork建立子程序,然後通過管道實現父子程序間的通訊。

十九、在建立Linux分割槽時,至少要建立的兩個分割槽是:SWAP/根分割槽

二十、檢視Linux kernel版本資訊的命令:uname

二十一、下列關於Linux核心的說法,正確的是:A
A、Linux有多種發行版本,如ubuntu、debian。但是其核心均道循GNU的GPL。
B、核心原始碼通過編譯,生成可執行程式碼檔案後,必須安裝在/boot目錄下,才起作用。
C、核心原始碼只要通過編譯,生成了可執行程式碼檔案(例如bzimage),就起作用了。
D、Linux的核心,絕大部分原始碼是公開的,除了極少量與CPU型別密切相關的程式碼段。

二十二、Linux作業系統核心使用哪種作業系統結構:單核心(巨集核心)結構

二十三、在Linux程序管理的重要資料結構task_struct中,volatile long state表示程序狀態,unsigned int flags表示程序標誌

二十四、Linux的目錄結構中,/dev存放裝置相關檔案,/usr/src存放原始碼,/proc是虛擬目錄,是系統記憶體的對映,訪問記憶體資訊:cat /proc/meminfo,訪問CPU資訊:cat /proc/cpuinfo

二十五、Linux核心支援幾平所有的CPU架構。為此,滿足特定CPU特定要求的操作程式碼,可以在(/arch)子目錄找到

二十六、Linux核心主要由 程序排程、記憶體管理、虛擬檔案系統、網路介面、程序間通訊 五個子系統組成

二十七、Linux作業系統支援的程序間通訊機制:訊號Signals、管道Pipe、命名管道Named Pipe、System Ⅴ的IPC機制(訊號量Semaphore、訊息佇列機制Message Queues Mechanism、共享記憶體Shared Memories)…

二十八、Linux核心原始碼目錄:/arch體系結構,/drivers裝置驅動程式,/ipc包含核心程序間的通訊程式碼,/kernel核心管理的核心程式碼

二十九、在Linux核心中,程序識別符號PID為0的程序是:空閒程序。程序識別符號PID為1的程序是:init/systemd程序(程序1)

三十、How could you get a list of all running processes?
:ps ax

三十一、Linux程序:是執行的程式,是程式的一次動態執行過程,是在自身的虛擬地址空間執行的一個單獨程式。
重要資料結構:PCB程序控制塊

三十二、Linux程序狀態:
TASK_RUNNING執行狀態
TASK_INTERRUPTIBLE可中斷的睡眠狀態
TASK_UNINTERRUPTIBLE不可中斷的睡眠狀態
TASK_STOPPED暫停狀態
TASK_TRACED跟蹤狀態
EXIT_ZOMBIE殭屍狀態
EXIT_DEAD殭屍撤銷狀態

三十三、ps命令返回的結果的STAT/S欄位:程序當前的狀態

三十四、結束程序方法:
<Ctrl+c>組合鍵 kill [-s 訊號 | -p][ -a] 程序號

三十五、(signal)不屬於Linux的檔案

三十六、下述哪種IPC效率最高?
A、管道
B、共享記憶體 √
C、訊息佇列
D、訊號

三十七、訊息佇列是採用連結串列資料結構實現的, writer 程序在鏈尾輸入資料, read 程序在鏈首讀出資料. 因此它只支援單向通訊。 ×雙向通訊。

三十八、Linux系統中,檔案描述符1表示:標準輸出裝置檔案描述符。檔案描述符0表示:標準輸入裝置檔案描述符

三十九、(/dev/tty1)裝置是字元裝置,(IDE硬碟)是塊裝置

四十、分時系統不需要多道程式技術的支援。
×

四十一、進行程式的相對地址到實體地址的轉換,就是地址重定位。

四十二、程序切換在核心態。

四十三、mutual exclusion互斥 critical section臨界區 concurrent process 並行程式 Synchronization同步

四十四、分段儲存管理每一段必須是連續的儲存區

四十五、在固定分割槽分配中,每個分割槽的大小是:可以不同但預先固定

四十六、考慮頁面置換演算法,系統有m個物理塊供排程,初始時全空,頁面引用串長度為p,包含了n個不同的頁號,無論用什麼演算法,缺頁次數不會少於:n

四十七、程序在執行中發生了缺頁中斷,經作業系統處理後,應讓其執行(被中斷的那一條)指令。

四十八、共享記憶體允許兩個或多個程序共享一定的儲存區,因為不需要拷貝資料,所以這是最快的一種IPC。