77范文网 - 专业文章范例文档资料分享平台

操作系统实验指导书(2010秋版)(3)

来源:网络收集 时间:2020-06-19 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

printf(“pipe is created successfully!\\n”); if((pid1=fork())==0) producer(1); if((pid2=fork())==0) producer(2); if((pid3=fork())==0) consumer(1); if((pid4=fork())==0) consumer(2);} close(pipe_fd[0]); close(pipe_fd[1]); int i,pid,status; for( i=0;i<4;i++) pid=wait(&status); exit(0);}

int producer(int id)

{ printf(“producer %d is running!\\n”,id); close(pipe_fd[0]); int i=0;

for(i=1;i<10;i++) {

sleep(3);

if(id==1) strcpy(w_buf,”aaa\\0”); else strcpy(w_buf,”bbb\\0”); if(write(pipe_fd[1],w_buf,4)==-1) printf(“write to pipe error\\n”); }

close(pipe_fd[1]); printf(“producer %d is over!\\n”,id); exit(id);}

int consumer(int id) { close(pipe_fd[1]);

printf(“consumer %d is running!\\n”,id); if(id==1) strcpy(w_buf,”ccc\\0”); else strcpy(w_buf,”ddd\\0”); while(1) { sleep(1);

strcpy(r_buf,”eee\\0”);

if(read(pipe_fd[0],r_buf,4)==0) break;

printf(“Consumer %d get %s, while the w_buf is %s\\n”, id,r_buf,w_buf); }

close(pipe_fd[0]);

printf(“consumer %d is over!\\n”,id); exit(id); }

先阅读和分析程序,写出运算结果,并加以解释:

__________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________

四、实验总结

请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。

实验三 存储管理

一、实验目的

通过实验了解Windows 2000内存的使用,学习如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。学习检查虚拟内存空间或对其进行操作;了解Windows 2000的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。

二、实验环境

硬件环境:计算机一台,局域网环境;

软件环境:Windows 2000 Professional,Visual C++ 6.0企业版。

三、实验内容和步骤

在Windows 2000环境下,4GB的虚拟地址空间被划分成两个部分:低端2GB提供给进程使用,高端2GB提供给系统使用。这意味着用户的应用程序代码,包括DLL以及进程使用的各种数据等,都装在用户进程地址空间内 (低端2GB) 。

第一部分 虚拟内存的检测

检测进程的虚拟地址空间

// 工程vmwalker

# include # include # include # include

# pragma comment(lib, \

inline bool TestSet(DWORD dwTarget, DWORD dwMask) {return ((dwTarget & dwMask) == dwMask) ;} # define SHOWMASK(dwTarget, type) \\ if (TestSet(dwTarget, PAGE_##type) ) \\ {std :: cout << \

void ShowProtection(DWORD dwTarget) {

SHOWMASK(dwTarget, READONLY) ; SHOWMASK(dwTarget, GUARD) ; SHOWMASK(dwTarget, NOCACHE) ; SHOWMASK(dwTarget, READWRITE) ; SHOWMASK(dwTarget, WRITECOPY) ; SHOWMASK(dwTarget, EXECUTE) ;

SHOWMASK(dwTarget, EXECUTE_READ) ;

SHOWMASK(dwTarget, EXECUTE_READWRITE) ; SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ; SHOWMASK(dwTarget, NOACCESS) ; }

