第一篇:處理機(jī)調(diào)度與死鎖小結(jié)
第三章 處理機(jī)調(diào)度與死鎖
重點(diǎn)與難點(diǎn)小結(jié)
1.高優(yōu)先權(quán)調(diào)度和基于時(shí)間片的輪轉(zhuǎn)調(diào)度算法
1)高優(yōu)先權(quán)優(yōu)先調(diào)度
2)高響應(yīng)比優(yōu)先調(diào)度
3)時(shí)間片輪轉(zhuǎn)調(diào)度
4)多級(jí)反饋隊(duì)列調(diào)度
2.常用的幾種實(shí)時(shí)調(diào)度算法
1)最早截止時(shí)間優(yōu)先(EDF)算法
2)最低松弛度優(yōu)先(LLF)算法
3.多處理機(jī)環(huán)境下的進(jìn)程(線程)調(diào)度方式
1)自調(diào)度方式
2)成組調(diào)度方式
3)專用處理器分配方式
4.死鎖的基本概念
1)產(chǎn)生死鎖的原因
2)產(chǎn)生死鎖的必要條件
5.預(yù)防死鎖的方法
1)摒棄互斥條件
2)摒棄請(qǐng)求保持條件
3)摒棄不剝奪條件
4)摒棄環(huán)路等待條件
5)各種方式的比較
6.死鎖的避免
熟練掌握銀行家算法和安全性檢測(cè)算法,并能利用這兩個(gè)算法求解具體問題
第二篇:第三章 處理機(jī)調(diào)度與死鎖小結(jié)
第三章 處理機(jī)調(diào)度與死鎖
重點(diǎn)與難點(diǎn)小結(jié)
1.高優(yōu)先權(quán)調(diào)度和基于時(shí)間片的輪轉(zhuǎn)調(diào)度算法
1)
2)
3)時(shí)間片輪轉(zhuǎn)調(diào)度
4)多級(jí)反饋隊(duì)列調(diào)度
2.常用的幾種實(shí)時(shí)調(diào)度算法
1)最早截止時(shí)間優(yōu)先(EDF)算法
2)最低松弛度優(yōu)先(LLF)算法
3.死鎖的基本概念
1)2)4.預(yù)防死鎖的方法
1)摒棄互斥條件
2)摒棄請(qǐng)求保持條件
3)摒棄不剝奪條件
4)摒棄環(huán)路等待條件
5)各種方式的比較
5.死鎖的避免 熟練掌握銀行家算法和安全性檢測(cè)算法,并能利用這兩個(gè)算法求解具體問題
6.死鎖定理
第三篇:操作系統(tǒng)-課程設(shè)計(jì)報(bào)告-處理機(jī)調(diào)度程序
操作系統(tǒng)
課程設(shè)計(jì)報(bào)告
學(xué)校:廣州大學(xué)
學(xué)院:計(jì)算機(jī)科學(xué)與教育軟件學(xué)院 班級(jí):計(jì)算機(jī)127班 課題:處理機(jī)調(diào)度程序
任課老師:陶文正、陳文彬
姓名:黃俊鵬
學(xué)號(hào):1200002111 班內(nèi)序號(hào):27 成績(jī):
日期:2015年1月6日
一、設(shè)計(jì)目的
在多道程序和多任務(wù)系統(tǒng)中,系統(tǒng)內(nèi)同時(shí)處于就緒狀態(tài)的進(jìn)程可能有若干個(gè)。也就是說能運(yùn)行的進(jìn)程數(shù)大于處理機(jī)個(gè)數(shù)。為了使系統(tǒng)中的進(jìn)程能有條不紊地工作,必須選用某種調(diào)度策略,選擇一進(jìn)程占用處理機(jī)。要求學(xué)生設(shè)計(jì)一個(gè)模擬處理機(jī)調(diào)度算法,以鞏固和加深處理機(jī)調(diào)度的概念。
二、設(shè)計(jì)要求
1)進(jìn)程調(diào)度算法包括:時(shí)間片輪轉(zhuǎn)法,短作業(yè)優(yōu)先算法,動(dòng)態(tài)優(yōu)先級(jí)算法。2)可選擇進(jìn)程數(shù)量
3)本程序包括三種算法,用C語言實(shí)現(xiàn),執(zhí)行時(shí)在主界面選擇算法(可用函數(shù)實(shí)現(xiàn))(進(jìn)程數(shù),運(yùn)行時(shí)間,優(yōu)先數(shù)由隨機(jī)函數(shù)產(chǎn)生)執(zhí)行,顯示結(jié)果。
三、設(shè)計(jì)思路及算法思想
1.界面菜單選項(xiàng)
一級(jí)菜單提供2個(gè)選項(xiàng): ① 自動(dòng)生成進(jìn)程數(shù)量 ② 手動(dòng)輸入所需進(jìn)程數(shù)量
一級(jí)菜單選擇完畢后進(jìn)入二級(jí)菜單: ① 重新生成進(jìn)程 ② 時(shí)間片輪轉(zhuǎn)法 ③ 短作業(yè)優(yōu)先算法 ④ 動(dòng)態(tài)優(yōu)先級(jí)算法 ⑤ 退出程序
2.調(diào)度算法
程序所用PCB結(jié)構(gòu)體
需要用到的進(jìn)程結(jié)構(gòu)體如上圖所示
1)時(shí)間片輪轉(zhuǎn)法
主要是設(shè)置一個(gè)當(dāng)前時(shí)間變量,curTime和時(shí)間片roundTime。
遍歷進(jìn)程組的時(shí)候,每運(yùn)行一個(gè)進(jìn)程,就把curTime += roundTime。進(jìn)程已運(yùn)行時(shí)間加roundTime
2)短作業(yè)優(yōu)先算法
遍歷進(jìn)程組,找到未運(yùn)行完成并且運(yùn)行時(shí)間最短的進(jìn)程,讓它一次運(yùn)行完成,如此往復(fù),直到所有進(jìn)程都運(yùn)行完成為止。
3)動(dòng)態(tài)優(yōu)先級(jí)算法
做法跟短作業(yè)優(yōu)先算法類似,此處主要是比較進(jìn)程的優(yōu)先數(shù),優(yōu)先級(jí)高者,先執(zhí)行。直到全部執(zhí)行完畢。當(dāng)一個(gè)進(jìn)程運(yùn)行完畢后,適當(dāng)增減其余進(jìn)程的優(yōu)先數(shù),以達(dá)到動(dòng)態(tài)調(diào)成優(yōu)先級(jí)的效果。
3.程序流程圖
四、運(yùn)行截圖
1)啟動(dòng)后輸入5,生成5個(gè)進(jìn)程
2)輸入1,選擇時(shí)間片輪轉(zhuǎn)法。
自動(dòng)輸出結(jié)果,分別是時(shí)間片為1和4的結(jié)果
3)輸入2,選擇短作業(yè)優(yōu)先算法
4)輸入3,選擇動(dòng)態(tài)優(yōu)先級(jí)算法
5)輸入0,重新生成進(jìn)程,再輸入3,生成3個(gè)進(jìn)程,選擇2.短作業(yè)優(yōu)先算法
6)輸入q,退出
五、心得體會(huì)
通過這次實(shí)驗(yàn),讓我對(duì)操作系統(tǒng)的進(jìn)程調(diào)度有了更進(jìn)一步的了解。這個(gè)實(shí)驗(yàn)的模擬程度跟真實(shí)系統(tǒng)相比只是冰山一角,由此可見操作系統(tǒng)是何其復(fù)雜的軟件產(chǎn)品,僅進(jìn)程調(diào)度就有那么豐富和內(nèi)涵的知識(shí)需要掌握。
但是再復(fù)雜的系統(tǒng),都是由小部件構(gòu)成的。古語云:不積跬步,無以至千里。不積小流,無以成江海。掌握這些基礎(chǔ)的知識(shí),可以為以后打下扎實(shí)的基礎(chǔ)。
六、附錄(源代碼)
//
// main.c
// ProcessDispatch //
// Created by Jeans on 1/5/15.// Copyright(c)2015 Jeans.All rights reserved.//
#include
//最小進(jìn)程數(shù)
#define MIN_PROCESS //最大進(jìn)程數(shù)
#define MAX_PROCESS
//最小優(yōu)先數(shù)
#define MIN_PRIORITY
0 //最大優(yōu)先數(shù)
#define MAX_PRIORITY
//最小運(yùn)行時(shí)間
#define MIN_RUNNING_TIME
//最大運(yùn)行時(shí)間
#define MAX_RUNNING_TIME
typedef struct PCB{
char name;
//進(jìn)程名
int priority;
//優(yōu)先數(shù)
int runningTime;
//運(yùn)行時(shí)間
int arriveTime;
//到達(dá)時(shí)間
int beginTime;
//開始時(shí)間
int finishTime;
//完成時(shí)間
int cyclingTime;
//周轉(zhuǎn)時(shí)間
double weigthCyclingTime;//帶權(quán)周轉(zhuǎn)時(shí)間
int hadRunTime;
//已經(jīng)運(yùn)行時(shí)間
int finish;
//是否完成 }PCB;//獲取隨機(jī)數(shù)
int GetRandomNumber(int min,int max){
return arc4random()%(max-min)+ min;}
//初始化PCB組
void InitPCBGroup(PCB p[],int num){
char name = 'A';
for(int i = 0;i < num;i++){
p[i].name = name;
p[i].priority = GetRandomNumber(MIN_PRIORITY, MAX_PRIORITY);
p[i].runningTime = GetRandomNumber(MIN_RUNNING_TIME,MAX_RUNNING_TIME);
name++;
} }
void PrintResult(PCB p[],int num){
double avgCycTime = 0,avgWeiCycTime = 0;
printf(“|進(jìn)程名
到達(dá)時(shí)間
運(yùn)行時(shí)間
開始時(shí)間
完成時(shí)間
周轉(zhuǎn)時(shí)間
帶權(quán)周轉(zhuǎn)時(shí)間
優(yōu)先數(shù)
|n”);
for(int i = 0;i < num;i++){
printf(“|%3c
%-4d
%-4d
%-4d
%-4d
%-4d
%-6.2f
%-4d|n”,p[i].name,p[i].arriveTime,p[i].runningTime,p[i].beginTime,p[i].finishTime,p[i].cyclingTime,p[i].weigthCyclingTime,p[i].priority);
avgCycTime += p[i].cyclingTime;
avgWeiCycTime += p[i].weigthCyclingTime;
//還原
p[i].arriveTime = 0;
p[i].beginTime = 0;
p[i].finishTime = 0;
p[i].cyclingTime = 0;
p[i].weigthCyclingTime = 0;
p[i].hadRunTime = 0;
p[i].finish = 0;
}
avgWeiCycTime /= num;
avgCycTime /= num;
printf(“平均周轉(zhuǎn)時(shí)間:%.2f
平均帶權(quán)周轉(zhuǎn)時(shí)間:%.2fn”,avgCycTime,avgWeiCycTime);} //時(shí)間片輪轉(zhuǎn)法
void RealRoundRobin(PCB p[],int num,int roundTime){
printf(“nn-----------------------------時(shí)間片:%d------n”,roundTime);
int finishNum = 0;
int curTime = 0;
while(finishNum!= num){
for(int i = 0;i < num;i++){
if(p[i].finish)continue;
//開始時(shí)間
if(p[i].beginTime == 0 && i!= 0){
p[i].beginTime = curTime;
}
//已經(jīng)完成
if(p[i].hadRunTime + roundTime >= p[i].runningTime){
p[i].finishTime = curTime + p[i].runningTimep[i].arriveTime;
p[i].weigthCyclingTime = p[i].cyclingTime/(double)p[i].runningTime;
p[i].finish = 1;
finishNum ++;
curTime += p[i].runningTimep[min].arriveTime;
p[min].weigthCyclingTime = p[min].cyclingTime/(double)p[min].runningTime;
p[min].finish = 1;
finishNum++;
curTime = p[min].finishTime;
}
PrintResult(p, num);}
//動(dòng)態(tài)優(yōu)先級(jí)算法
void DynamicPriorityFirst(PCB p[],int num){
printf(“nn-----------------------------動(dòng)態(tài)優(yōu)先級(jí)算法--n”);
int finishNum = 0;
int curTime = 0;
while(finishNum!= num){
int min = 0;
//查找優(yōu)先級(jí)最高下標(biāo)
for(int i = 1;i < num;i++){
if(p[i].finish == 0 && p[min].priority >= p[i].priority)
min = i;
else if(p[i].finish == 0 && p[min].finish == 1)
min = i;
}
p[min].beginTime = curTime;
p[min].hadRunTime = p[min].runningTime;
p[min].finishTime = p[min].beginTime + p[min].runningTime;
p[min].cyclingTime = p[min].finishTime-p[min].arriveTime;
p[min].weigthCyclingTime = p[min].cyclingTime/(double)p[min].runningTime;
p[min].finish = 1;
finishNum++;
curTime = p[min].finishTime;
}
PrintResult(p, num);}
int main(int argc, const char * argv[]){
PCB pcbGroup[30];
//pcb數(shù)組
int processNum = 0;//進(jìn)程數(shù)
while(1){
//選擇進(jìn)程數(shù)量
while(1){
if(processNum!= 0)
break;
printf(“n----------n”);
printf(“當(dāng)前默認(rèn)進(jìn)程數(shù)范圍%d--%dn”,MIN_PROCESS,MAX_PROCESS);
printf(“1)輸入0可隨機(jī)生成進(jìn)程數(shù)目n2)輸入%d-%d范圍內(nèi)數(shù)字,回車,可生成指定數(shù)目進(jìn)程n>>>>>>”,MIN_PROCESS,MAX_PROCESS);
int num = 0;
scanf(“%d”,&num);
if(num == 0){
processNum = GetRandomNumber(MIN_PROCESS, MAX_PROCESS);
break;
}else{
if((num >= MIN_PROCESS)&&(num <= MAX_PROCESS)){
processNum = num;
InitPCBGroup(pcbGroup,processNum);
break;
}else
printf(“n輸入有誤,請(qǐng)重新輸入.n”);
}
}
//選擇算法
printf(“n-----------------------------請(qǐng)輸入對(duì)應(yīng)選項(xiàng)序號(hào)-----------------------------n”);
printf(“0.重新生成進(jìn)程 | 1.時(shí)間片輪轉(zhuǎn)法 | 2.短作業(yè)優(yōu)先算法 | 3.動(dòng)態(tài)優(yōu)先級(jí)算法 | q.退出n>>>>>>”);
char ch;
while((ch = getchar())== 'n');
switch(ch){
case '0'://0 重新生成進(jìn)程
processNum = 0;break;
case '1'://1 時(shí)間片輪轉(zhuǎn)法
RoundRobin(pcbGroup, processNum);break;
case '2'://2 短作業(yè)優(yōu)先算法
ShortestJobFirst(pcbGroup, processNum);break;
case '3'://3 動(dòng)態(tài)優(yōu)先級(jí)算法
DynamicPriorityFirst(pcbGroup,processNum);break;
case 'q'://q 退出
exit(0);
default:
break;
}
}
return 0;}
第四篇:操作系統(tǒng) 單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度
一.實(shí)驗(yàn)內(nèi)容描述
1.目的
(1)了解Windows內(nèi)存管理器(2)理解Windows的地址過程 2.內(nèi)容
任意給出一個(gè)虛擬地址,通過WinDbg觀察相關(guān)數(shù)據(jù)并找到其物理地址
二.理論分析
Windows采用頁式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁面是硬件級(jí)別上的最小保護(hù)單位 1.Windows內(nèi)存管理器
Windows的內(nèi)存管理主要由Windows執(zhí)行體中的虛存管理程序負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé)與具體API相關(guān)的一些用戶態(tài)特性的實(shí)現(xiàn)。虛存管理程序是Windows中負(fù)責(zé)內(nèi)存管理的那些子程序和數(shù)據(jù)結(jié)構(gòu)的集合 內(nèi)存管理器的主要任務(wù)是:
地址變換:將一個(gè)進(jìn)程的虛擬地址空間轉(zhuǎn)譯為物理內(nèi)存地址
交換:當(dāng)內(nèi)存不足時(shí),將內(nèi)存中的有些內(nèi)容轉(zhuǎn)移到磁盤上,并且以后還要再次將這些內(nèi)容讀回
2.Windows內(nèi)存管理策略
Windows采用頁式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁面是硬件級(jí)別上最小的保護(hù)單位。根據(jù)硬件的體系結(jié)構(gòu)不同,頁面尺寸被分為兩種,大頁面和小頁面。X86系統(tǒng)下小頁面為4KB,大頁面為4MB。大頁面的優(yōu)點(diǎn)是:當(dāng)引用同一頁面內(nèi)其他數(shù)據(jù)時(shí),地址轉(zhuǎn)移的速度會(huì)很快。不過使用大頁面通常要較大的內(nèi)存空間,而且必須用一個(gè)單獨(dú)的保護(hù)項(xiàng)來映射,因此可能會(huì)造成出現(xiàn)錯(cuò)誤而不引發(fā)內(nèi)存訪問違例的情況。通常PC機(jī)都為小頁面 3.Windows虛擬地址空間布局 x86結(jié)構(gòu)下的布局方式:
默認(rèn)情況下,32位Windows系統(tǒng)中每個(gè)用戶進(jìn)程可以占有2GB的私有地址空間。操作系統(tǒng)占有另外的2GB 2GB用戶的進(jìn)程地址空間布局如表:
2GB的系統(tǒng)地址空間布局如同:
3.虛擬地址轉(zhuǎn)譯
地址轉(zhuǎn)譯是指將進(jìn)程的虛擬地址空間映射到實(shí)際物理頁面的過程。x86系統(tǒng)中地址轉(zhuǎn)譯過程如圖:
關(guān)鍵數(shù)據(jù)結(jié)構(gòu)如下: 頁目錄:每個(gè)進(jìn)程都有一個(gè)頁目錄,它是內(nèi)存管理器為了映射進(jìn)程中所有的頁表位置而創(chuàng)建的一個(gè)頁面。進(jìn)程也目錄的地址被保存在內(nèi)核進(jìn)程快KPROCESS中,在x86系統(tǒng)上,它被映射到虛擬地址0xC0300000,當(dāng)一個(gè)進(jìn)程正在執(zhí)行時(shí),CPU可以通過寄存器CR3知道該進(jìn)程頁目錄的位置。頁目錄由目錄項(xiàng)(PDE)構(gòu)成,每個(gè)PDE長(zhǎng)4字節(jié),描述了該進(jìn)程中所有可能的頁表的狀態(tài)和位置。其格式和PTE類似。x86系統(tǒng)上,要描述完整的4GB虛擬地址空間,需要1024個(gè)頁表。因此映射這些頁表的進(jìn)程頁目錄需包含1024個(gè)PDE,恰好占用一個(gè)頁面。
頁表:進(jìn)程的頁目錄項(xiàng)指向頁表。每個(gè)頁表占用一個(gè)頁面,由1024項(xiàng)PTE組成。一個(gè)有效的PTE大小為4字節(jié),包含兩個(gè)主域:數(shù)據(jù)所在的物理頁面的頁面幀編號(hào)(PNF)或者內(nèi)存中一個(gè)頁面的物理地址的PFN;一些描述該頁面狀態(tài)和保護(hù)屬性的標(biāo)志。
虛擬地質(zhì)結(jié)構(gòu):x86系統(tǒng)上,一個(gè)32位虛擬地址被解釋為三個(gè)單獨(dú)的部分,頁目錄索引、頁表索引和字節(jié)索引。由于頁目錄項(xiàng)有1024個(gè),因此頁目錄索引為10位;一個(gè)也表中含有1024個(gè)PTE。因此頁表索引也為10位,字節(jié)索引為12位,正好表示一頁(4KB)內(nèi)容
三.實(shí)驗(yàn)步驟及結(jié)果
1.查找頁目錄首地址
以程序WG.exe作為觀測(cè)對(duì)象。
啟動(dòng)WinDbg到內(nèi)核調(diào)試模式,運(yùn)行程序WG.exe。終斷目標(biāo)機(jī)運(yùn)行,輸入命令:kd>!process
發(fā)現(xiàn)WG.exe進(jìn)程正處于運(yùn)行狀態(tài) 輸入命令:
在KPROCESS中名為DirectoryTableBase的域,對(duì)應(yīng)值為0x9fa6000,即WG.exe進(jìn)程頁目錄的物理地址 查看CR3寄存其中的內(nèi)容,輸入命令:
CR3寄存其中的值和KPROCESS中記錄的頁目錄基址相同。這是因?yàn)樵贑PU切換執(zhí)行任務(wù)時(shí),其內(nèi)容要更新為當(dāng)前進(jìn)程的頁目錄基址。2.地址轉(zhuǎn)譯過程
假設(shè)給定的虛擬地址為0x401001 輸入命令:
可以看到:
PDE的虛擬地址為C0300004.PTE的虛擬地址為C0001004 最后一行信息“pfn 9e4a---DA--UWEV”表示PDE中的具體內(nèi)容,9e4a是給定虛擬地址所在頁表在內(nèi)存中對(duì)應(yīng)的物理頁號(hào),“---DA—UWEV”是標(biāo)志信息,“pfn a173----A--UREV”表示PTE中的具體內(nèi)容,a173是數(shù)據(jù)頁裝入內(nèi)存的物理頁號(hào)。
將數(shù)據(jù)頁對(duì)應(yīng)的物理頁號(hào)a173加上業(yè)內(nèi)索引(0x1)即可得到虛擬地址0x401001的物理地址
3.觀察系統(tǒng)頁表
給定觀測(cè)虛擬地址為0x80001001 輸入命令:
當(dāng)前正在執(zhí)行的進(jìn)程是:WG.exe 輸入命令:
得到PDE為C0300800,其對(duì)應(yīng)的物理頁號(hào)為3b 繼續(xù)讓目標(biāo)機(jī)運(yùn)行,啟動(dòng)A.exe,然后中斷目標(biāo)機(jī)運(yùn)行。輸入命令:
當(dāng)前正在執(zhí)行的進(jìn)程為A.exe 輸入命令:
PDE信息和對(duì)應(yīng)的物理頁號(hào)與前面觀測(cè)到的相同
四.結(jié)論
1.數(shù)據(jù)頁對(duì)應(yīng)的物理頁號(hào)加上相應(yīng)業(yè)內(nèi)索引即可得到虛擬地址的物理地址 2.不同的進(jìn)程頁目錄都指向了相同的系統(tǒng)表頁
五.心得體會(huì)
在這次上機(jī)實(shí)驗(yàn),通過對(duì)WinDbg和VPc的調(diào)試運(yùn)用,我熟悉了Windows內(nèi)存管理器的結(jié)構(gòu),也認(rèn)知到Windows如何進(jìn)行地址轉(zhuǎn)譯和轉(zhuǎn)換。對(duì)相關(guān)的知識(shí)也進(jìn)行了溫習(xí),更牢的掌握了相關(guān)知識(shí)。當(dāng)然這些還遠(yuǎn)遠(yuǎn)不夠,我以后還要繼續(xù)不斷努力,去學(xué)習(xí)了解掌握操作系統(tǒng)的各方面知識(shí)。
附錄:
1.A.exe代碼
#include
#define N 1
HANDLE mutexSemaphore;HANDLE synchSemaphore_1;HANDLE synchSemaphore_2;
HANDLE mutexDisplay;
void Display(char*str,int delayTime){ if(WaitForSingleObject(mutexDisplay,INFINITE)==WAIT_OBJECT_0){ printf(“%snn”,str);ReleaseMutex(mutexDisplay);Sleep(delayTime);} }
void useTime(double limit){ for(double i=0;i<=limit;i+=0.001);}
void CreateProduct(){ Display(“Creating a production...”,0);useTime(200000);Display(“Creating finished.”,100);}
void PutProduct(){ Display(“Putting a production...”,0);useTime(150000);Display(“Putting finished”,100);}
void GetProduct(){ Display(“Getting a production...”,0);useTime(100000);Display(“Getting finished.”,100);}
void ConsumeProduct(){ Display(“Cosuming a production...”,0);useTime(100000);Display(“Cosuming finished.”,100);}
void Producer(){ while(true){ CreateProduct();
if(WaitForSingleObject(synchSemaphore_1,INFINITE)==WAIT_OBJECT_0){
if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ PutProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_2,1,NULL);} } }
void Consumer(){ while(true){
if(WaitForSingleObject(synchSemaphore_2,INFINITE)==WAIT_OBJECT_0){
if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ GetProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_1,1,NULL);} ConsumeProduct();} }
int main(){ HANDLE thread[2];DWORD threadID[2];
synchSemaphore_1=CreateSemaphore(NULL,N,N,NULL);synchSemaphore_2=CreateSemaphore(NULL,0,N,NULL);mutexSemaphore=CreateSemaphore(NULL,1,1,NULL);
mutexDisplay=CreateMutex(NULL,FALSE,NULL);
printf(“Program start.Please use WinDbg to observe main thread.nPress any key to continue...n”);getchar();
thread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),NULL,CREATE_SUSPENDED,&threadID[0]);printf(“A producer was created.Please use WinDbg to observe producer thread.nPress any key to continue...n”);getchar();
thread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),NULL,CREATE_SUSPENDED,&threadID[1]);printf(“A Consumer was created.Please use WinDbg to observe Consumer thread.nPress any key to continue...n”);getchar();
printf(“Please select:n[1]Make producer thread runn[2]Make Consumer thread runn”);bool flag=true;bool flag_1=true,flag_2=true;int count=0;while(flag){ if(getchar()=='1'&&flag_1){ ResumeThread(thread[0]);count++;flag_1=false;} else if(getchar()=='2'&&flag_2){ ResumeThread(thread[1]);count++;flag_2=false;} if(count==2)flag=false;} WaitForMultipleObjects(1,thread,TRUE,INFINITE);
return 0;}
2.WG.exe代碼: #include
int main(){ int a=0;printf(“I'm Wangn”);while(true){a++;} }
第五篇:生產(chǎn)調(diào)度小結(jié)
作為計(jì)劃調(diào)度,時(shí)刻都要按計(jì)劃要求注意產(chǎn)品的流動(dòng)狀態(tài)。鑄造作為產(chǎn)品的始端,是否能夠按計(jì)劃完成客戶訂單起著極其重要的地位。因此每天要到鑄造車間巡視3—4次,監(jiān)督重力和低壓是否按計(jì)劃進(jìn)行生產(chǎn),對(duì)于即將發(fā)貨的型號(hào)要及時(shí)督促完成,以免影響發(fā)貨。在查看鑄造型號(hào)時(shí),有的鑄件型號(hào)刻于零件的外圈,有的位于內(nèi)邊緣。還可以從輪轂的輻條上得到型號(hào)(模具號(hào)+規(guī)格)。
機(jī)加作為對(duì)毛坯的處理階段,要關(guān)注每天所加工的型號(hào)是否按計(jì)劃正常進(jìn)行,對(duì)于發(fā)現(xiàn)的問題要及時(shí)告知,若有不改者及時(shí)通知其部門負(fù)責(zé)人。在機(jī)加車間巡視時(shí)不僅要關(guān)注即將發(fā)貨的型號(hào),還要注意已加工完成還未及時(shí)轉(zhuǎn)入下個(gè)工序的產(chǎn)品。若出現(xiàn)這類情況告知有關(guān)人員并及時(shí)清理。一旦出現(xiàn)問題機(jī)加責(zé)任重大,自身疏忽監(jiān)督也難辭其咎,所以,要全面的,認(rèn)真對(duì)待自己的工作,不得有半點(diǎn)馬虎。在機(jī)加巡視時(shí),留心學(xué)習(xí)各個(gè)車輪型號(hào),要達(dá)到當(dāng)看見輪子時(shí)就能知道它屬于什么模具類型和尺寸大小
做事要有主次,有輕重,有責(zé)任,每天要有一個(gè)清醒的任務(wù),今天要完成什么,或者什么該加緊完成,對(duì)于即將出貨的訂單型號(hào)要及時(shí)去鑄造、機(jī)加、涂裝巡視產(chǎn)品歸于何處并告知相關(guān)人員及時(shí)將此類型號(hào)的產(chǎn)品抓緊完成。