操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统上机 实 验 报 告 成绩教 师: 方敏 2016 年 12月 17日班 级: 学 号: 姓 名: 黄杨 实验地点: E-区208 实验时间: 2016.10.132016.12.17 实验一 创建进程【实验软硬件环境】VC【实验内容】实验内容:父进程创建一个有名事件, 由子进程发送事件信号,父进程获取事 件信号后进行相应的处理【实验原理】父进程创建子进程,实现多个进程并发执行,提高计算机的运行效率。【实验程序及分析】试验程序源代码如下:父进程部分代码:/ test1.cpp : Defines the entry point for the console application.#

2、include stdafx.h#include stdio.h#include stdlib.h#include windows.hint main(int argc, char* argv)STARTUPINFO sui;ZeroMemory(&sui,sizeof(sui);sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATION pi;if(!CreateProcess(D:Test1test1test1zi.exe,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&sui,&pi)printf(子

3、进程创建失败,即将退出程序!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:Test1abc.txt,r)= NULL)printf(读文件打开失败!n);return 0;elsechar ch;while(ch = fgetc(qp)!=EOF)printf(%c,ch);printf(n);fclose(qp);re

4、turn 0;子进程部分代码:/ test1zi.cpp : Defines the entry point for the console application./#include stdafx.h#include stdio.h#include stdlib.h#include windows.hint main(int argc, char* argv)printf(已经创建子进程n);FILE *fp;if(fp = fopen(D:Test1abc.txt,w) = NULL)printf(文件创建失败!n);return 0;elsefprintf(fp,XiDian Unive

5、rsity);fclose(fp);printf(数据已经写入成功n);FILE *qp;if(qp = fopen(D:Test1abc.txt,r)= NULL)printf(读文件打开失败!n);return 0;elsechar ch;while(ch = fgetc(qp)!=EOF)printf(%c,ch);printf(n);fclose(qp);printf(数据读出成功n);Sleep(3000);return 0;【实验结果截图】父进程截图:子进程截图:【实验心得体会】第一次操作系统上机,遇到了很多为问题。在学长和学姐的耐心指导下,解决了所有存在的问题,顺利完成了上机题目

6、。通过这次上机,掌握了父进程创建子进程的方法,对操作系统多线程的认识进一步加深。实验二 进程共享进程数据【实验软硬件环境】VC【实验内容】在进程中定义全局共享数据,在线程中直接引用该数据进行更改并输出该数据。【实验原理】定义一个全局变量,主进程可他创建的线程均可以实现对全局变量的访问和修改。【实验程序及分析】程序代码如下:/ Test2.cpp : Defines the entry point for the console application./#include stdafx.h#include#includestatic int count = 10; DWORD WINAPI Th

7、readProc(LPVOID IpParameter)for(count =1; count =5; count+)printf(count = %dn,count);return 0;int main(int argc, char* argv)printf(线程运行!n);printf(count = %dn,count);printf(新线程运行n);HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);Sleep(5000);CloseHandle(hThread);printf(线程等待五秒钟!n);pri

8、ntf(新线程结束!n);printf(线程结束!n);return 0;【实验结果截图】【实验心得体会】这次实验内实现了主线程和他创建的线程对共享数据的读取和修改操作,定义的全局变量是程序中的共享数据,线程对其均有访问和修改的权利。对线程间的共享数据有了初步认识。实验三 信号通信【实验软硬件环境】VC+【实验内容】父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理。【实验程序及分析】父进程程序:/ Processs.cpp : Defines the entry point for the console application./#include stdafx

9、.h#include process.h#include windows.hint main(int argc, char* argv)HANDLE hinstance = CreateEvent(NULL, FALSE,FALSE, NewEvnet);STARTUPINFO sui;ZeroMemory(&sui,sizeof(sui);sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATION pi;if(!CreateProcess(F:练习源代码c语言操作系统上机Test3ChildProcessDebugChildProcess.exe, NULL

10、, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, 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);子进程程序:/ ChildProcess.cpp : Defines the entry point for the

11、 console application./#include stdafx.h#include process.h#include windows.hint main(int argc, char* argv)HANDLE hinstance = OpenEvent(EVENT_ALL_ACCESS, false, NewEvent);Sleep(3000);printf(Signal the event to Parent?ynn);char signal;scanf(%c, &signal);if(signal = y)SetEvent(hinstance);Sleep(3000);ret

12、urn 0;【实验结果截图】【实验心得体会】父进程创建子进程创建了一个有名事件,并且用来接收子进程发送的信号。通过这次实验对父子进程间的关系有了更多的认识,掌握了一些父子进程间的通信方法。实验四 匿名管道通信【实验软硬件环境】Vc+【实验内容】分别建立名为 Parent 的单文档应用程序和 Child 的单文档应用程序作为父子进程,由父 进程创建一个匿名管道,实现父子进程向匿名管道写入和读取数据。【实验程序及分析】第四题的Fraim文件下,摘取主要内容:父进程的主要代码如下:void CParentView:OnPipeCreate()SECURITY_ATTRIBUTES sa;sa.bIn

