《《實驗指導書》word版.doc》由會員分享,可在線閱讀,更多相關(guān)《《實驗指導書》word版.doc(69頁珍藏版)》請在裝配圖網(wǎng)上搜索。
操 作 系 統(tǒng)
實 驗 指 導 書
適用專業(yè): 計算機科學技術(shù)
計算機應用
電 子 專 業(yè)
安徽建筑工業(yè)學院 電子與信息工程 學院
2008 年 3 月
前 言
對計算機科學與技術(shù)及相關(guān)專業(yè)的學生而言,操作系統(tǒng)是一門重要的專業(yè)基礎(chǔ)課程。要學好操作系統(tǒng)的設(shè)計原理,除了聽課、看書、做習題外,最好的方法就是在實踐中進行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計小型系統(tǒng)/模塊或模擬算法等。從個人的角度而言,如果能夠完成MINUX源代碼的閱讀與分析,這將對掌握操作系統(tǒng)的原理與設(shè)計方法不無益處。這里,我沒有向大家推薦Linux或者FreeBSD之類的操作系統(tǒng)(雖然我從1997年就一直向?qū)W生推薦FreeBSD),是因為這里的閱讀源代碼的目標是為了掌握操作系統(tǒng)的原理。孟子曰:“富貴不能淫,貧賤不能移,威武不能屈,此之謂大丈夫。”我的理解,即使不能夠按照孟老夫子的話去做大丈夫,如果能夠做到“時髦不能跟”,也就可以做真正的自己了。對我們課程的學習,也就是這個道理吧。
對操作系統(tǒng)的實踐,教學計劃安排了8個課時的實驗時間,這很不夠,希望大家能夠?qū)ψ约汉菀稽c,創(chuàng)造自己進行的操作系統(tǒng)實踐的環(huán)境與機會。
操作系統(tǒng)實踐,按深度可分為使用級、觀察級、系統(tǒng)管理級、源碼閱讀級和實現(xiàn)級等五個層次。具體地,
1. 使用級:是指如何使用操作系統(tǒng),包括對命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。
2. 觀察級:是指通過使用級的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過程和結(jié)構(gòu)。
3. 系統(tǒng)管理級:是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。
4. 源碼閱讀級:是指對現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。
5. 實現(xiàn)級:是指編程模擬實現(xiàn)操作系統(tǒng)某些功能模塊。
上述五個層次的實踐,不同層次的實踐者可以根據(jù)自己的實際情況自主安排,在我給的實驗指導中,當前不會對各實驗的層次明確區(qū)分,大家仁者見仁吧。
由于條件限制,只能夠提供Windows 2000 Professional/WindowsXP2作為大家實踐時使用的操作系統(tǒng)。希望大家能夠結(jié)合具體的實驗要求以及實踐環(huán)境提前做好試驗準備。如果可能,給自己創(chuàng)造使用Unix或類Unix的實驗環(huán)境。
上機前應充分做好以下準備工作:
1. 復習和掌握與本次實驗有關(guān)的教學內(nèi)容。
2. 根據(jù)本次實驗的內(nèi)容,在紙上編寫好準備上機調(diào)試的程序,并初步檢查無誤。
3. 準備好對程序進行測試的數(shù)據(jù)。
4. 對每種測試數(shù)據(jù),給出預期的程序運行結(jié)果。
5. 預習實驗步驟,對實驗步驟中提出的一些問題進行思考。
上機實驗后,應及時寫出實驗報告,實驗報告應包括以下內(nèi)容:
1. 實驗目的和內(nèi)容。
2. 程序說明,包括程序結(jié)構(gòu)、各模塊的算法。
3. 調(diào)試正確的源程序。
4. 程序運行記錄(包括對不同測試數(shù)據(jù)的運行結(jié)果)。
5. 針對實驗中出現(xiàn)的問題,寫出解決辦法及對運行結(jié)果的分析。
根據(jù)教學大綱與實驗大綱的安排,本課程計劃進行12課時上機試驗。由于所有實驗均涉及程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計、操作系統(tǒng)等課程的多個知識點,相關(guān)實驗均為綜合實驗。
針對具體的實驗要求,本指導書附錄有大量的源代碼,供對相關(guān)算法不是很熟悉的同學參考。
本指導書適用于計算機科學技術(shù)、計算機應用、電子專業(yè)學生學習計算機操作系統(tǒng)課程時實驗使用,也適用于上述專業(yè)軟件實驗課程中操作系統(tǒng)部分實驗使用。
實驗一:進程管理
實驗學時:2
實驗類型:(驗證、綜合)
實驗要求:(必修)
一、實驗目的
Windows NT內(nèi)核的操作系統(tǒng)是多任務(wù)操作系統(tǒng),對程與線程提供完整支持。本次實驗意圖通過實踐掌握進程的基本概念,理解進程控制、進程同步、經(jīng)典進程的同步問題 、管程機制、進程通信、線程;初步熟悉多進程/多線程編程的特點。
二、實驗內(nèi)容
本次實驗的實驗內(nèi)容包括:
1)使用taskmgr.exe觀察實驗環(huán)境中的進程信息;
2) 編程實現(xiàn)哲學家就餐問題或者讀寫者問題。
三、實驗組織運行要求
根據(jù)本實驗的特點、要求和具體條件,宜采用“以學生自主訓練為主的開放模式組織教學”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學生。學生自主練習、提問;教師針對性的輔導。
四、實驗條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計算機;
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、實驗步驟
具體實驗步驟如下:
1. 首先使用taskmgr.exe程序觀察系統(tǒng)中運行進程的基本信息;
2. 使用taskmgr.exe程序觀察系統(tǒng)中運行進程的詳細信息;
3. 編碼實現(xiàn)哲學家就餐問題或者讀寫者問題。
六、思考題
1. 如何編程實現(xiàn)獲得進程的詳細信息?
2. 編碼實現(xiàn)哲學家就餐問題時哲學家獲取筷子的策略是什么?
3. 讀寫者問題的實現(xiàn)中,什么是讀者優(yōu)先,什么是寫者優(yōu)先?
七、實驗報告
學生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預習、實驗記錄、思考題三部分內(nèi)容。實驗記錄應該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應該能夠初步認識。
具體實驗報告的書寫按照實驗報告紙的要求逐項完成。
八、其它說明
要求學生在實驗過程中遵循如下的要求:
1. 準時到達實驗室,嚴格簽名方式的考勤制度。不允許代簽;
2. 遵循實驗室的各種管理規(guī)定;
3. 服從教師和實驗員的管理;
實驗二:處理機調(diào)度
實驗學時:2
實驗類型:(驗證、綜合)
實驗要求:(必修)
一、實驗目的
本實驗模擬在單處理機情況下的處理機調(diào)度,以期加深了解處理機調(diào)度算法;同時,本次實驗要求編程實現(xiàn)銀行家算法,以期加深對避免死鎖的理解。
二、實驗內(nèi)容
1) 使用taskmgr.exe觀察實驗環(huán)境中的進程調(diào)度情況;
2) 編程實現(xiàn)一個調(diào)度算法,推薦實現(xiàn)ELLF算法。要求給出對隨機測試序列能夠給出調(diào)度次序;
3) 編程實現(xiàn)銀行家算法,要求在給定資源初始狀態(tài)后能夠動態(tài)處理進程的資源分配請求;
三、實驗組織運行要求
根據(jù)本實驗的特點、要求和具體條件,宜采用“以學生自主訓練為主的開放模式組織教學”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學生。學生自主練習、提問;教師針對性的輔導。
四、實驗條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計算機;
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. ELLF算法與LLF算法的區(qū)別在什么地方?
2. 安全性檢查算法的邏輯基礎(chǔ)是什么?
六、實驗報告
學生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預習、實驗記錄、思考題三部分內(nèi)容。實驗記錄應該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應該能夠初步認識。
具體實驗報告的書寫按照實驗報告紙的要求逐項完成。
七、其它說明
要求學生在實驗過程中遵循如下的要求:
1. 準時到達實驗室,嚴格簽名方式的考勤制度。不允許代簽;
2. 遵循實驗室的各種管理規(guī)定;
3. 服從教師和實驗員的管理;
實驗三:存儲器管理
實驗學時:2
實驗類型:(驗證、綜合)
實驗要求:(必修)
一、實驗目的
本次實驗旨在通過使用操作系統(tǒng)內(nèi)存分配信息的動態(tài)觀察以及存儲器管理算法的實現(xiàn),加深對內(nèi)存分配原理的理解(重點加深對請求式分頁存儲管理方式的理解)。同時通過相關(guān)算法的實現(xiàn),熟悉頁面置換算法及其性能。
二、實驗內(nèi)容
1) 使用taskmgr.exe觀察實驗環(huán)境中的進程生命周期內(nèi)系統(tǒng)內(nèi)存分配變化情況;
2) 編程實現(xiàn)請求分頁管理方式時的地址變換過程;
3) 編程實現(xiàn)OPT或者FIFO算法
4) 編程實現(xiàn)LRU算法;
三、實驗組織運行要求
根據(jù)本實驗的特點、要求和具體條件,宜采用“以學生自主訓練為主的開放模式組織教學”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學生。學生自主練習、提問;教師針對性的輔導。
四、實驗條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計算機;
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. OPT算法是否具備實用性??
2. OPT算法與LRU算法的區(qū)別是什么?
3. 虛擬存儲器的主要特征有哪些?
六、實驗報告
學生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預習、實驗記錄、思考題三部分內(nèi)容。實驗記錄應該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應該能夠初步認識。
具體實驗報告的書寫按照實驗報告紙的要求逐項完成。
七、其它說明
要求學生在實驗過程中遵循如下的要求:
1. 準時到達實驗室,嚴格簽名方式的考勤制度。不允許代簽;
2. 遵循實驗室的各種管理規(guī)定;
3. 服從教師和實驗員的管理;
實驗四:文件管理
實驗學時:2
實驗類型:(驗證、綜合)
實驗要求:(必修)
一、實驗目的
本次實驗旨在通過實踐了解文件管理原理與方法,重點加深對外存分配方式和文件空閑存儲空間的理解。
二、實驗內(nèi)容
1) 了解使用計算機系統(tǒng)的文件系統(tǒng)的格式;
2) 編程實現(xiàn)連續(xù)分配、鏈接分配、索引分配等三種外存分配方式;
2) 編程實現(xiàn)空閑表法、位示圖法連續(xù)分配、成組鏈接法等三種文件存儲空間管理方式
三、實驗組織運行要求
根據(jù)本實驗的特點、要求和具體條件,宜采用“以學生自主訓練為主的開放模式組織教學”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學生。學生自主練習、提問;教師針對性的輔導。
本次實驗內(nèi)容很多,閾于課時限制,編程可能無法全部完成。對實驗內(nèi)容中2)、3)(外存分配方式、文件存儲空間管理方式)要求的6個編程要求,可以分成:a) 連續(xù)分配與鏈接分配、b) 索引分配、c) 空閑表法與位示圖法連續(xù)分配、d) 成組鏈接法等四組,要求在實驗課時內(nèi)至少完成一組的編程。
四、實驗條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計算機;
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. 實驗使用的計算機系用中,術(shù)語文件夾與文件管理中的概念一致?
2. 連續(xù)分配、鏈接分配、索引分配等三種外存分配方式的特點以及彼此之間的差異是什么?
3. 空閑表法、位示圖法連續(xù)分配、成組鏈接法三種文件存儲空間管理方式的特點以及彼此之間的差異有哪些?
六、實驗報告
學生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預習、實驗記錄、思考題三部分內(nèi)容。實驗記錄應該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應該能夠初步認識。
具體實驗報告的書寫按照實驗報告紙的要求逐項完成。
七、其它說明
要求學生在實驗過程中遵循如下的要求:
1. 準時到達實驗室,嚴格簽名方式的考勤制度。不允許代簽;
2. 遵循實驗室的各種管理規(guī)定;
3. 服從教師和實驗員的管理;
附錄一、讀寫者問題源代碼
#include "windows.h"
#include
#include
#include
#include
#include
#include
#define READER R
#define WRITER W
#define INTE_PER_SEC 1000
#define MAX_THREAD_NUM 64
#define MAX_FILE_NUM 32
#define MAX_STR_LEN 32
int readcount=0;
int writecount=0;
CRITICAL_SECTION RP_Write;
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
struct ThreadInfo
{int serial;
char entity;
double delay;
double persist;
};
////////////////////////////////////////////
//讀者優(yōu)先——讀者線程
// p 讀者線程信息
void RP_ReaderThread(void *p)
{
//互斥變量
HANDLE h_Mutex;
h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex for readcount");
DWORD wait_for_mutex; //等待互斥變量所有權(quán)
DWORD m_delay; //延遲時間
DWORD m_persist; //讀文件持續(xù)時間
int m_serial; //線程序號
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("reader thread %d sends the reading require.\n",m_serial);
//等待互斥信號,保證對readcount的訪問、修改互斥
wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
//讀者數(shù)目增加
readcount++;
if(readcount==1)
{
//第一個讀者,等待資源
EnterCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex); //釋放互斥信號
//讀文件
printf("reader thread %d begins to read file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("reader thread %d finished the reading file.\n",m_serial);
//等待互斥信號,保證對readcount的訪問,修改互斥
wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
//讀者數(shù)目減少
readcount--;
if(readcount==0)
{
//如果所有讀者讀完,喚醒寫者
LeaveCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex); //釋放互斥信號
}
////////////////////////////////////////////
//讀者優(yōu)先——寫者線程
// p 寫者線程信息
void RP_WriterThread(void *p)
{
DWORD m_delay; //延遲時間
DWORD m_persist; //讀文件持續(xù)時間
int m_serial; //線程序號
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("Writer thread %d sends the writing require.\n",m_serial);
//等待資源
EnterCriticalSection(&RP_Write);
//寫文件
printf("writer thread %d begins to write to the file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("writer thread %d finished the writting file.\n",m_serial);
//釋放資源
LeaveCriticalSection(&RP_Write);
}
////////////////////////////////////////////////////
//讀者優(yōu)先處理函數(shù)
//file 文件名
void ReaderPriority(char *file)
{DWORD n_thread=0; //線程數(shù)目
DWORD thread_ID; //線程ID
DWORD wait_for_all; //等待所有線程結(jié)束
//互斥對象
HANDLE h_Mutex;
h_Mutex=CreateMutex(NULL,FALSE,"mutex for read_counter");
//線程對象的數(shù)組
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount=0; //初始化readcount
InitializeCriticalSection(&RP_Write); //初始化臨界區(qū)
ifstream inFile(file);
//ifstream inFile;
//inFile.open(file); //打開文件
printf("reader Priority:\n\n");
/// if(!inFile) return;//如文件未打開,則返回
///while(!inFile.eof())//如文件未到文件尾,則讀文件信息
while(inFile)
{
//讀入每一個讀者、寫者的信息
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>thread_info[n_thread].delay;
inFile>>thread_info[n_thread++].persist;
inFile.get();
}
for(int i=0;i<(int)(n_thread);i++)
{if(thread_info[i].entity==READER || thread_info[i].entity==r)
{ //創(chuàng)建讀者線程
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_info[i],0,&thread_ID);
}
else
{ //創(chuàng)建寫者線程
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_info[i],0,&thread_ID);
}
}
//等待所有線程結(jié)束
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
printf("All Reader and writer have finished operationg.\n");
}
////////////////////////////////////////////
//寫者優(yōu)先——讀者線程
// p 讀者線程信息
void WP_ReaderThread(void *p)
{
//互斥變量
HANDLE h_Mutex1;
h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");
HANDLE h_Mutex2;
h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");
DWORD wait_for_mutex1; //等待互斥變量所有權(quán)
DWORD wait_for_mutex2;
DWORD m_delay; //延遲時間
DWORD m_persist; //讀文件持續(xù)時間
int m_serial; //線程序號
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("reader thread %d sends the reading require.\n",m_serial);
//等待互斥信號,保證對readcount的訪問、修改互斥
wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);
//進入讀者臨界區(qū)
EnterCriticalSection(&cs_Read);
//阻塞互斥對象Mutex2,保證對readcount 的訪問、修改互斥
wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
//修改讀者數(shù)目
readcount++;
if(readcount==1)
{
//如果是第一個讀者,等待寫者寫完
EnterCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2); //釋放互斥信號mutex2
//讓其他讀者進入臨界區(qū)
LeaveCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex1);
//讀文件
printf("reader thread %d begins to read file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("reader thread %d finished the reading file.\n",m_serial);
//阻塞互斥對象mutex2,保證對readcount的訪問,修改互斥
wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
//讀者數(shù)目減少
readcount--;
if(readcount==0)
{
//最后一個讀者,喚醒寫者
LeaveCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2); //釋放互斥信號
}
////////////////////////////////////////////
//寫者優(yōu)先——寫者線程
// p 寫者線程信息
void WP_WriteThread(void *p)
{
DWORD m_delay; //延遲時間
DWORD m_persist; //讀文件持續(xù)時間
int m_serial; //線程序號
DWORD wait_for_mutex3 ;
//互斥對象
HANDLE h_Mutex3;
h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("Writer thread %d sends the writing require.\n",m_serial);
//阻塞互斥對象mutex3,保證對writecount的訪問,修改互斥
wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
writecount++;
if(writecount==1)
{//第一個寫者,等待讀者讀完
EnterCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
//進入寫者臨界區(qū)
EnterCriticalSection(&cs_Write);
//寫文件
printf("writer thread %d begins to write to the file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("writer thread %d finished the writting file.\n",m_serial);
//離開臨界區(qū)
LeaveCriticalSection(&cs_Write);
//阻塞互斥對象mutex3,保證對writecount的訪問,修改互斥
wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
writecount--;
if(writecount==0)
{//寫者寫完,讀者可以讀
LeaveCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
}
////////////////////////////////////////////////////
//寫者優(yōu)先處理函數(shù)
//file 文件名
void WriterPriority(char *file)
{DWORD n_thread=0; //線程數(shù)目
DWORD thread_ID; //線程ID
DWORD wait_for_all; //等待所有線程結(jié)束
//互斥對象
HANDLE h_Mutex1;
h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");
HANDLE h_Mutex2;
h_Mutex2=CreateMutex(NULL,FALSE,"mutex2");
HANDLE h_Mutex3;
h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");
//線程對象的數(shù)組
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount=0; //初始化readcount
writecount=0; //初始化writecount
InitializeCriticalSection(&cs_Write); //初始化臨界區(qū)
InitializeCriticalSection(&cs_Read);
ifstream inFile(file);
//ifstream inFile;
//inFile.open(file); //打開文件
printf("writer Priority:\n\n");
///////////////while(inFile)
while(inFile)
{
//讀入每一個讀者、寫者的信息
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>thread_info[n_thread].delay;
inFile>>thread_info[n_thread++].persist;
inFile.get();
}
for(int i=0;i<(int)(n_thread);i++)
{if(thread_info[i].entity==READER || thread_info[i].entity==r)
{ //創(chuàng)建讀者線程
// h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_info[i],0,&thread_ID);
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_ReaderThread),&thread_info[i],0,&thread_ID);
}
else
{ //創(chuàng)建寫者線程
// h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_info[i],0,&thread_ID);
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_WriteThread),&thread_info[i],0,&thread_ID);
}
}
//等待所有線程結(jié)束
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
printf("All Reader and writer have finished operationg.\n");
}
int main(int argc,char *argv[])
{
char ch;
while(true)
{//打印提示信息
printf(" ==========================================\n");
printf(" ==== 讀者-寫者實驗模擬 ====\n\n");
printf(" ==========================================\n");
printf("\n");
printf(" ***********************************\n");
printf(" 1:Reader Priority\n");
printf(" 2:Write Priority\n");
printf(" 3:Exit to Windows\n");
printf(" ***********************************\n");
printf(" Enter your choice(1、2、3):\n");
//如果輸入信息不正確,繼續(xù)輸入
do{
ch=(char)_getch();
}while(ch!=1&&ch!=2&&ch!=3);
/*system("cls");*/
//選擇3,返回
if(ch==3)
return 0;
//選擇1,讀者
if(ch==1)
ReaderPriority("thread.dat");
//選擇2,寫者優(yōu)先
else
WriterPriority("thread.dat");
//結(jié)束
printf("\n press any key to continue:");
_getch();
/*system("cls");*/
}
return 0;
}
附錄二、哲學家就餐問題
// PhilosopherDining.cpp : Defines the entry point for the console application.
#include "windows.h"
#include
#include
#include
#include
#include
using namespace std;
const unsigned int PHILOSOPHER_NUM=5;
const char THINKING=1;
const char HUNGRY=2;
const char DINING=3;
// each fork has a semaphore
HANDLE semph[PHILOSOPHER_NUM];
// Mutex for printing
HANDLE mutex;
void philosopherProc(void* param);
int main(int argc, char* argv[])
{ int i;
srand(time(0));
mutex = CreateMutex(NULL, false, NULL);
for (i=0; iname,&p->ts,&p->ntime,&p->resource);
p->state=W;
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
}
fileinput(){
FILE *fp;
int i;
if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;
fscanf(fp,"%d\n",&n);
for(i=0;iname,&p->ts,&p->ntime,&p->resource);
p->state=W;
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
fclose(fp);
}
void print(JCB *pr,int m){
JCB *p;
printf("\ntime=%d",time);
if(m==3){
printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
}
else {
printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");
printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
}
p=head;
do{
if(p->state==W)
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource);
}
else{
printf("%s\t%c\t%d\t%d\t%s\n",
p->name,p->state,p->ts,p->ntime,p->resource);
}
p=p->link;
}while(p!=NULL);
p=head;
do{
if(p->state==F)
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti
鏈接地址:http://ioszen.com/p-7765689.html