操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)上機(jī) 實(shí) 驗(yàn) 報(bào) 告 成績(jī)教 師: 方敏 2016 年 12月 17日班 級(jí): 1403018 學(xué) 號(hào): 140607815 姓 名: 黃楊 實(shí)驗(yàn)地點(diǎn): E-區(qū)208 實(shí)驗(yàn)時(shí)間: 2016.10.132016.12.17 實(shí)驗(yàn)一 創(chuàng)建進(jìn)程【實(shí)驗(yàn)軟硬件環(huán)境】VC【實(shí)驗(yàn)內(nèi)容】實(shí)驗(yàn)內(nèi)容:父進(jìn)程創(chuàng)建一個(gè)有名事件, 由子進(jìn)程發(fā)送事件信號(hào),父進(jìn)程獲取事 件信號(hào)后進(jìn)行相應(yīng)的處理【實(shí)驗(yàn)原理】父進(jìn)程創(chuàng)建子進(jìn)程,實(shí)現(xiàn)多個(gè)進(jìn)程并發(fā)執(zhí)行,提高計(jì)算機(jī)的運(yùn)行效率?!緦?shí)驗(yàn)程序及分析】試驗(yàn)程序源代碼如下:父進(jìn)程部分代碼:/ test1.cpp : Defines the entry point for the con

2、sole application.#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "windows.h"int main(int argc, char* argv)STARTUPINFO sui;ZeroMemory(&sui,sizeof(sui);sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATION pi;if(!CreateProcess("D:Test1test1tes

3、t1zi.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&sui,&pi)printf("子進(jìn)程創(chuàng)建失敗,即將退出程序!n");return 0;elseint sum = 0;for(int i=1; i<=100; i+)sum += i;printf("sum = %dn",sum);Sleep(3000);WaitForSingleObject( pi.hProcess,INFINITE);FILE *qp;if(qp = fopen("D:

4、Test1abc.txt","r")= NULL)printf("讀文件打開(kāi)失敗!n");return 0;elsechar ch;while(ch = fgetc(qp)!=EOF)printf("%c",ch);printf("n");fclose(qp);return 0;子進(jìn)程部分代碼:/ test1zi.cpp : Defines the entry point for the console application./#include "stdafx.h"#include

5、"stdio.h"#include "stdlib.h"#include "windows.h"int main(int argc, char* argv)printf("已經(jīng)創(chuàng)建子進(jìn)程n");FILE *fp;if(fp = fopen("D:Test1abc.txt","w") = NULL)printf("文件創(chuàng)建失??!n");return 0;elsefprintf(fp,"XiDian University");fclose(

6、fp);printf("數(shù)據(jù)已經(jīng)寫入成功n");FILE *qp;if(qp = fopen("D:Test1abc.txt","r")= NULL)printf("讀文件打開(kāi)失??!n");return 0;elsechar ch;while(ch = fgetc(qp)!=EOF)printf("%c",ch);printf("n");fclose(qp);printf("數(shù)據(jù)讀出成功n");Sleep(3000);return 0;【實(shí)驗(yàn)結(jié)果截圖】父進(jìn)

7、程截圖:子進(jìn)程截圖:【實(shí)驗(yàn)心得體會(huì)】第一次操作系統(tǒng)上機(jī),遇到了很多為問(wèn)題。在學(xué)長(zhǎng)和學(xué)姐的耐心指導(dǎo)下,解決了所有存在的問(wèn)題,順利完成了上機(jī)題目。通過(guò)這次上機(jī),掌握了父進(jìn)程創(chuàng)建子進(jìn)程的方法,對(duì)操作系統(tǒng)多線程的認(rèn)識(shí)進(jìn)一步加深。實(shí)驗(yàn)二 進(jìn)程共享進(jìn)程數(shù)據(jù)【實(shí)驗(yàn)軟硬件環(huán)境】VC【實(shí)驗(yàn)內(nèi)容】在進(jìn)程中定義全局共享數(shù)據(jù),在線程中直接引用該數(shù)據(jù)進(jìn)行更改并輸出該數(shù)據(jù)?!緦?shí)驗(yàn)原理】定義一個(gè)全局變量,主進(jìn)程可他創(chuàng)建的線程均可以實(shí)現(xiàn)對(duì)全局變量的訪問(wèn)和修改?!緦?shí)驗(yàn)程序及分析】程序代碼如下:/ Test2.cpp : Defines the entry point for the console application./#

8、include "stdafx.h"#include<windows.h>#include<stdio.h>static int count = 10; DWORD WINAPI ThreadProc(LPVOID IpParameter)for(count =1; count <=5; count+)printf("count = %dn",count);return 0;int main(int argc, char* argv)printf("線程運(yùn)行!n");printf("count