void WalkVM(HANDLE hProcess) {

SYSTEM_INFO si;

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

MEMORY_BASIC_INFORMATION mbi; :: ZeroMemory(&mbi, sizeof(mbi) ) ;

LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress; while (pBlock < si.lpMaximumApplicationAddress) {

if (:: VirtualQueryEx( hProcess, // 相关的进程 pBlock, // 开始位置 &mbi, // 缓冲区 sizeof(mbi))==sizeof(mbi) ) // 大小的确认 {

LPCVOID pEnd = (PBYTE) pBlock + mbi.RegionSize; TCHAR szSize[MAX_PATH];

:: StrFormatByteSize(mbi.RegionSize, szSize, MAX_PATH) ; std :: cout.fill ('0') ; std :: cout

<< std :: hex << std :: setw(8) << (DWORD) pBlock << \

<< std :: hex << std :: setw(8) << (DWORD) pEnd << (:: strlen(szSize)==7? \

switch(mbi.State) {

case MEM_COMMIT:

std :: cout << \break;

case MEM_FREE:

std :: cout << \break;

case MEM_RESERVE:

std :: cout << \break;

} if (mbi.Protect==0 && mbi.State!=MEM_FREE)

{

mbi.Protect=PAGE_READONLY; } ShowProtection(mbi.Protect);

switch (mbi.Type)

{

case MEM_IMAGE:

std :: cout << \break;

case MEM_MAPPED:

std :: cout << \break;

case MEM_PRIVATE:

std :: cout << \break;

}

TCHAR szFilename [MAX_PATH] ; if ( :: GetModuleFileName ( (HMODULE) pBlock, // 实际虚拟内存的模块句柄 szFilename, // 完全指定的文件名称 MAX_PATH)>0) // 实际使用的缓冲区大小

{

:: PathStripPath(szFilename) ;

std :: cout << \ }

std :: cout << std :: endl; pBlock = pEnd; } }

}

void main()

{ ::WalkVM(::GetCurrentProcess()); }

程序中显示一个WalkVM() 函数开始于某个进程可访问的最低端虚拟地址处,并在其中显示各块虚拟内存的特性。虚拟内存中的块由VirtualQueryEx() API定义成连续快或具有相同状态 (自由区、已调配区等等) 的内存,并分配以一组统一的保护标志 (只读、可执行等等) 。

分析运行结果

按committed、reserved、free等三种虚拟地址空间分别记录实验数据。其中“描述”是指对该组数据的简单描述,例如,对下列一组数据:

00010000 – 00012000 <8.00KB> Committed, READWRITE, Private 可描述为:具有READWRITE权限的已调配私有内存区。

将系统当前的自由区 (free) 虚拟地址空间填入表中。

地址 大小 虚拟地址 空间类型 free free free free free 访问权限 描述

将系统当前的已调配区 (committed) 虚拟地址空间填入表中。 地址 大小 虚拟地址 空间类型 committed committed committed committed committed 访问权限 描述

将系统当前的保留区 (reserved) 虚拟地址空间填入表5-8中。 地址 大小 虚拟地址 空间类型 reserved reserved reserved reserved reserved 访问权限 描述

2) 从上述输出结果,对照分析程序,请简单描述程序运行的流程:

____________________________________________________________________ ________________________________________________________________________

第二部分 虚拟内存操作

示例程序显示了如何分配一个大容量空间,将物理存储委托给其中的很小一部分 (千分之一) 并加以使用。

分配和使用大块内存

// 工程largealloc

# include # include

void FillZero(LPVOID pBlock, DWORD dwSize) {

_try {

BYTE* arFill = (BYTE *) pBlock;

for (DWORD dwFill = 0; dwFill < dwSize; ++dwFill) {

arFill [dwFill] = 0; }

std :: cout << “Memory zeroed.” << std :: endl; }

_except(EXCEPTION_EXECUTE_HANDLER) {

std :: cout << “Could not zero memory. ” << std :: endl; }

}

void main() {

DWORD c_dwGigabyte = 1 << 30; DWORD c_dwMegabyte = 1 << 20; {

LPVOID pBlock = :: malloc(c_dwGigabyte) ; :: FillZero (pBlock, c_dwMegabyte) ; :: free(pBlock) ;

}

{

LPVOID pBlock = :: VirtualAlloc( NULL, // 不指定起始地址 c_dwGigabyte, // 要求1GB MEM_COMMIT, // 调配物理存储 PAGE_READWRITE) ; // 对此的读写操作 :: FillZero(pBlock, c_dwMegabyte) ;

:: VirtualFree(pBlock, 0, MEM_RELEASE) ; }

{ LPVOID pBlock = :: VirtualAlloc( NULL, // 不指定起始地址 c_dwGigabyte, // 要求1GB MEM_RESERVE, // 不调配物理存储 PAGE_READWRITE) ; // 对此的读写操作 :: FillZero(pBlock, c_dwMegabyte) ;

:: VirtualFree(pBlock, 0, MEM_RELEASE) ;} {

LPVOID pBlock = :: VirtualAlloc( NULL, // 不指定起始地址 c_dwGigabyte, // 要求1GB MEM_RESERVE, // 不调配物理存储 PAGE_READWRITE) ; // 对此的读写操作 :: VirtualAlloc( pBlock,

c_dwMegabyte, MEM_COMMIT,

PAGE_READWRITE) ;

:: FillZero(pBlock, c_dwMegabyte) ;

:: VirtualFree(pBlock, 0, MEM_RELEASE) ; } }

对照运行结果,分析程序。为了给数据库保留1GB的段地址空间,程序给出了内存分配的四种方法。

· 第一种技术

即程序中说明为___________________________________________________的程序段,该段程序试图利用标准C中的malloc() 函数,从已经已调配的小内存区获得内存。从运行结果看,这种技术成功了吗?_____________________。

· 第二种技术

即程序中说明为___________________________________________________的程序段,该段程序试图通过VirtualAlloc() ,然后利用物理备用内存将整个块分配到虚拟内存空间的任何位置。这种技术只对拥有1GB以上的RAM且都有换页文件的计算机可行。从运行结果看,这种技术成功了吗?_____________________。

· 第三种技术

即程序中说明为___________________________________________________的程序段,该段程序利用VirtualAlloc() ,如果函数成功,则获得大块内存,但不将任何物理内存调配到此块中。从运行结果看,这种技术成功了吗?_________________。

· 第四种技术

即程序中说明为___________________________________________________的程序段,该段程序保留1GB的内存区,然后将物理内存调配给其中的很小一部分 (1MB) 。这就是程序介绍的处理一个假想的数据库应用程序的方法:保留整个块,然后按要求在其一小部分内进行读操作,让系统将用过的区域换页到磁盘中。

利用VirtualLock() API,Windows可用来在自己的进程空间中控制虚拟内存的行为。这个函数与其成对的VirtualUnlock() 阻止或允许一块内存从物理RAM中换页和换页到页面文件中。这样就会通知系统有一段特定的内存区要求对用户作出强烈的响应,所以系统不应将其移出RAM。当然,如果要将整个虚拟内存空间锁定,系统就会停留于试图将系统中工作内存的每一小块换页到磁盘

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统实验指导书(2010秋版)(3)在线全文阅读。

操作系统实验指导书(2010秋版)(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/1110553.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: