生產消費緩沖池課設報告_第1頁
生產消費緩沖池課設報告_第2頁
生產消費緩沖池課設報告_第3頁
生產消費緩沖池課設報告_第4頁
生產消費緩沖池課設報告_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 操作系統 課程設計報告書題 目 生產消費緩沖池 系 別 計算機工程系 專 業 計算機科學與技術 班 級 姓 名 指導教師 下達日期 2013 年 6 月 15 日設計時間自 2013 年 6 月 17 日 至 2013 年6月 30 日19 / 21文檔可自由編輯打印第一章 課程設計目的操作系統課程設計主要是在學習操作系統課程的基礎上,在完成操作系統各部分實驗的基礎上,對操作系統的整體進行一個模擬,通過實踐加深對各個部分的管理功能的認識,還能進一步分析各個部分之間的聯系,最后達到對完整系統的理解。同時,可以提高運用操作系統知識解決實際問題的能力;鍛煉實際的編程能力;還能提高調查研究、查閱技術

2、文獻、資料以及編寫軟件設計文檔的能力。生產者與消費者問題是經典進程同步問題的典型代表之一。該課程設計通過了解進程間的兩種制約關系,從而理解信號量機制;通過對實例的分析和討論,理解信號量機制實現進程的同步及互斥的方法;通過對經典進程同步問題的剖析,初步掌握運用信號量解決進程同步問題的方法。本系統的功能是根據輸入的生產者進程和消費者進程,動態顯示生產者進程從生產“產品”到放入緩沖區,消費者進程從緩沖區中取“產品”的整個過程,同時,系統也顯示了整個過程中緩沖池中臨界資源的變化情況。生產者-消費者問題是很經典很具有代表性的進程同步問題,計算機中的很多同步問題都可抽象為生產者-消費者問題,通過本實驗的練

3、習,希望能加深學生對進程同步問題的認識與理解。熟悉C+、C、VB的使用,培養和提高學生的分析問題、解決問題的能力。第二章 課程設計內容與要求2.1 生產者與消費者均有二個以上。2.2 生產者和消費者進程的數目在程序界面上可調,在運行時可隨時單個增 加與減少生產者與消費者。2.3 生產者的生產速度與消費者的消費速度均可在程序界面調節,在運行中, 該值調整后立即生效。2.4 多個生產者或多個消費者之間必須有共享對緩沖區進行操作的函數代碼。 2.5 每個生產者和消費者對有界緩沖區進行操作后,即時顯示有界緩沖區全部內 容、當前生產者與消費者的指針位置,以及生產者和消費者線程標識符。 2.6 采用可視化

4、界面,可在運行過程中隨時暫停,查看當前生產者、消費者以及有界緩沖區的狀態。 第三章 系統分析與設計3.1系統分析多個生產者進程在生產產品,并將這些產品提供給消費者進程去消費。為使生產者進程與消費者進程能并發執行,在兩者之間設置了一個具有20個存儲單元的緩沖區,生產者進程將它所生產的產品放入緩沖區中;消費者進程可從緩沖區中取走產品去消費。利用信號量機制來實現多進程(生產者進程和消費者進程)對緩沖區(臨界資源)的互斥訪問。設置多進程的共享變量為臨界資源,同時給它設置一個互斥信號量,多進程利用互斥信號量來完成對臨界資源的互斥訪問(當信號量為某個值是允許進程訪問,否則則不允許進程訪問),從而確保共享數

5、據的正確性。3.2系統設計3.2.1問題的提出并發程序在設計上是有困難, 其中最大的問題是進程或者線程間的同步問題, 而生產者消費者問題是最經典的問題之一, 其描述如下: 有n 個生產者和m 個消費者, 連接在一個有k 個單位緩沖區的有界環形緩沖上, pi、cj 都是并發進程, 只要緩沖區未滿, 生產者pi 生產的產品就可以投入緩沖區; 類似地, 只要緩沖區不空, 消費者進程cj 就可以從緩沖區取走并消耗產品。3.2.2問題的解決模型在Windows中,常見的同步對象有:信號量(Semaphore)、互斥量(Mutex) 。使用這些對象都分為三個步驟,一是創建或者初始化;接著請求該同步對象,隨

6、即進入臨界區,這一步對應于互斥量的上鎖;最后釋放該同步對象,這對應于互斥量的解鎖。這些同步對象在主進程中創建,在其子線程中都可。3.3模塊設計模式還需要有一個緩沖區處于生產者和消費者之間,作為一個中介。生產者把數據放入緩沖區,而消費者從緩沖區取出數據。阻塞為空生產者流程圖:無空緩沖區否空緩沖區是對緩沖區加鎖結 束 解 鎖緩沖區已滿,請等待生產者生產產品 放入緩沖區 消費者流程圖:阻塞為空否無滿緩沖區滿緩沖區是結 束 解 鎖沒有產品可消費,請等待消費者消費緩沖區內的產品對緩沖區加鎖第四章 模塊調試與系統測試4.1模塊調試l 輸入的形式:輸入生產線程/消費線程,同時設置緩存池的大小。l 輸出的形式

7、:動態展現生產者生產和消費者消費的全過程。l 程序所能達到的功能:本系統的功能是根據輸入的生產者進程和消費者進程以及緩沖區的大小,動態顯示生產者進程從生產“產品”到放入緩沖區,消費者進程從緩沖區中取“產品”的整個過程,同時,系統也顯示了整個過程中緩沖區中臨界資源的變化情況。4.2調試分析根據用戶的實際要求對系統進行初始化并執行程序,其操作的一般流程:系統初始化(設置進程數和緩沖區的大小)、生產者生產資源并存放在緩沖區中、消費者從緩沖區中取資源和消耗資源。不足和缺陷:此程序不便于對較大的數據量的生產者消費者問題進行測試,主要由于設計上的對系統處理的數據量的限制,例如本系統初始化方面設計時將緩沖區

8、大小限制了固定大小。沒有對其中的生產者和消費者設置優先級,在生產者和消費者進程中只是以采用synchronized方法,隨機的確保每個進程都能夠執行,不能滿足用戶某些優先進程的特殊要求。第五章 運行結果圖5-1 初始化圖5-2 生產者生產過程1圖5-3 生產者生產過程2圖5-4 消費者消費過程1圖5-4 消費者消費過程2第六章 源程序#include "stdafx.h"#include "2.h"#include "2Dlg.h"#include "function.h"#include "reques

9、t.h"#include "recover.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard gener

10、ated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_IN

11、ITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMy2Dlg dialogCMy2Dlg:CMy2Dlg(CWnd* pParent /*=NULL*/): CDialog(CMy2Dlg:

12、IDD, pParent)/AFX_DATA_INIT(CMy2Dlg)m_edit = _T("");/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CMy2Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMy2Dlg)DDX_Te