9、= %dn",count);printf("新線程運(yùn)行n");HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);Sleep(5000);CloseHandle(hThread);printf("線程等待五秒鐘!n");printf("新線程結(jié)束!n");printf("線程結(jié)束!n");return 0;【實(shí)驗(yàn)結(jié)果截圖】【實(shí)驗(yàn)心得體會(huì)】這次實(shí)驗(yàn)內(nèi)實(shí)現(xiàn)了主線程和他創(chuàng)建的線程對(duì)共享數(shù)據(jù)的讀取和修改操作,定義的全局變量是程序中的共

10、享數(shù)據(jù),線程對(duì)其均有訪問(wèn)和修改的權(quán)利。對(duì)線程間的共享數(shù)據(jù)有了初步認(rèn)識(shí)。實(shí)驗(yàn)三 信號(hào)通信【實(shí)驗(yàn)軟硬件環(huán)境】VC+【實(shí)驗(yàn)內(nèi)容】父進(jìn)程創(chuàng)建一個(gè)有名事件,由子進(jìn)程發(fā)送事件信號(hào),父進(jìn)程獲取事件信號(hào)后進(jìn)行相應(yīng)的處理。【實(shí)驗(yàn)程序及分析】父進(jìn)程程序:/ Processs.cpp : Defines the entry point for the console application./#include "stdafx.h"#include "process.h"#include "windows.h"int main(int argc, char*

11、 argv)HANDLE hinstance = CreateEvent(NULL, FALSE,FALSE, "NewEvnet");STARTUPINFO sui;ZeroMemory(&sui,sizeof(sui);sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATION pi;if(!CreateProcess("F:練習(xí)源代碼c語(yǔ)言操作系統(tǒng)上機(jī)Test3ChildProcessDebugChildProcess.exe", NULL, NULL, NULL, FALSE, CREATE_NEW_CO

12、NSOLE, NULL, NULL, &sui, &pi) printf("failed to create child processn"); else printf("Waiting for Eventn");if(WAIT_FAILED = WaitForSingleObject(hinstance, 10000) printf("wait failedn"); else printf("Get the Eventn");子進(jìn)程程序:/ ChildProcess.cpp : Defines t

13、he entry point for the console application./#include "stdafx.h"#include "process.h"#include "windows.h"int main(int argc, char* argv)HANDLE hinstance = OpenEvent(EVENT_ALL_ACCESS, false, "NewEvent");Sleep(3000);printf("Signal the event to Parent?ynn"

14、);char signal;scanf("%c", &signal);if(signal = 'y')SetEvent(hinstance);Sleep(3000);return 0;【實(shí)驗(yàn)結(jié)果截圖】【實(shí)驗(yàn)心得體會(huì)】父進(jìn)程創(chuàng)建子進(jìn)程創(chuàng)建了一個(gè)有名事件,并且用來(lái)接收子進(jìn)程發(fā)送的信號(hào)。通過(guò)這次實(shí)驗(yàn)對(duì)父子進(jìn)程間的關(guān)系有了更多的認(rèn)識(shí),掌握了一些父子進(jìn)程間的通信方法。實(shí)驗(yàn)四 匿名管道通信【實(shí)驗(yàn)軟硬件環(huán)境】Vc+【實(shí)驗(yàn)內(nèi)容】分別建立名為 Parent 的單文檔應(yīng)用程序和 Child 的單文檔應(yīng)用程序作為父子進(jìn)程,由父 進(jìn)程創(chuàng)建一個(gè)匿名管道,實(shí)現(xiàn)父子進(jìn)程向匿名管道

15、寫入和讀取數(shù)據(jù)。【實(shí)驗(yàn)程序及分析】第四題的Fraim文件下,摘取主要內(nèi)容:父進(jìn)程的主要代碼如下:void CParentView:OnPipeCreate()SECURITY_ATTRIBUTES sa;sa.bInheritHandle=TRUE;/子進(jìn)程可以繼承父進(jìn)程創(chuàng)建的匿名管道的讀寫句柄sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&hRead,&hWrite,&sa,0)AfxMessageBox("創(chuàng)建匿名管道失敗!")

16、;return;STARTUPINFO sui;PROCESS_INFORMATION pi;ZeroMemory(&sui,sizeof(STARTUPINFO);sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USESTDHANDLES;/表示當(dāng)前STARTUPINFO這個(gè)結(jié)構(gòu)體變量中的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤句柄三個(gè)成員是有用的sui.hStdInput=hRead;/這里將子進(jìn)程的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出句柄分別設(shè)置為管道的讀寫句柄sui.hStdOutput=hWrite;sui.hStdError=GetStdHandle(STD_

17、ERROR_HANDLE);if(!CreateProcess(".ChildDebugChild.exe",NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi)CloseHandle(hRead);CloseHandle(hWrite);hRead=NULL;hWrite=NULL;AfxMessageBox("創(chuàng)建子進(jìn)程失敗!");return;elseCloseHandle(pi.hProcess);CloseHandle(pi.hThread);void CParentView:OnPipeRead(

18、)char buf100=0;DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)AfxMessageBox("讀取數(shù)據(jù)失敗!");return;AfxMessageBox(buf);void CParentView:OnPipeWrite()char buf="父進(jìn)程信息"DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)AfxMessageBox("寫入數(shù)據(jù)失敗!");retur

19、n;子進(jìn)程的主要代碼如下:void CChildView:OnChildRead()char buf100=0;DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)AfxMessageBox("讀取數(shù)據(jù)失敗!");return;AfxMessageBox(buf);void CChildView:OnChildWrite()char buf="子進(jìn)程信息"DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL

20、)AfxMessageBox("寫入數(shù)據(jù)失敗!");return;【實(shí)驗(yàn)結(jié)果截圖】本實(shí)驗(yàn),在父進(jìn)程的面板上,主要有創(chuàng)建管道,讀,寫,三個(gè)項(xiàng)目,子進(jìn)程的項(xiàng)目上主要有讀,寫,兩個(gè)管道。由于電腦上沒(méi)有VC+,第四題的源程序截圖沒(méi)辦法重現(xiàn),附上PPt中的圖片?!緦?shí)驗(yàn)心得體會(huì)】 匿名管道一般用于實(shí)現(xiàn)本地父子進(jìn)程之間的通信,其不能實(shí)現(xiàn)跨網(wǎng)絡(luò)進(jìn)程之間的通信,同時(shí)其也一般只用于實(shí)現(xiàn)父進(jìn)程和子進(jìn)程之間的通信。像匿名管道的話,其和郵槽不同,其可以實(shí)現(xiàn)父進(jìn)程即可以向子進(jìn)程發(fā)送數(shù)據(jù),同時(shí)父進(jìn)程又可以從子進(jìn)程接收到數(shù)據(jù)。而且子進(jìn)程可以接收來(lái)自父進(jìn)程的數(shù)據(jù),并且也可以給父進(jìn)程發(fā)送數(shù)據(jù)。實(shí)驗(yàn)五 信號(hào)量實(shí)

21、現(xiàn)進(jìn)程同步【實(shí)驗(yàn)軟硬件環(huán)境】VC+【實(shí)驗(yàn)內(nèi)容】生產(chǎn)者進(jìn)程生產(chǎn)產(chǎn)品,消費(fèi)者進(jìn)程消費(fèi)產(chǎn)品。 當(dāng)生產(chǎn)者進(jìn)程生產(chǎn)產(chǎn)品時(shí),如果沒(méi)有空緩沖區(qū)可用,那么生產(chǎn)者進(jìn)程必須等待消費(fèi) 者進(jìn)程釋放出一個(gè)緩沖區(qū)。 當(dāng)消費(fèi)者進(jìn)程消費(fèi)產(chǎn)品時(shí),如果緩沖區(qū)中沒(méi)有產(chǎn)品,那么消費(fèi)者進(jìn)程將被阻塞,直 到新的產(chǎn)品被生產(chǎn)出來(lái)?!緦?shí)驗(yàn)程序及分析】生產(chǎn)者進(jìn)程:/ Test4.cpp : Defines the entry point for the console application./#include "stdafx.h"#include <iostream> #include <windows.

22、h> using namespace std; #define BUF_SIZE 1025 char szName = "NameOfMappingObject" / 共享內(nèi)存的名字 int main() / 創(chuàng)建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, / 物理文件句柄 NULL, / 默認(rèn)安全級(jí)別 PAGE_READWRITE, / 可讀可寫 0, / 高位文件大小 BUF_SIZE, / 地位文件大小 szName / 共享內(nèi)存名稱 ); char *pBuf = (cha

23、r *)MapViewOfFile( hMapFile, / 共享內(nèi)存的句柄 FILE_MAP_ALL_ACCESS, / 可讀寫許可 0, 0, BUF_SIZE ); if(hMapFile != NULL)cout<<"Create Success"<<endl; while(1) char szInfoBUF_SIZE = 0; gets(szInfo); cout << "write "<<szInfo<< " into sharMemory" << e