13、heritHandle=TRUE;/子进程可以继承父进程创建的匿名管道的读写句柄sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&hRead,&hWrite,&sa,0)AfxMessageBox(创建匿名管道失败!);return;STARTUPINFO sui;PROCESS_INFORMATION pi;ZeroMemory(&sui,sizeof(STARTUPINFO);sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USE

14、STDHANDLES;/表示当前STARTUPINFO这个结构体变量中的标准输入、标准输出和标准错误句柄三个成员是有用的sui.hStdInput=hRead;/这里将子进程的标准输入和标准输出句柄分别设置为管道的读写句柄sui.hStdOutput=hWrite;sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);if(!CreateProcess(.ChildDebugChild.exe,NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi)CloseHandle(hRead);CloseHandle(hWrite);hRe

15、ad=NULL;hWrite=NULL;AfxMessageBox(创建子进程失败!);return;elseCloseHandle(pi.hProcess);CloseHandle(pi.hThread);void CParentView:OnPipeRead()char buf100=0;DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)AfxMessageBox(读取数据失败!);return;AfxMessageBox(buf);void CParentView:OnPipeWrite()char buf=父进程信息;DWORD

16、dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)AfxMessageBox(写入数据失败!);return;子进程的主要代码如下:void CChildView:OnChildRead()char buf100=0;DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)AfxMessageBox(读取数据失败!);return;AfxMessageBox(buf);void CChildView:OnChildWrite()char buf=子进程信息;DWORD dw

17、Write;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)AfxMessageBox(写入数据失败!);return;【实验结果截图】本实验,在父进程的面板上,主要有创建管道,读,写,三个项目,子进程的项目上主要有读,写,两个管道。由于电脑上没有VC+,第四题的源程序截图没办法重现,附上PPt中的图片。【实验心得体会】 匿名管道一般用于实现本地父子进程之间的通信,其不能实现跨网络进程之间的通信,同时其也一般只用于实现父进程和子进程之间的通信。像匿名管道的话,其和邮槽不同,其可以实现父进程即可以向子进程发送数据,同时父进程又可以从子进程

18、接收到数据。而且子进程可以接收来自父进程的数据,并且也可以给父进程发送数据。实验五 信号量实现进程同步【实验软硬件环境】VC+【实验内容】生产者进程生产产品,消费者进程消费产品。 当生产者进程生产产品时,如果没有空缓冲区可用,那么生产者进程必须等待消费 者进程释放出一个缓冲区。 当消费者进程消费产品时,如果缓冲区中没有产品,那么消费者进程将被阻塞,直 到新的产品被生产出来。【实验程序及分析】生产者进程:/ Test4.cpp : Defines the entry point for the console application./#include stdafx.h#include #inc

19、lude using namespace std; #define BUF_SIZE 1025 char szName = NameOfMappingObject; / 共享内存的名字 int main() / 创建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, / 物理文件句柄 NULL, / 默认安全级别 PAGE_READWRITE, / 可读可写 0, / 高位文件大小 BUF_SIZE, / 地位文件大小 szName / 共享内存名称 ); char *pBuf = (char *)MapViewO

20、fFile( hMapFile, / 共享内存的句柄 FILE_MAP_ALL_ACCESS, / 可读写许可 0, 0, BUF_SIZE ); if(hMapFile != NULL)coutCreate Successendl; while(1) char szInfoBUF_SIZE = 0; gets(szInfo); cout write szInfo into sharMemory endl; strncpy(pBuf, szInfo, BUF_SIZE - 1); pBufBUF_SIZE - 1 = 0; UnmapViewOfFile(pBuf); CloseHandle(

21、hMapFile); return 0; 消费者进程:/ Test4Get.cpp : Defines the entry point for the console application./#include stdafx.h#include #include using namespace std; #define BUF_SIZE 1025 char szName = NameOfMappingObject; / 共享内存的名字 int main() / 创建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE,

22、 / 物理文件句柄 NULL, / 默认安全级别 PAGE_READWRITE, / 可读可写 0, / 高位文件大小 BUF_SIZE, / 地位文件大小 szName / 共享内存名称 ); char *pBuf = (char *)MapViewOfFile( hMapFile, / 共享内存的句柄 FILE_MAP_ALL_ACCESS, / 可读写许可 0, 0, BUF_SIZE ); coutOpen Successendl; while(1) getchar(); cout pBuf endl; UnmapViewOfFile(pBuf); CloseHandle(hMapFi

23、le); return 0; 【实验结果截图】【实验心得体会】通过自己手动编写生产者消费者程序,进一步了解了基本的进程同步与互斥算法,理解生产者-消费者问题了解到同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。实验六 共享主存实现进程通信【实验软硬件环境】VC+【实验内容】 建立父子进程,由父进程创建一个命名匿名管道,由子进程向命名管道写入数据,由 父进程从命名管道读取数据【实验原理】共享存储区(Share Memo

24、ry)是UNIX系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中。另一方面,一个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字。当进程间欲利用共享存储区进行通信时,必须先在主存中建立一共享存储区,然后将它附接到自己的虚地址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其它部分的操作完全相同。共享主存段在系统调用时,首先得申请一个共享主存段之后才能对共享存储进行操作。 应当指出,共享存储区机制只为进程提供了用于实现通信的共享存储区和对共享存储区进行操作的手段,然而并未提供对该区进行互斥访问及

25、进程同步的措施。因而当用户需要使用该机制时,必须自己设置同步和互斥措施才能保证实现正确的通信。 对于已申请到通信所需要的共享段,进程需把它附加到自己的虚拟空间后才能对其进行写。【实验程序及分析】父进程部分代码:/ SharedStorage.cpp : Defines the entry point for the console application./#include #include using namespace std;#define SIZE 1024char name = sharedstorage;int main() HANDLE mapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论