c語言管程
⑴ 計算機研究生考試要考哪幾門啊
計算機研究生考試要考哪幾門啊
自2009年起,計算機專業考研出試為全國統考,2009年計算機考研大綱如下
Ⅰ考查目標
計算機學科專業基礎綜合考試涵蓋數據機構、計算機組成原理、操作系統和計算機網路等學科專業基礎課程。要求考生比較系統地掌握上述專業基礎課程的概念、基本原理和方法,能夠運用所學的基本原理和基本方法分析、判斷和解決有關理論問題和實際問題。
Ⅱ考試形式和試卷結構
一、 試卷滿分及考試時間
本試卷滿分為150分,考試時間為180分鍾
二、 答題方式
答題方式為閉卷、筆試
三、 試卷內容結構
數據結構 45分
計算機組成原理 45分
操作系統 35分
計算機網路 25分
四、 試卷題型結構
單項選擇題閉簡 80分(40小題,每小題2分)
綜合應用題 70分
Ⅲ考查范圍
數據結構
【考查目標】
1.理解數據結構的基本概念;掌握數據的邏輯結構、存儲結構及其差異,以及各種基本操作的實現。
2.掌握基本的數據處理原理和方法的基礎上,能夠對演算法進行設計與分析。
3.能夠選擇合適的數據結構和方法進行問題求解。
一、線性表
(一)線性表的定義和基本操作
(二)線性表的實現
1.順序存儲結構
2.鏈式存儲結構
3.線性表的應用
二、棧、隊列和數組
(一)棧和隊列的基本概念
(二)棧和隊列的順序存儲結構
(三)棧和隊列的鏈式存儲結構
(四)棧和隊列的應用
(五)特殊矩陣的壓縮存儲
三、樹與二叉樹
(一)樹的概念
(二)二叉樹
1.二叉樹的定義及其主要特徵
2.二叉樹的順序存儲結構和鏈式存儲結構
3.二叉樹的遍歷
4.線索二叉樹的基本概念和構造
5.二叉排序樹
6.平衡二叉樹
(三)樹、森林
1.書的存儲結構
2.森林與二叉樹的轉換
3.樹和森林的遍歷
(四)樹的應用
1.等價類問題
2.哈夫曼(Huffman)樹和哈夫曼編碼
四、 圖
(一) 圖的概念
(二) 圖的存儲及基本操作
1. 鄰接矩陣法
2. 鄰接表法
(三) 圖的遍歷
1. 深度優先搜索
2. 廣度優先搜索
(四) 圖的基本應用及其復雜度分析
1. 最小(代價)轎跡褲生成樹
2. 最短路徑
3. 拓撲排序
4. 關鍵路徑
五、 查找
(一) 查找的基本概念
(二) 順序查找法
(三) 折半查找法
(四) B-樹
(五) 散列(Hash)表及其查找
(六) 查找演算法的分析及應用
六、 內部排序
(一) 排序的基本概念
(二) 插入排序
1. 直接插入排序
2. 折半插入排序
(三) 氣泡排序(bubble sort)
(四)州咐 簡單選擇排序
(五) 希爾排序(shell sort)
(六) 快速排序
(七) 堆排序
(八) 二路歸並排序(merge sort)
(九) 基數排序
(十) 各種內部排序演算法的比較
(十一) 內部排序演算法的應用
計算機組成原理
【考查目標】
1. 理解單處理器計算機系統中各部件的內部工作原理、組成結構以及相互連接方式,具有完整的計算機系統的整機概念。
2. 理解計算機系統層次化結構概念,熟悉硬體與軟體之間的界面,掌握指令集體系結構的基本知識和基本實現方法。
3. 能夠運用計算機組成的基本原理和基本方法,對有關計算機硬體系統中的理論和實際問題進行計算、分析,並能對一些基本部件進行簡單設計。
一、 計算機系統概述
(一) 計算機發展歷程
(二) 計算機系統層次結構
1. 計算機硬體的基本組成
2. 計算機軟體的分類
3. 計算機的工作過程
(三) 計算機性能指標
吞吐量、響應時間;cpu時鍾周期、主頻、CPI、cpu執行時間;MIPS、MFLOPS。
二、 數據的表示和運算
(一) 數制與編碼
1. 進位計數制及其相互轉換
2. 真值和機器數
3. BCD碼
4. 字元與字元串
5. 校驗碼
(二) 定點數的表示和運算
1. 定點數的表示
無符號數的表示;有符號數的表示。
2. 定點數的運算
定點數的位移運算;原碼定點數的加/減運算;補碼定點數的加/減運算;定點數的乘/除運算;溢出概念和判別方法。
(三) 浮點數的表示和運算
1. 浮點數的表示
浮點數的表示範圍;IEEE754標准
2. 浮點數的加/減運算
(四) 算術邏輯單元ALU
1. 串列加法器和並行加法器
2. 算術邏輯單元ALU的功能和機構
三、 存儲器層次機構
(一) 存儲器的分類
(二) 存儲器的層次化結構
(三) 半導體隨機存取存儲器
1. SRAM存儲器的工作原理
2. DRAM存儲器的工作原理
(四) 只讀存儲器
(五) 主存儲器與cpu的連接
(六) 雙口RAM和多模塊存儲器
(七) 高速緩沖存儲器(Cache)
1. 程序訪問的局部
2. Cache的基本工作原理
3. Cache和主存之間的映射方式
4. Cache中主存塊的替換演算法
5. Cache寫策略
(八) 虛擬存儲器
1. 虛擬存儲器的基本概念
2. 頁式虛擬存儲器
3. 段式虛擬存儲器
4. 段頁式虛擬存儲器
5. TLB(快表)
四、 指令系統
(一) 指令格式
1. 指令的基本格式
2. 定長操作碼指令格式
3. 擴展操作碼指令格式
(二) 指令的定址方式
1. 有效地址的概念
2. 數據定址和指令定址
3. 常見定址方式
(三) CISC和RISC的基本概念
五、 中央處理器(cpu)
(一) cpu的功能和基本結構
(二) 指令執行過程
(三) 數據通路的功能和基本結構
(四) 控制器的功能和工作原理
1. 硬布線控制器
2. 微程序控制器
微程序、微指令和微命令;微指令的編碼方式;微地址的形式方式。
(五) 指令流水線
1. 指令流水線的基本概念
2. 超標量和動態流水線的基本概念
六、 匯流排
(一) 匯流排概述
1. 匯流排的基本概念
2. 匯流排的分類
3. 匯流排的組成及性能指標
(二) 匯流排仲裁
1. 集中仲裁方式
2. 分布仲裁方式
(三) 匯流排操作和定時
1. 同步定時方式
2. 非同步定時方式
(四) 匯流排標准
七、 輸入輸出(I/O)系統
(一) I/O系統基本概念
(二) 外部設備
1. 輸入設備:鍵盤、滑鼠
2. 輸出設備:顯示器、列印機
3. 外存儲器:硬碟存儲器、磁碟陣列、光碟存儲器
(三) I/O介面(I/O控制器)
1. I/O介面的功能和基本結構
2. I/O埠及其編址
(四) I/O方式
1. 程序查詢方式
2. 程序中斷方式
中斷的基本概念;中斷響應過程;中斷處理過程;多重中斷和中斷屏蔽的概念。
3. DMA方式
DMA控制器的組成;DMA傳送過程。
4. 通道方式
操作系統
【考查目標】
1. 了解操作系統在計算機系統中的作用、地位、發展和特點。
2. 理解操作系統的基本概念、原理,掌握操作系統設計方法與實現技術。
3. 能夠運用所學的操作系統原理、方法與技術分析問題和解決問題。
一、 操作系統概述
(一) 操作系統的概念、特徵、功能和提供的服務
(二) 操作系統的發展與分類
(三) 操作系統的運行環境
二、 進程管理
(一) 進程與線程
1. 進程概念
2. 進程的狀態與轉換
3. 進程式控制制
4. 進程組織
5. 進程通信
共享存儲系統;消息傳遞系統;管道通信。
6.線程概念與多線程模型
(二)處理機調度
1.調度的基本概念
2.調度時機、切換與過程
3.調度的基本准則
4.調度方式
5.典型調度演算法
先來先服務調度演算法;短作業(短任務、短進程、短線程)優先調度演算法;時間片輪轉調度演算法;優先順序調度演算法;高響應比優先調度演算法;多級反饋隊列調度演算法。
(三)進程同步
1. 進程同步的基本概念
2. 實現臨界區互斥的基本方法
軟體實現方法;硬體實現方法。
3. 信號量
4. 管程
5. 經典同步問題
生產者-消費者問題;讀者-寫者問題;哲學家進餐問題。
(四) 死鎖
1. 死鎖的概念
2. 死鎖處理策略
3. 死鎖預防
4. 死鎖避免
系統安全狀態:銀行家演算法。
5. 死鎖檢測和解除
三、 內存管理
(一) 內存管理基礎
1. 內存管理概念
程序裝入與鏈接;邏輯地址與物理地址空間;內存保護。
2. 交換與覆蓋
3. 連續分配管理方式
單一連續分配;分區分配。
4. 非連續分配管理方式
分頁管理方式;分段管理方式;段頁式管理方式。
(二) 虛擬內存管理
1. 虛擬內存基本概念
2. 請求分頁管理方式
3. 頁面置換演算法
最佳置換演算法(OPT);先進先出置換演算法(FIFO);最近最少使用置換演算法(LRU);時鍾置換演算法(CLOCK)。
4. 頁面分配策略
5. 抖動
抖動現象;工作集。
6. 請求分段管理方式
7. 請求段頁式管理方式
四、 文件管理
(一) 文件系統基礎
1. 文件概念
2. 文件結構
順序文件;索引文件;索引順序文件。
3. 目錄結構
文件控制塊和索引節點;單級目錄結構和兩級目錄結構;樹形目錄結構;圖形目錄結構。
4. 文件共享
共享動機;共享方式;共享語義。
5. 文件保護
訪問類型;訪問控制。
(二) 文件系統實現
1. 文件系統層次結構
2. 目錄實現
3. 文件實現
(三) 磁碟組織與管理
1. 磁碟的結構
2. 磁碟調度演算法
3. 磁碟的管理
五、 輸入輸出(I/O)管理
(一) I/O管理概述
1. I/O設備
2. I/O管理目標
3. I/O管理功能
4. I/O應用介面
5. I/O控制方式
(二) I/O核心子系統
1. I/O調度概念
2. 高速緩存與緩沖區
3. 設備分配與回收
4. 假離線技術(SPOOLing)
5. 出錯處理
計算機網路
【考查目標】
1. 掌握計算機網路的基本概念、基本原理和基本方法。
2. 掌握計算機網路的體系結構和典型網路協議,了解典型網路設備的組成和特點,理解典型網路設備的工作原理
3. 能夠運用計算機網路的基本概念、基本原理和基本方法進行網路系統的分析、設計和應用
一、 計算機網路體系結構
(一) 計算機網路概述
1. 計算機網路的概念、組成與功能
2. 計算機網路的分類
3. 計算機網路與互聯網的發展歷史
4. 計算機網路的標准化工作及相關組織
(二) 計算機網路體系結構與參考模型
1. 計算機網路分層結構
2. 計算機網路協議、介面、服務等概念
3. ISO/OSI參考模型和TCP/IP模型
二、 物理層
(一) 通信基礎
1. 信道、信號、寬頻、碼元、波特、速率等基本概念
2. 奈奎斯特定理與香農定理
3. 信源與信宿
4. 編碼與調制
5. 電路交換、報文交換與分組交換
6. 數據報與虛電路
(二) 傳輸介質
1. 雙絞線、同軸電纜、光纖與無線傳輸介質
2. 物理層介面的特性
(三) 物理層設備
1. 中繼器
2. 集線器
三、 數據鏈路層
(一) 數據鏈路層的功能
(二) 組幀
(三) 差錯控制
1. 檢錯編碼
2. 糾錯編碼
(四) 流量控制與可靠傳輸機制
1. 流量控制
可靠傳輸與滑輪窗口機制
2. 單幀滑動窗口與停止-等待協議
3. 多幀滑動窗口與後退N幀協議(GBN)
4. 多幀滑動窗口與選擇重傳協議(SR)
(五) 介質訪問控制
1. 信道劃分介質訪問控制
頻分多路復用、時分多路復用、波分多路復用、碼分多路復用的概念和基本原理。
2. 隨即訪問介質訪問控制
ALOHA協議;CSMA協議;CSMA/CD協議;CSMA/CA協議。
3. 輪詢訪問介質訪問控制:令牌傳遞協議
(六) 區域網
1. 區域網的基本概念與體系結構
2. 乙太網與IEEE 802.3
3. IEEE 802.11
4. 令牌環網的基本原理
(七) 廣域網
1. 廣域網的基本概念
2. PPP協議
3. HDLC協議
4. ATM網路基本原理
(八) 數據鏈路層設備
1. 網橋
網橋的概念;透明網橋與生成樹算飯;源選徑網橋與源選徑演算法。
2. 區域網交換機及其工作原理。
四、 網路層
(一) 網路層的功能
1. 異構網路互聯
2. 路由與轉發
3. 擁塞控制
(二) 路由演算法
1. 靜態路由與動態路由
2. 距離-向量路由演算法
3. 鏈路狀態路由演算法
4. 層次路由
(三) IPv4
1. IPv4分組
2. IPv4地址與NAT
3. 子網劃分與子網掩碼、CIDR
4. ARP協議、DHCP協議與ICMP協議
(四) IPv6
1. IPv6的主要特點
2. IPv6地址
(五) 路由協議
1. 自治系統
2. 域內路由與域間路由
3. RIP路由協議
4. OSPF路由協議
5. BGP路由協議
(六) IP組播
1. 組播的概念
2. IP組播地址
3. 組播路由演算法
(七) 移動IP
1. 移動IP的概念
2. 移動IP的通信過程
(八) 網路層設備
1. 路由器的組成和功能
2. 路由表與路由轉發
五、 傳輸層
(一) 傳輸層提供的服務
1. 傳輸層的功能
2. 傳輸層定址與埠
3. 無連接服務與面向連接服務
(二) UDP協議
1. UDP數據報
2. UDP校驗
(三) TCP協議
1. TCP段
2. TCP連接管理
3. TCP可靠傳輸
4. TCP流量控制與擁塞控制
六、 應用層
(一) 網路應用模型
1. 客戶/伺服器模型
2. P2P模型
(二) DNS系統
1. 層次域名空間
2. 域名伺服器
3. 域名解析過程
(三) FTP
1. FTP協議的工作原理
2. 控制連接與數據連接
(四) 電子郵件
1. 電子郵件系統的組成結構
2. 電子郵件格式與MIME
3. SMTP協議與POP3協議
(五)
1. 的概念與組成結構
HTTP協議
我學的是計算機專業,在學大綱中涉及的課程前先修了高等數學,離散數學,c語言,C++,在調試數據結構和操作系統的程序時用的都是C
求2012年計算機研究生考試題
網上很多可以下載
河南大學計算機研究生考哪幾門
1、河南大學計算機研究生考
①101思想政治理論
②201英語一
③602微積分
④840專業基礎課(數據結構、操作系統)
2、建議去河南大學官網查看專業目錄等考研信息,或者網路搜索《河南大學2014年碩士研究生招生專業目錄》即可了解,務必以報考當年9月份學校官網發布的考研信息為准。
計算機研究生考試科目有那些?
計算機大部分院校的考試科目代碼為408,國家統一命題。主要四部分,參考書目:
一、數據結構
嚴蔚敏、吳偉民編著:《數據結構(c語言版)》,清華大學出版社
二、計算機組成原理
唐朔飛編著:《計算機組成原理》,高等教育出版社,1999年版
白中英主編:《計算機組成原理》,科學出版社
三、操作系統
湯小丹、梁紅兵、哲鳳屏、湯子瀛編著:《計算機操作系統(第三版)》,西安電子科技大學出版社
四、計算機網路
謝希仁編著:《計算機網路(第5版)》,電子工業出版社
高傳善、毛迪林、曹袖主編:《數據通信與計算機網路(第2版)》,高等教育出版社
全國碩士研究生入學統一考試計算機專業基礎綜合考試大綱解析,高等教育出版社,這個大綱解析是必備的。
有不參加統考的學校,學校自主命題,考試科目及參考書目去目標院校的研究生網站查找下。
考計算機研究生需要靠那幾門?
⑵ 哲學家就餐問題的演算法實現
操作系統並發和互斥:哲學家進餐問題和理發師問題
1. 哲學家進餐問題:
(1) 在什麼情況下5 個哲學家全部吃不上飯?
考慮兩種實現的方式,如下:
A.
演算法描述:
void philosopher(int i) /*i:哲學家編號,從0 到4*/
{
while (TRUE) {
think( ); /*哲學家正在思考*/
take_fork(i); /*取左側的筷子*/
take_fork((i+1) % N); /*取左側筷子;%為取模運算*/
eat( ); /*吃飯*/
put_fork(i); /*把左側筷子放回桌子*/
put_fork((i+1) % N); /*把右側筷子放回桌子*/
}
}
分析:假如所有的哲學家都同時拿起左側筷子,看到右側筷子不可用,又都放下左側筷子,
等一會兒,又同時拿起左側筷子,如此這般,永遠重復。對於這種情況,即所有的程序都在
無限期地運行,但是都無法取得任何進展,即出現飢餓,所有哲學家都吃不上飯。
B.
演算法描述:
規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子,
等一段時間再重復整個過程。
分析:當出現以下情形,在某一個瞬間,所有的哲學家都同時啟動這個演算法,拿起左側的筷
子,而看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子……如此
這樣永遠重復下去。對於這種情況,所有的程序都在運行,但卻無法取得進展,即出現飢餓,
所有的哲學家都吃不上飯。
(2) 描述一種沒有人餓死(永遠拿不到筷子)演算法。
考慮了四種實現的方式(A、B、C、D):
A.原理:至多隻允許四個哲學家同時進餐,以保證至少有一個哲學家能夠進餐,最終總會釋
放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。以下將room 作為信號量,只允
許4 個哲學家同時進入餐廳就餐,這樣就能保證至少有一個哲學家可以就餐,而申請進入
餐廳的哲學家進入room 的等待隊列,根據FIFO 的原則,總會進入到餐廳就餐,因此不會
出現餓死和死鎖的現象。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
semaphore room=4;
void philosopher(int i)
{
while(true)
{
think();
wait(room); //請求進入房間進餐
wait(chopstick[i]); //請求左手邊的筷子
wait(chopstick[(i+1)%5]); //請求右手邊的筷子
eat();
signal(chopstick[(i+1)%5]); //釋放右手邊的筷子
signal(chopstick[i]); //釋放左手邊的筷子
signal(room); //退出房間釋放信號量room
}
}
B.原理:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。
方法1:利用AND 型信號量機制實現:根據課程講述,在一個原語中,將一段代碼同時需
要的多個臨界資源,要麼全部分配給它,要麼一個都不分配,因此不會出現死鎖的情形。當
某些資源不夠時阻塞調用進程;由於等待隊列的存在,使得對資源的請求滿足FIFO 的要求,
因此不會出現飢餓的情形。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
方法2:利用信號量的保護機制實現。通過信號量mutex對eat()之前的取左側和右側筷
子的操作進行保護,使之成為一個原子操作,這樣可以防止死鎖的出現。
偽碼:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
}
}
C. 原理:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號
的哲學家則相反.按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子.即
五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有一個哲學家能獲
得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待隊列,根FIFO原則,則先申請的哲
學家會較先可以吃飯,因此不會出現餓死的哲學家。
偽碼:
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(true)
{
think();
if(i%2 == 0) //偶數哲學家,先右後左。
{
wait (chopstick[ i + 1 ] mod 5) ;
wait (chopstick[ i]) ;
eat();
signal (chopstick[ i + 1 ] mod 5) ;
signal (chopstick[ i]) ;
}
Else //奇數哲學家,先左後右。
{
wait (chopstick[ i]) ;
wait (chopstick[ i + 1 ] mod 5) ;
eat();
signal (chopstick[ i]) ;
signal (chopstick[ i + 1 ] mod 5) ;
}
}
D.利用管程機制實現(最終該實現是失敗的,見以下分析):
原理:不是對每隻筷子設置信號量,而是對每個哲學家設置信號量。test()函數有以下作
用:
a. 如果當前處理的哲學家處於飢餓狀態且兩側哲學家不在吃飯狀態,則當前哲學家通過
test()函數試圖進入吃飯狀態。
b. 如果通過test()進入吃飯狀態不成功,那麼當前哲學家就在該信號量阻塞等待,直到
其他的哲學家進程通過test()將該哲學家的狀態設置為EATING。
c. 當一個哲學家進程調用put_forks()放下筷子的時候,會通過test()測試它的鄰居,
如果鄰居處於飢餓狀態,且該鄰居的鄰居不在吃飯狀態,則該鄰居進入吃飯狀態。
由上所述,該演算法不會出現死鎖,因為一個哲學家只有在兩個鄰座都不在進餐時,才允
許轉換到進餐狀態。
該演算法會出現某個哲學家適終無法吃飯的情況,即當該哲學家的左右兩個哲學家交替
處在吃飯的狀態的時候,則該哲學家始終無法進入吃飯的狀態,因此不滿足題目的要求。
但是該演算法能夠實現對於任意多位哲學家的情況都能獲得最大的並行度,因此具有重要
的意義。
偽碼:
#define N 5 /* 哲學家人數*/
#define LEFT (i-1+N)%N /* i的左鄰號碼 */
#define RIGHT (i+1)%N /* i的右鄰號碼 */
typedef enum { THINKING, HUNGRY, EATING } phil_state; /*哲學家狀態*/
monitor dp /*管程*/
{
phil_state state[N];
semaphore mutex =1;
semaphore s[N]; /*每個哲學家一個信號量,初始值為0*/
void test(int i)
{
if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING &&
state[RIGHT(i)] != EATING )
{
state[i] = EATING;
V(s[i]);
}
}
void get_forks(int i)
{
P(mutex);
state[i] = HUNGRY;
test(i); /*試圖得到兩支筷子*/
V(mutex);
P(s[i]); /*得不到筷子則阻塞*/
}
void put_forks(int i)
{
P(mutex);
state[i]= THINKING;
test(LEFT(i)); /*看左鄰是否進餐*/
test(RIGHT(i)); /*看右鄰是否進餐*/
V(mutex);
}
}
哲學家進程如下:
void philosopher(int process)
{
while(true)
{
think();
get_forks(process);
eat();
put_forks(process);
}
}
2.理發師問題:一個理發店有一個入口和一個出口。理發店內有一個可站5 位顧客的站席
區、4 個單人沙發、3 個理發師及其專用理發工具、一個收銀台。新來的顧客坐在沙發上等
待;沒有空沙發時,可在站席區等待;站席區滿時,只能在入口外等待。理發師可從事理
發、收銀和休息三種活動。理發店的活動滿足下列條件:
1)休息的理發師是坐地自己專用的理發椅上,不會佔用顧客的沙發;
2)處理休息狀態的理發師可為在沙發上等待時間最長的顧客理發;
3)理發時間長短由理發師決定;
4)在站席區等待時間最長的顧客可坐到空閑的理發上;
5)任何時刻最多隻能有一個理發師在收銀。
試用信號量機制或管程機制實現理發師進程和顧客進程。
原理:
(1)customer 進程:
首先檢查站席區是否已滿(stand_capacity),若滿選擇離開,否則進入站席區,即進入
理發店。在站席區等待沙發的空位(信號量sofa),如果沙發已滿,則進入阻塞等待隊列,
直到出現空位,在站席區中等待時間最長的顧客離開站席區(stand_capacity)。坐到沙
發上,等待理發椅(barber_chair),如果理發椅已滿,則進入阻塞等待隊列,直到出現
空位,在沙發上等待時間最長的顧客離開沙發(釋放信號量sofa)。坐到理發椅上,釋放
准備好的信號(customer_ready),獲得該理發師的編號(0~1 的數字)。等待理發師理
發結束(finished[barber_number])。在離開理發椅之前付款(payment),等待收據
(receipt),離開理發椅(leave_barberchair)。最後離開理發店。
這里需要注意幾點:
a) 首先是幾個需要進行互斥處理的地方,主要包括:進入站席區、進入沙發、進入理發椅
和付款幾個地方。
b) 通過barber_chair 保證一個理發椅上最多隻有一名顧客。但這也不夠,因為單憑
baber_chair 無法保證一名顧客離開理發椅之前,另一位顧客不會坐到該理發椅上,
因此增加信號量leave_barberchair,讓顧客離開理發椅後,釋放該信號,而理發
師接收到該信號後才釋放barber_chair 等待下一位顧客。
c) 在理發的過程中,需要保證是自己理發完畢,才能夠進行下面的付款、離開理發椅的活
動。這個機制是通過customer 進程獲得給他理發的理發師編號來實現的,這樣,當
該編號的理發師釋放對應的finished[i]信號的時候,該顧客才理發完畢。
d) 理發師是通過mutex 信號量保證他們每個人同時只進行一項操作(理發或者收款)。
e) 為了保證該顧客理發完畢後馬上可以付款離開,就應該保證給該顧客理發的理發師在理
發完畢後馬上到收銀台進入收款操作而不是給下一位顧客服務。在偽碼中由以下機制實
現:即顧客在釋放離開理發椅的信號前,發出付款的信號。這樣該理發師得不到顧客的
離開理發椅的信號,不能進入下一個循環為下一名顧客服務,而只能進入收款台的收款
操作。直到顧客接到收據後,才釋放離開理發椅的信號,離開理發椅,讓理發師釋放該
理發椅的信號,讓下一位等待的顧客坐到理發椅上。
(2)barber 進程
首先將該理發師的編號壓入隊列,供顧客提取。等待顧客坐到理發椅坐好(信號量
customer_ready),開始理發,理發結束後釋放結束信號(finished[i])。等待顧客
離開理發椅(leave_barberchair)(期間去收銀台進行收款活動),釋放理發椅空閑信
號(barber_chair),等待下一位顧客坐上來。
(3)cash(收銀台)進程
等待顧客付款(payment),執行收款操作,收款操作結束,給付收據(receipt)。
信號量總表:
信號量 wait signal
stand_capacity 顧客等待進入理發店 顧客離開站席區
sofa 顧客等待坐到沙發 顧客離開沙發
barber_chair 顧客等待空理發椅 理發師釋放空理發椅
customer_ready 理發師等待,直到一個顧客坐
到理發椅
顧客坐到理發椅上,給理發師
發出信號
mutex 等待理發師空閑,執行理發或
收款操作
理發師執行理發或收款結束,
進入空閑狀態
mutex1 執行入隊或出隊等待 入隊或出隊結束,釋放信號
finished[i] 顧客等待對應編號理發師理
發結束
理發師理發結束,釋放信號
leave_barberchair 理發師等待顧客離開理發椅 顧客付款完畢得到收據,離開
理發椅釋放信號
payment 收銀員等待顧客付款 顧客付款,發出信號
receipt 顧客等待收銀員收、開具收據收銀員收款結束、開具收據,
釋放信號
偽碼:
semaphore stand_capacity=5;
semaphore sofa=4;
semaphore barber_chair=3;
semaphore customer_ready=0;
semaphore mutex=3;
semaphore mutex1=1;
semaphore finished[3]={0,0,0};
semaphore leave_barberchair=0;
semaphore payment=0;
semaphore receipt=0;
void customer()
{
int barber_number;
wait(stand_capacity); //等待進入理發店
enter_room(); //進入理發店
wait(sofa); //等待沙發
leave_stand_section(); //離開站席區
signal(stand_capacity);
sit_on_sofa(); //坐在沙發上
wait(barber_chair); //等待理發椅
get_up_sofa(); //離開沙發
signal(sofa);
wait(mutex1);
sit_on_barberchair(); //坐到理發椅上
signal(customer_ready);
barber_number=dequeue(); //得到理發師編號
signal(mutex1);
wait(finished[barber_number]); //等待理發結束
pay(); //付款
signal(payment); //付款
wait(receipt); //等待收據
get_up_barberchair(); //離開理發椅
signal(leave_barberchair); //發出離開理發椅信號
exit_shop(); //了離開理發店
}
void barber(int i)
{
while(true)
{
wait(mutex1);
enqueue(i); //將該理發師的編號加入隊列
signal(mutex1);
wait(customer_ready); //等待顧客准備好
wait(mutex);
cut_hair(); //理發
signal(mutex);
signal(finished[i]); //理發結束
wait(leave_barberchair); //等待顧客離開理發椅信號
signal(barber_chair); //釋放barber_chair 信號
}
}
void cash() //收銀
{
while(true)
{
wait(payment); //等待顧客付款
wait(mutex); //原子操作
get_pay(); //接受付款
give_receipt(); //給顧客收據
signal(mutex);
signal(receipt); //收銀完畢,釋放信號
}
}
分析:
在分析該問題過程中,出現若干問題,是參閱相關資料後才認識到這些問題的隱蔽性和嚴重
性的,主要包括:
(1)在顧客進程,如果是在釋放leave_barberchair 信號之後進行付款動作的話,很
容易造成沒有收銀員為其收款的情形, 原因是: 為該顧客理發的理發師收到
leave_barberchair 信號後,釋放barber_chair 信號,另外一名顧客坐到理發椅上,
該理發師有可能為這另外一名顧客理發,而沒有為剛理完發的顧客收款。為解決這個問題,
就是採取在釋放leave_barberchair 信號之前,完成付款操作。這樣該理發師無法進入
下一輪循環為另外顧客服務,只能到收銀台收款。
(2)本演算法是通過給理發師編號的方式,當顧客坐到某理發椅上也同時獲得理發師的編號,
如此,當該理發師理發結束,釋放信號,顧客只有接收到為其理發的理發師的理發結束信號
才會進行付款等操作。這樣實現,是為避免這樣的錯誤,即:如果僅用一個finished 信
號量的話,很容易出現別的理發師理發完畢釋放了finished 信號,把正在理發的這位顧
客趕去付款,而已經理完發的顧客卻被阻塞在理發椅上的情形。當然也可以為顧客進行編
號,讓理發師獲取他理發的顧客的編號,但這樣就會限制顧客的數量,因為finished[]
數組不能是無限的。而為理發師編號,則只需要三個元素即可。
3.參考文獻:
左金平 計算機操作系統中哲學家進餐問題探究。
參考教材 操作系統—內核與設計原理
⑶ 如何利用管程來解決哲學家進餐問題
利用管程機制實現(最終該實現是失敗的,見以下分析):
原理:不是對每隻筷子設置信號量,而是對每個哲學家設置信號量。test()函數有以下作
用:
a. 如果當前處理的哲學家處於飢餓狀態且兩側哲學家不在吃飯狀態,則當前哲學家通過
test()函數試圖進入吃飯狀態。
b. 如果通過test()進入吃飯狀態不成功,那麼當前哲學家就在該信號量阻塞等待,直到
其他的哲學家進程通過test()將該哲學家的狀態設置為EATING。
c. 當一個哲學家進程調用put_forks()放下筷子的時候,會通過test()測試它的鄰居,
如果鄰居處於飢餓狀態,且該鄰居的鄰居不在吃飯狀態,則該鄰居進入吃飯狀態。
由上所述,該演算法不會出現死鎖,因為一個哲學家只有在兩個鄰座都不在進餐時,才允
許轉換到進餐狀態。
該演算法會出現某個哲學家適終無法吃飯的情況,即當該哲學家的左右兩個哲學家交替
處在吃飯的狀態的時候,則該哲學家始終無法進入吃飯的狀態,因此不滿足題目的要求。
但是該演算法能夠實現對於任意多位哲學家的情況都能獲得最大的並行度,因此具有重要
的意義。
偽碼:
#define N 5 /* 哲學家人數*/
#define LEFT (i-1+N)%N /* i的左鄰號碼 */
#define RIGHT (i+1)%N /* i的右鄰號碼 */
typedef enum { THINKING, HUNGRY, EATING } phil_state; /*哲學家狀態*/
monitor dp /*管程*/
{
phil_state state[N];
semaphore mutex =1;
semaphore s[N]; /*每個哲學家一個信號量,初始值為0*/
void test(int i)
{
if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING &&
state[RIGHT(i)] != EATING )
{
state[i] = EATING;
V(s[i]);
}
}
void get_forks(int i)
{
P(mutex);
state[i] = HUNGRY;
test(i); /*試圖得到兩支筷子*/
V(mutex);
P(s[i]); /*得不到筷子則阻塞*/
}
void put_forks(int i)
{
P(mutex);
state[i]= THINKING;
test(LEFT(i)); /*看左鄰是否進餐*/
test(RIGHT(i)); /*看右鄰是否進餐*/
V(mutex);
}
}
哲學家進程如下:
void philosopher(int process)
{
while(true)
{
think();
get_forks(process);
eat();
put_forks(process);
}
}
有更好的答案盡快轉給你
⑷ 怎麼用c語言編程 實現創建原語、撤銷原語、阻塞原語和喚醒原語
下,應該差不多
一、如何建立線程
用到的頭文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定義線程標識
pthread_t
創建線程
pthread_create
對應了一個函數作為線程的程序段
注意的問題
要保證進程不結束(在創建線程後加死循環)
在線程中加入While(1)語句,也就是死循環,保證進程不結束。
二、控制線程並發的函數
sem_t:信號量的類型
sem_init:初始化信號量
sem_wait:相當於P操作
sem_post:相當於V操作
三、實現原形系統
父親、母親、兒子和女兒的題目:
桌上有一隻盤子,每次只能放入一隻水果。爸爸專放蘋果,媽媽專放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。分別用P,V操作和管程實現
每個對應一個線程
pthread_t father; father進程
pthread_t mother; mother進程
pthread_t son; son進程
pthread_t daughter; daughter進程
盤子可以用一個變數表示
sem_t empty;
各線程不是只做一次,可以是無限或有限次循環
用While(1)控制各線程無限次循環
輸出每次是那個線程執行的信息
printf("%s\n",(char *)arg);通過參數arg輸出對應線程執行信息
編譯方法
gcc hex.c -lpthread
生成默認的可執行文件a.out
輸入./a.out命令運行
查看結果:程序連續運行顯示出
father input an apple.
daughter get an apple.
mother input an orange.
son get an orange.
mother input an orange.
son get an orange.
………………..
四、程序源代碼
#include <stdio.h>
#include<string.h>
#include <semaphore.h>
#include <pthread.h>
sem_t empty; //定義信號量
sem_t applefull;
sem_t orangefull;
void *procf(void *arg) //father線程
{
while(1){
sem_wait(&empty); //P操作
printf("%s\n",(char *)arg);
sem_post(&applefull); //V操作
sleep(7);
}
}
void *procm(void *arg) //mother線程
{
while(1){
sem_wait(&empty);
printf("%s\n",(char *)arg);
sem_post(&orangefull);
sleep(3);
}
}
void *procs(void *arg) //son線程
{
while(1){
sem_wait(&orangefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(2);
}
}
void *procd(void *arg) //daughter線程
{
while(1){
sem_wait(&applefull);
printf("%s\n",(char *)arg);
sem_post(&empty);
sleep(5);
}
}
main()
{
pthread_t father; //定義線程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(&empty, 0, 1); //信號量初始化
sem_init(&applefull, 0, 0);
sem_init(&orangefull, 0, 0);
pthread_create(&father,NULL,procf,"father input an apple."); //創建線程
pthread_create(&mother,NULL,procm,"mother input an orange.");
pthread_create(&daughter,NULL,procd,"daughter get an apple.");
pthread_create(&son,NULL,procs,"son get an orange.");
while(1){} //循環等待
}
另外,站長團上有產品團購,便宜有保證
⑸ 計算機科學與技術考研大綱及考研書籍
考研計算機科學與技術大綱及書籍,
不同的院校會有不同的要求的,
這個問題問得我們不知如何作答才好啊,
比如:重慶大學081200計算機科學與技術考研參考書目如下:
917計算機學科專業基礎綜合
[1]DavidA.PattersonJohnL.Hennessy.計算機組成與設計:硬體/軟體介面(原書第4版)[M].北京:機械工業出版社,2012.
[2]嚴蔚敏,吳偉民.數據結構(C語言版本)[M].北京:清華大學出版社,2004.
[3]張堯學,史美林,張高.計算機操作系統教程[M].北京:清華大學出版社,2006(3).
內蒙古大學計算機科學與技術考研:
893 數據結構與操虛燃磨作系統(自命題) ,
《數據結構與演算法》趙玉蘭,清華大學出版社,
《計算機操作系差斗統》第三版,湯段桐小丹,西安電子科技大學出版社
⑹ 管程的wait操作和信號量的wait操作有什麼區別
wait(s) 就是s減1
如果原來是0
那麼就是wait(0)
還記枝盯得C語仿則言中的while嗎 while(0)就是不進入循環 一直等到while(1)再進入循環
(可以這么理解,但猛大和實際while直接不執行循環里的語句,跳過去了)
如果原來>0
直接減1,s的資源少了一個
如果原來
⑺ 計算機研究生考試要考哪幾門啊
計算機歷年考研真題
鏈接:https://pan..com/s/1S0XYQQBxtaFkIAOpoymp9Q
提取碼:cugd
若資租型源有疑弊模猜問歡迎追問碼螞
⑻ linux管程實驗報告 c 語言的
神馬東東?
⑼ C語言內存申請(兩個線程並發)
這是一個操作系統中進程同步典型的消豎喊費者-生產者問題,一般的解法就是按照你這樣來做,給緩沖區上鎖,寫操作完成或者讀操作完成以余扮野後就解鎖,這種問題涉及線程間的通訊,只能夠通過兩個線程的交互來實現通訊,目缺乎前你看起來復雜,但是用得多了,也就不復雜了。線程1「通知」線程2,或者線程2「通知」線程1,其實要利用信號量機制,需要調用wait()與signal()函數,除此之外,還可以利用管程機制來實現線程之間的通訊,深入理解的話建議看看操作系統有關進程同步的教材。