24、ndl; strncpy(pBuf, szInfo, BUF_SIZE - 1); pBufBUF_SIZE - 1 = '0' UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0; 消費(fèi)者進(jìn)程:/ Test4Get.cpp : Defines the entry point for the console application./#include "stdafx.h"#include <iostream> #include <windows.h> using namespa

25、ce std; #define BUF_SIZE 1025 char szName = "NameOfMappingObject" / 共享內(nèi)存的名字 int main() / 創(chuàng)建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, / 物理文件句柄 NULL, / 默認(rèn)安全級(jí)別 PAGE_READWRITE, / 可讀可寫 0, / 高位文件大小 BUF_SIZE, / 地位文件大小 szName / 共享內(nèi)存名稱 ); char *pBuf = (char *)MapViewOfFile(

26、hMapFile, / 共享內(nèi)存的句柄 FILE_MAP_ALL_ACCESS, / 可讀寫許可 0, 0, BUF_SIZE ); cout<<"Open Success"<<endl; while(1) getchar(); cout << pBuf << endl; UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0; 【實(shí)驗(yàn)結(jié)果截圖】【實(shí)驗(yàn)心得體會(huì)】通過(guò)自己手動(dòng)編寫生產(chǎn)者消費(fèi)者程序,進(jìn)一步了解了基本的進(jìn)程同步與互斥算法,理解生產(chǎn)者-消費(fèi)者問(wèn)題了解到同步對(duì)象是指W

27、indows中用于實(shí)現(xiàn)同步與互斥的實(shí)體,包括信號(hào)量(Semaphore)、互斥量(Mutex)、臨界區(qū)(Critical Section)和事件(Events)等。本實(shí)驗(yàn)中使用到信號(hào)量、互斥量和臨界區(qū)三個(gè)同步對(duì)象。實(shí)驗(yàn)六 共享主存實(shí)現(xiàn)進(jìn)程通信【實(shí)驗(yàn)軟硬件環(huán)境】VC+【實(shí)驗(yàn)內(nèi)容】 建立父子進(jìn)程,由父進(jìn)程創(chuàng)建一個(gè)命名匿名管道,由子進(jìn)程向命名管道寫入數(shù)據(jù),由 父進(jìn)程從命名管道讀取數(shù)據(jù)【實(shí)驗(yàn)原理】共享存儲(chǔ)區(qū)(Share Memory)是UNIX系統(tǒng)中通信速度最高的一種通信機(jī)制。該機(jī)制可使若干進(jìn)程共享主存中的某一個(gè)區(qū)域,且使該區(qū)域出現(xiàn)(映射)在多個(gè)進(jìn)程的虛地址空間中。另一方面,一個(gè)進(jìn)程的虛地址空間中又可

28、連接多個(gè)共享存儲(chǔ)區(qū),每個(gè)共享存儲(chǔ)區(qū)都有自己的名字。當(dāng)進(jìn)程間欲利用共享存儲(chǔ)區(qū)進(jìn)行通信時(shí),必須先在主存中建立一共享存儲(chǔ)區(qū),然后將它附接到自己的虛地址空間上。此后,進(jìn)程對(duì)該區(qū)的訪問(wèn)操作,與對(duì)其虛地址空間的其它部分的操作完全相同。共享主存段在系統(tǒng)調(diào)用時(shí),首先得申請(qǐng)一個(gè)共享主存段之后才能對(duì)共享存儲(chǔ)進(jìn)行操作。 應(yīng)當(dāng)指出,共享存儲(chǔ)區(qū)機(jī)制只為進(jìn)程提供了用于實(shí)現(xiàn)通信的共享存儲(chǔ)區(qū)和對(duì)共享存儲(chǔ)區(qū)進(jìn)行操作的手段,然而并未提供對(duì)該區(qū)進(jìn)行互斥訪問(wèn)及進(jìn)程同步的措施。因而當(dāng)用戶需要使用該機(jī)制時(shí),必須自己設(shè)置同步和互斥措施才能保證實(shí)現(xiàn)正確的通信。 對(duì)于已申請(qǐng)到通信所需要的共享段,進(jìn)程需把它附加到自己的虛擬空間后才能對(duì)其進(jìn)行寫。

29、【實(shí)驗(yàn)程序及分析】父進(jìn)程部分代碼:/ SharedStorage.cpp : Defines the entry point for the console application./#include <iostream>#include <windows.h>using namespace std;#define SIZE 1024char name = "sharedstorage"int main() HANDLE mapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,SIZE,name);

溫馨提示

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

評(píng)論

0/150

提交評(píng)論