13、xt(pDX, IDC_EDIT1, m_edit);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMy2Dlg, CDialog)/AFX_MSG_MAP(CMy2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_COMMAND(ID_HELP, OnHelp)ON_COMMAND(ID_

14、assign, Onassign)ON_COMMAND(ID_exit, Onexit)ON_COMMAND(ID_recover, Onrecover)ON_COMMAND(ID_init, Oninit)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMy2Dlg message handlersBOOL CMy2Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu item to system menu./ IDM_ABOUTBOX must be in the system comm

15、and range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu

16、(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here m_edit=""r

17、eturn TRUE; / return TRUE unless you set the focus to a controlvoid CMy2Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code belo

18、w/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CMy2Dlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client recta

19、ngleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();list *p=head;HDC hdc=:GetDC(m_hWn

20、d);HPEN hp;HBRUSH hbr;HFONT hf;TEXTMETRIC tm;CString x;int count=0;SelectObject(hdc,hp);SelectObject(hdc,hf);GetTextMetrics(hdc,&tm);hbr=(HBRUSH)GetStockObject(LTGRAY_BRUSH);SelectObject(hdc,hbr);Rectangle(hdc,105,20,140,340);while(p!=NULL)if(p->flag=0)hbr=(HBRUSH)GetStockObject(WHITE_BRUSH);

21、elseif(count%2=0)hbr=CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,0);elsehbr=CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,0);count+; SelectObject(hdc,hbr);Rectangle(hdc,20,20+p->start/2,100,20+(p->length+p->start)/2); x.Format("%d",p->start);TextOut(hdc,110,p->start/2+20-tm.tmHeight/2,x,s

22、trlen(x);x.Format("%d",p->start+p->length); TextOut(hdc,110,(p->start+p->length)/2+20-tm.tmHeight/2,x,strlen(x);p=p->next;p=head;CString s="注:狀態為0表示為空閑分區,rn1表示為進程使用分區rn-rn"m_edit=""sum=0;while(p!=NULL)if(p->PID!=0)x.Format("%d",p->PID); s=

23、s+"使用進程PID:"+x+"rn"sum=sum+p->length;x.Format("%d",p->flag);s=s+"狀態:"+x+"rn"x.Format("%d",p->start);s=s+"起始位置:"+x+"rn"x.Format("%d",p->length);s=s+"空間大小:"+x+"rn"x.Format("%d

24、",p->length+p->start);s=s+"結束位置:"+x+"rn"s=s+"-rn"p=p->next;m_edit=s;UpdateData(FALSE);/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CMy2Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CMy2Dlg:

25、OnButton1() / TODO: Add your control notification handler code here head->flag=0;head->length=640;head->next=NULL;head->PID=0;head->start=0;OnPaint();void CMy2Dlg:OnButton3() / TODO: Add your control notification handler code hereUpdateData(TRUE);request_dlg.m_pid=""request_

26、dlg.m_request=""if(sum>=640)MessageBox("存儲空間已滿!"); elseif(request_dlg.DoModal()=IDOK) int pid=0,request=0,flag=0; for(int i=0;i<strlen(request_dlg.m_pid);i+) pid=pid*10+request_dlg.m_pidi-'0' for(i=0;i<strlen(request_dlg.m_request);i+) request=request*10+request_

27、dlg.m_requesti-'0' list *p=head,*q,*s=head; while(p!=NULL) if(p->flag=0&&p->length>=request&&request!=0)count+; flag=1; q=(list*)malloc(sizeof(list); q->flag=1; q->PID=pid; q->start=p->start; q->length=request; q->next=p; p->start=p->start+req

28、uest; p->length=p->length-request; if(p=head) head=q; else s->next=q; if(p->length=0) q->next=p->next; break; s=p; p=p->next; if(flag=0&&request!=0) MessageBox("申請空間失敗!"); OnPaint(); UpdateData(FALSE);void CMy2Dlg:OnButton4() / TODO: Add your control notificati

29、on handler code hereUpdateData(TRUE);int pid=0,length=0,i=0,flag=0;list *p=head,*q=head,*s; recover_dlg.m_start=""recover_dlg.m_length=""if(count>0)if(recover_dlg.DoModal()=IDOK) for(i=0;i<strlen(recover_dlg.m_start);i+) pid=pid*10+recover_dlg.m_starti-'0' for(i=0;i

30、<strlen(recover_dlg.m_length);i+) length=length*10+recover_dlg.m_lengthi-'0' while(p!=NULL) if(p->PID=pid&&length!=0&&p->flag=1) p->PID=0; p->flag=0; if(p=head) s=p->next; if(s!=NULL&&s->flag=0) p->length=p->length+s->length; p->next=s

31、->next; break; else s=p->next; if(q->flag=0&&s->flag=1) q->length=q->length+p->length; q->next=p->next; if(q->flag=1&&s->flag=0) p->length=p->length+s->length; p->next=s->next; if(q->flag=0&&s->flag=0) q->length=q->length+p->length+s->length; q-&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論