os
又到了一年一度的期末考試階段,每到了這個階段,菜菜就會瑟瑟發抖,當然我也是其中的一個。一看标題,咦,OS實驗,這不是實驗課,還考試?
是的,你沒有看錯,在這門課有對應的理論課的情況下,這門課的考核方式不是大作業,而是考試!!!
那沒轍啊,咱也不敢說什麼,該複習複習喽,就一邊複習一遍做了張思維導圖,不過有一點要說明的是,因為後面時間來不及了,是以最後面的幾個寫的就比較的簡略了,以後看看吧,有時間的話考慮補一下。
先放張圖檔吧
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwMTN0kTO3QTMx0SOwYjMwYDNxEDNwcDMxIDMy0CNzgDNxIjMvw1NwEjMwIzLcRzM4QTMyIzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
可能有點糊,剛好Xmind可以導出成markdown,我就導出丢在下面了,就是看着挺亂的,我把xmind格式的檔案放在最下面了,有需要的可以自己下。下載下傳好後,可以裝個xmind,或者貌似wps也可以導入打開的,這就自己去嘗試吧!
檔案點這裡!!密碼是:osos
作業系統原理實驗
程序的建立和管理
程序的建立
pid_t fork(void);
頭檔案
#include<unistd.h>
#include<sys/types.h>
子程序擁有父程序的
PC
CPU寄存器
打開檔案
傳回值
父程序中
- 子程序PID
子程序中
- 0
ERROR
- 負數
fork被調用一次,會傳回兩次結果
新程序建立完後,父子程序會調用下一條語句
擷取程序辨別号
pid_t getpid(void);
傳回目前程序的PID
pid_t getppid(void);
傳回目前程序父程序的PID
等待子程序終止
pid_t wait(int *status);
使父程序阻塞,知道子程序結束,如果沒有子程序或子程序已經結束,會立刻傳回
子程序的PID
Failure
- -1
#include<sys/wait.h>
終止程序
void exit(int status);
孤兒程序
父程序退出,子程序仍在運作
僵屍程序
程序建立一個子程序,if子程序退出,父程序仍沒有通過wait或者waitpid擷取子程序的狀态資訊,那麼子程序的程序描述符仍儲存在系統中
關鍵語句
pid _t pid
pid=fork()
Wait(0)
Exit(0)
If (pid==0){……}
#include<sys/types.h
線程的建立與管理
pthread.h
連結
-lpthread
操作
定義線程
pthread_t p1;
建立新線程
Int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void (start_routine)(void *),void *arg)
參數
pthread_t *thread
- 指向線程辨別符的指針,傳回線程的ID
const pthread_attr_t *attr
- 用來設定線程屬性,NULL表示使用預設屬性
void (start_routine)(void *)
- 線程運作函數的起始位址
Void *arg
- 傳給線程啟動函數的參數
success
failure
- 錯誤碼
線程終止
void pthread_exit(void *retval)
retval
- 程序退出狀态,通常為NULL
傳回一個指向某個對象的指針
程序等待
int pthread_join(pthread_t thread,void **retval)
說明
以阻塞的方式等待thread指定的線程結束
thread
- 線程辨別符,ID
- 使用者定義的指針,用來存儲被等待線程的傳回值
- 錯誤号
互斥鎖
互斥鎖初始化
靜态互斥鎖
- PTHREAD_MUTEX_INITALIZER
動态互斥鎖
- pthread_mutex_init
鎖定
P操作
pthread_mutex_lock(&mutex)
釋放
V操作
pthread_mutex_unlock(& mutex)
fflush(stout)
強迫緩沖區内的資料寫回
pthread_create(&t1,NULL,p_msg,(void*)”hello”)
pthread_create(&t2,NULL,p_msg,(void*)”world”)
pthread_join(t1,NULL)
pthread_join(t2,NULL)
pthread_mutex_t mutex;
定義互斥鎖
pthread_mutex_init(&mutex,NULL)
初始化互斥量
gnum++;sleep(1);gnum++;
Gnum++幾次取決于MAX(i)-1
pthread_mutex_unlock(&mutex)
POSIX信号量
Linux信号量
核心信号量
使用者态信号量
有名信号量
- 值儲存在檔案中
無名信号量
- 值儲存在記憶體中
- 無名信号量必須是多個程序(線程)的共享變量,無名信号量要保護的變量夜必須是多個程序(線程)的共享變量
SYSTEM V信号量
一種用于提供不同程序間或給定一個程序的不同線程間的同步手段的原語
頭函數
semaphore.h
信号量初始化
int sem_init(sem_t *sem,int shared,unsigned int value)
sem_t *sem
- 信号量變量
int pshared
- 信号量類型
-
- 此信号量在相關程序間共享
- else
- 信号量隻在目前程序的所有線程共享
unsigned int value
- 指定信号量的初始值
- -1,并把errno設定為合适的值
信号量減一操作
int sem_wait(sem_t *sem)
等待信号量
信号量加一操作
int sem_post(sem_t *sem)
釋放信号量,讓信号量的值加一,若此時有sem_wait操作正在阻塞,則喚醒,相當于v操作
擷取信号量的值
int sem_getvalue(sem_t *sem)
#include<semaphore.h>
Sem_t sem_id
Sem_wait(&sem_id)
Sem_post(&sem_id)
Sem_init(&sem_id,0,1)
Sem_getvalue(&sem,&val)
信号
信号是一種異步通信的處理機制
分類
OS标準信号
使用者程序自定義信号
信号和中斷
相同點
相同的異步通信方式
不同點
中斷有優先級,信号沒有
信号處理程式在使用者态下運作,中斷處理程式在核心态下運作
中斷響應及時,信号相應通常有很大的延遲
功能
發送信号
預置對信号的處理方式
收受信号的程序按事先規定完成對相應時間的處理
事件
信号注冊
信号發送
信号處理
信号登出
不可靠信号量
1-31
可靠信号量
31-64
signal.h
設定信号處理方式
方式一
void (signal(int signum,void( handler),void(* handler)(int)))(int)
signal()依照signum指定的信号編号來設定改信号的處理函數
信号到達時,會跳轉到handler指定的函數執行
方式二
int sigaction(int signum,constituting sigaction *act,struct sigaction *oldact))
改變程序接受到特定信号後的行為
向任何程序或者程序組發送任何信号
kil(pid_t pid,int sig)
pid
- 信号發送對象
sig
- 發送的信号值
新的發送信号系統調用
int sigqueue(pid_t pid,int sig,const union sigval Val
- 接受信号的程序pid
- 确定即将發送的信号
val
- 指定信号傳遞的參數
定時發送
unsigned int alarm(unsigned int seconds)
擷取定時器狀态
int getitimer(int which,struct itimerval *value)
設定定時器
int setitimer(int which,struct itimerval *value,struch itimerval *ovalue)
程序暫停知道信号出現
int pause(void)
向自身所在的程序發送一個信号
int raise(int signs)
(Void)signal(SIGINT,SIG_DFL)
恢複SIGINT信号的處理操作
signal(SIGINT,ouch)
#include<signal.h>
Signal(SIGALRM,handler)
Alarm(3)
Struct itimerval value
Kill(getppid(0,SIGALRM)
Pause()
Setitimer(ITIMER_REAL,&value,&ovalue)
sigqueue(pid,sig,mysigval)
向本程序發送信号,并傳遞附加資訊
sigemptyset(&act.sa_mask)
Carl-C 變為輸出一條消息
共享記憶體
共享記憶體允許兩個或多個程序共享一定的存儲區域,是一種最快的IPC(程序通信)
sys/ipc.h
Sys/types.h
Sys/shm.h
shmid=shmget(KEY,SIZE,IPC_CREATE|0600)
建立共享記憶體
傳回
- 共享記憶體辨別符
shmaddr=(char*)shmat(shmid,NULL,0)
傳回共享記憶體的起始位址
shmdt(shmaddr)
斷開連接配接
shmctl(shmid,cmd,NULL)
cmd
IPC_STAT
- 共享記憶體的狀态
IPC_SET
- 改變共享記憶體的狀态
IPC_RMID
- 删除共享記憶體
共享記憶體管理
信号量(system V)
sys/types.h
ipc.h
sem.h
semget(key,users,sem flg)
建立,傳回信号量集對象
semop(shmid,sops,sops)
PV操作
semctl(semis,semnum,cmd,arg)
信号量控制操作
消息隊列
sys/msg.h
msgget(key,msgfig)
建立
msgsnd(msgid,(void*)sone_date,SIZE,0)
發送消息到消息隊列
msgrcv(msgid,(void*)sone_date,SIZE,typ,0)
從消息隊列中讀取消息
msgctl(msgid,IPC_STAT,&buf)
完成指定操作
管道
unistd.h
建立管道
int pipe(int filedes[2])
read()
write()
本文同時發表在CSDN中,連結:https://blog.csdn.net/tangkcc/article/details/118460199