作業系統實驗六 死鎖問題實驗

2021-10-11 14:34:54 字數 3439 閱讀 9426

實驗內容:

在兩個城市南北⽅向之間存在⼀條鐵路,多列⽕⻋可以分別從兩個城市的⻋站 排隊等待進⼊⻋道向對⽅

城市⾏駛,該鐵路在同⼀時間,只能允許在同⼀⽅向上⾏⻋,如果同時有相向的⽕⻋⾏駛將會撞⻋。請

模擬實現兩個⽅向⾏⻋,⽽不會出現撞⻋或⻓時間等待的情況。您能構造⼀個管程來解決這個問題嗎?

dp.h

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

/*訊號燈控制用的共同體*/

typedef

union semuns sem_uns;

enum state

;//火車站管程中使用的訊號量

class

sema

;//火車站管程中使用的鎖

class

lock

;//火車站管程中使用的條件變數

class

condition

;//火車站管程的定義

class

dp;

dp.cc

#include

"dp.h"

//分別是由東向西,由西向東的車輛數和單方向火車站同時最多能發的車輛數

int eastsum,westsum,d_maxcar;

sema::

sema

(int id)

sema::

~sema()

/** 訊號燈上的 down/up 操作

* semid:訊號燈陣列識別符號

* semnum:訊號燈陣列下標

* buf:操作訊號燈的結構

*/int sema::

down()

return exit_success;

}int sema::up(

)return exit_success;

}lock::

lock

(sema * s)

lock::

~lock()

//上鎖

void lock::

close_lock()

//開鎖

void lock::

open_lock()

condition::

condition

(char

*st[

],sema *sm)

void condition::

wait

(lock *lock,

int i)

}void condition::

signal

(int i)

}int dp::

get_ipc_id

(char

*proc_file,key_t key)

fgets

(line, bufsz,pf)

;while(!

feof

(pf)

)fclose

(pf)

;return-1

;}int dp::

set_sem

(key_t sem_key,

int sem_val,

int sem_***)

} sem_arg.val = sem_val;if(

semctl

(sem_id,

0,setval,sem_arg)

<0)

return sem_id;

}char

* dp::

set_shm

(key_t shm_key,

int shm_num,

int shm_***)if(

(shm_buf=

(char*)

shmat

(shm_id,0,

0))<

(char*)

0)for(i=

0; i) shm_buf[i]=0

;}if(

(shm_buf =

(char*)

shmat

(shm_id,0,

0))<

(char*)

0)return shm_buf;

}dp::dp(

int r,

int maxcur)

sema =

newsema

(sem_id)

; lock =

newlock

(sema)

;for

(int i=

0; i<=

1; i++

)*state[i]

=waitt;if(

(sem_id =

set_sem

(sem_key++

,sem_val,ipc_***)

)<0)

sema =

newsema

(sem_id)

; self[i]

=new

condition

(state,sema);}

}void dp::

start

(int i)

else

if(i==1)

//*nowcars=

*nowcars+1;

cnt[i]

=cnt[i]+1

;//模擬傳送火車的時間

sleep

(rate)

; lock-

>

open_lock()

;}//火車正常通過,離開

void dp::

quit

(int i)

elseif(

*sumeastelse

}else

}else

if(i==1)

elseif(

*sumwestelse

}else

} lock-

>

open_lock()

;}dp::~dp

()intmain

(int argc,

char

*ar**)

cout<' '

int i=

0;i<=

1;i++

)exit(0

);}}

for(

int i=

0;i<

2;i++

)return0;

}

作業系統實驗

一 實驗目的 理解vi的三種執行模式及其切方法。學會使用vi的各種操作命令進行文字檔案的編輯。用vi編寫linux下c程式,會用gcc編譯。二 實驗環境 一台裝有linux的機器 這裡預設是red hat linux 9 系統裡面有gcc編譯器。三 實驗內容 寫出主要的內容 首先用合法使用者登入系統...

作業系統實驗

分析bootloader進入保護模式的過程。在剛進入bootloader的時候,最先執行的操作分別為關閉中斷 清除eflags的df位以及將ax,ds,es,ss暫存器初始化為0 globl start start code16 cli 關中斷 cld 清除方向標誌 xorw ax,ax ax清0 ...

實驗作業系統

實驗一 linux使用環境 實驗二 linux下c程式設計環境 1 設有乙個三位數,將它的百 十 個位上的3個數,各自求立方,然後加起來,正好等於這個3位數,請在linux環境下程式設計找出所有滿足條件的數,並編譯 除錯 執行你的程式。include int main return0 實驗三 程序觀...