操作系统实验指导书实验二进程管理Word文档下载推荐.docx

上传人:b****5 文档编号:21487044 上传时间:2023-01-30 格式:DOCX 页数:20 大小:510.38KB
下载 相关 举报
操作系统实验指导书实验二进程管理Word文档下载推荐.docx_第1页
第1页 / 共20页
操作系统实验指导书实验二进程管理Word文档下载推荐.docx_第2页
第2页 / 共20页
操作系统实验指导书实验二进程管理Word文档下载推荐.docx_第3页
第3页 / 共20页
操作系统实验指导书实验二进程管理Word文档下载推荐.docx_第4页
第4页 / 共20页
操作系统实验指导书实验二进程管理Word文档下载推荐.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

操作系统实验指导书实验二进程管理Word文档下载推荐.docx

《操作系统实验指导书实验二进程管理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书实验二进程管理Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。

操作系统实验指导书实验二进程管理Word文档下载推荐.docx

7

8

(3)从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:

winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是,

原因是。

(4)在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化、得到的结论是(说出explorer.exe进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“

”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:

表二:

统计线程的各项信息

进程:

explorer.exe中的各个线程

线程ID

基本优先级

当前优先级

CPU时间

上下文开关

9

10

11

12

13

14

6、注意某些线程前有“+”,如图所示:

,说明二者之间的差异是。

2.利用API在Windows下创建进程

学习使用在Windows2000/XP中利用API创建进程的方法;

学习了解创建进程函数CreateProcess及其特性;

设计测试程序,通过在命令行中加载相应的测试程序生成的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行。

1)相关知识介绍

在创建一个线程时,Windows会做大量的工作---创建一个新的地址空间,为进程分配资源以及创建一个基线程。

CreateProcess函数的原型如下:

CreateProcess(

 LPCTSTRlpApplicationName,

 //pointertonameofexecutablemoudle

 LPTSTRcmdLine,

 //pointertocommandlinestring

 LPSECURITY_ATTRIBUTESlpProcessAttributes,

 //pointertoprocesssecurityattributes

 LPSECURITY_ATTRIBUTESlpThreadAttributes,

 //pointertothereadsecurityattributes

 BOOLbInheritHandle,

 //handleinheritanceflag

 DWORDdwCreationFlag,//variouscreationflags

 LPVOIDlpEnviroment,//Enviromentvariable

 LPCTSTRlpCurrentDirectory,//Child'

scurrentdirectory

 LPSTARTUPINFOlpStartupInfo,//pointertoStartupInfo

 LPPROCESS_INFORMATIONlpProcessInformation

 //pointertoPROCESS_INFORMATION

创建进程的函数为CreateProcess,该函数比较复杂共有十个参数。

BOOLCreateProcess(

LPCTSTRlpApplicationName,//执行程序文件名

LPTSTRlpCommandLine,//参数行

LPSECURITY_ATTRIBUTESlpProcessAttributes,//进程安全参数

LPSECURITY_ATTRIBUTESlpThreadAttributes,//线程安全参数

BOOLbInheritHandles,//继承标记

DWORDdwCreationFlags,//创建标记

LPVOIDlpEnvironment,//环境变量

LPCTSTRlpCurrentDirectory,//运行该子进程的初始目录

LPSTARTUPINFOlpStartupInfo,//创建该子进程的相关参数

LPPROCESS_INFORMATIONlpProcessInformation//创建后用于被创建子进程的信息

);

虽然有很多参数,不过在现阶段的实验级别,大多数参数只要用默认值即可。

lpApplicationName:

为执行程序的文件名,如果在创建进程时要使用参数,则该参数可以为NULL。

lpCommandLine:

为参数行,如果无参数可以为NULL,在有参数传递给进程时如下设置:

lpApplicationName=NULL;

lpCommandLine=para,例如lpCommandLine="

c:

\\windows\\notepad.exec:

\\autoexec.bat"

lpProcessAttributes,lpThreadAttributes:

分别描述了创建的进程和线程安全属性,如果使用NULL表示使用默认的安全描述。

bInheritHandles:

表示当前进程中的打开的句柄是否能够被创建的子进程所继承。

dwCreationFlags:

表示创建标记,通过该标记可以设置进程的创建状态和优先级别。

常用的有下面的标记:

CREATE_NEW_CONSOLE:

为子进程创建一个新的控制台。

CREATE_SUSPENDED:

子进程在创建时为挂起状态。

HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS:

高/普通优先级别。

lpEnvironment:

表示子进程所使用的环境变量,如果为NULL,则表示与当前进程使用相同的环境变量。

lpCurrentDirectory:

表示子进程运行的初始目录。

lpStartupInfo:

用于在创建子进程时设置各种属性。

该结构定义如下:

typedefstruct_STARTUPINFO{//si

DWORDcb;

//结构长度

LPTSTRlpReserved;

//保留

LPTSTRlpDesktop;

LPTSTRlpTitle;

//如果为控制台进程则为显示的标题

DWORDdwX;

//窗口位置

DWORDdwY;

DWORDdwXSize;

//窗口大小

DWORDdwYSize;

DWORDdwXCountChars;

//控制台窗口字符号宽度

DWORDdwYCountChars;

//控制台窗口字符号高度

DWORDdwFillAttribute;

//控制台窗口填充模式

DWORDdwFlags;

//创建标记

WORDwShowWindow;

//窗口显示标记如同ShowWindow中的标记

WORDcbReserved2;

//

LPBYTElpReserved2;

HANDLEhStdInput;

//标准输入句柄

HANDLEhStdOutput;

//标准输出句柄

HANDLEhStdError;

//标准错误句柄

}STARTUPINFO,*LPSTARTUPINFO;

如果要使结构中相关的分量起作用,必须正确的设置dwFlags。

例如:

dwFlags包含STARTF_USESIZE表示dwXSize和dwYSize有效,包含STARTF_USEPOSITION表示dwX和dwY有效。

lpProcessInformation:

用来在进程创建后接收相关信息,该结构由系统填写。

typedefstruct_PROCESS_INFORMATION{//pi

HANDLEhProcess;

//进程句柄

HANDLEhThread;

//进程的主线程句柄

DWORDdwProcessId;

//进程ID

DWORDdwThreadId;

//进程的主线程ID

}PROCESS_INFORMATION;

2)实验准备

要实验的Windows下的多线程实验,应做如下准备:

a)在新建中选”Win32ConsoleApplication”的Anemptyproject

b)选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”ProjectOption”中,将”MLd”参数改成“MTd”(如图1)。

图1选项

以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。

3)Windows下进程的创建

Windows的进程和线程模型被描述成“多进程,基于单进程的多线程”。

在Windows下,当使用CreateProcess去执行相应的功能时,只要去改变cmdLine中的内容即可,其它的参数使用默认值,具体见代码1:

代码1执行的功能是从命令行中启动这个名叫的launch的测试程序,在launch后面应加上保存有需要打开程序路径的文件名:

  如在命令行中键入:

>

launchset.txt

  而set.txt中的内容为:

C:

\\WINDOWS\\SYSTEM32\\CALC.EXE

\\WINDOWS\\SYSTEM32\\NOTEPAD.EXENEW.TXT

\\WINDOWS\\SYSTEM32\\CHARMAP.EXE

路径的前半部分为”C:

\\WINDOWS\\”,这当然要视你的Windows系统的类型以及系统盘的存放位置而定。

如果是NT或2000的机器,则应使用WINNT.

/*测试程序1:

示例如何使用进程的launch程序,通过在命令行中加载相应的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行*/

测试程序(仅供参考)

#include<

windows.h>

stdio.h>

string.h>

#defineMAX_LINE_LEN80

intmain(intargc,char*argv[])

{

//localvariables

FILE*fid;

charcmdLine[MAX_LINE_LEN];

//CreateProcessparameters

LPSECURITY_ATTRIBUTESprocessA=NULL;

//Default

LPSECURITY_ATTRIBUTESthreadA=NULL;

BOOLshareRights=TRUE;

DWORDcreationMask=CREATE_NEW_CONSOLE;

//Windowperprocess.

LPVOIDenviroment=NULL;

LPSTRcurDir=NULL;

STARTUPINFOstartInfo;

//Result

PROCESS_INFORMATIONprocInfo;

//1.Readthecommandlineparameters

if(argc!

=2)

fprintf(stderr,"

Usage:

lanch<

launch_set_filename>

\n"

);

exit(0);

}

//2.Openafilethatcoutainasetofcommands

fid=fopen(argv[1],"

r"

//3.Foreverycommandinthelaunchfile

while(fgets(cmdLine,MAX_LINE_LEN,fid)!

=NULL)

//Readacommandfromthefile

if(cmdLine[strlen(cmdLine)-1]=='

\n'

cmdLine[strlen(cmdLine)-1]='

\0'

;

//RemoveNEWLINE

//Createanewprocesstoexecutethecommand

ZeroMemory(&

startInfo,sizeof(startInfo));

startInfo.cb=sizeof(startInfo);

if(!

NULL,//Filenameofexecutable

cmdLine,//commandline

processA,//Processinheritedsecurity

threadA,//Threadinheritedsecurity

shareRights,//Rightspropagation

creationMask,//variouscreationflags

enviroment,//Enviromentvariable

curDir,//Child'

&

startInfo,

procInfo

)//endofif

CreatProcessfailedonerror%d\n"

GetLastError());

ExitProcess(0);

}

//Terminateafterallcommandshavefinished.

return0;

通过上面这段极其简洁的代码,完成了看似有些难度的任务,让我们充分感受到采用一些高级的编程手段所带来的便捷与高效。

3.在上述实验2的基础上利用Windows提供的与进程相关的API函数,编写程序,实现创建进程、运行指定程序和终止进程(如创建写字板或者画图进程及终止该进程)。

要求:

有交互界面(命令方式或图形界面方式,推荐使用图形界面的交互),如:

输入1创建进程,提示输入指定程序的路径创建对应的进程,并输出显示进程的相关信息;

输入2关闭该进程;

输入0退出程序。

注:

与进程和线程相关的WindowsAPI

(1)CancelWaitableTimer这个函数用于取消一个可以等待下去的计时器操作

(2)CallNamedPipe这个函数由一个希望通过管道通信的一个客户进程调用

(3)ConnectNamedPipe指示一台服务器等待下去,直至客户机同一个命名管道连接

(4)CreateEvent创建一个事件对象

(5)CreateMailslot创建一个邮路。

返回的句柄由邮路服务器使用(收件人)

(6)CreateMutex创建一个互斥体(MUTEX)

(7)CreateNamedPipe创建一个命名管道。

返回的句柄由管道的服务器端使用

(8)CreatePipe创建一个匿名管道

(9)CreateProcess创建一个新进程(比如执行一个程序)

(10)CreateSemaphore创建一个新的信号机

(11)CreateWaitableTimer创建一个可等待的计时器对象

(12)DisconnectNamedPipe断开一个客户与一个命名管道的连接

(13)DuplicateHandle在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄

(14)ExitProcess中止一个进程

(15)FindCloseChangeNotification关闭一个改动通知对象

(16)FindExecutable查找与一个指定文件关联在一起的程序的文件名

(17)FindFirstChangeNotification创建一个文件通知对象。

该对象用于监视文件系统发生的变化

(18)FindNextChangeNotification重设一个文件改变通知对象,令其继续监视下一次变化

(19)FreeLibrary释放指定的动态链接库

(20)GetCurrentProcess获取当前进程的一个伪句柄

(21)GetCurrentProcessId获取当前进程一个唯一的标识符

(22)GetCurrentThread获取当前线程的一个伪句柄

(23)GetCurrentThreadId获取当前线程一个唯一的线程标识符

(24)GetExitCodeProces获取一个已中断进程的退出代码

(25)GetExitCodeThread获取一个已中止线程的退出代码

(26)GetHandleInformation获取与一个系统对象句柄有关的信息

(27)GetMailslotInfo获取与一个邮路有关的信息

(28)GetModuleFileName获取一个已装载模板的完整路径名称

(29)GetModuleHandle获取一个应用程序或动态链接库的模块句柄

(30)GetPriorityClass获取特定进程的优先级别

(31)GetProcessShutdownParameters调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况

(32)GetProcessTimes获取与一个进程的经过时间有关的信息

(33)GetProcessWorkingSetSize了解一个应用程序在运行过程中实际向它交付了多大容量的内存

(34)GetSartupInfo获取一个进程的启动信息

(35)GetThreadPriority获取特定线程的优先级别

(36)GetTheardTimes获取与一个线程的经过时间有关的信息

(37)GetWindowThreadProcessId获取与指定窗口关联在一起的一个进程和线程标识符

(38)LoadLibrary载入指定的动态链接库,并将它映射到当前进程使用的地址空间

(39)LoadLibraryEx装载指定的动态链接库,并为当前进程把它映射到地址空间

(40)LoadModule载入一个Windows应用程序,并在指定的环境中运行

(41)MsgWaitForMultipleObjects等侯单个对象或一系列对象发出信号。

如返回条件已经满足,则立即返回

(42)SetPriorityClass设置一个进程的优先级别

(43)SetProcessShutdownParameters在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序

(44)SetProcessWorkingSetSize设置操作系统实际划分给进程使用的内存容量

(45)SetThreadPriority设定线程的优先级别

(46)ShellExecute查找与指定文件关联在一起的程序的文件名

(47)TerminateProcess结束一个进程

(48)WinExec运行指定的程序

5.进程调度模拟

编写程序完成单处理机系统中的进程调度,要求采用先来先服务算法、最短CPU运行期优先调度算法、优先级调度算法、多级反馈队列轮转算法。

实验具体包括:

首先确定进程控制块的内容和进程控制块的组织方式;

然后完成进程创建原语和进程调度原语;

最后编写主函数对所做工作进行测试。

1)实验提示与讲解

这个实验主要需要考虑三个问题:

如何组织进程、如何创建进程和如何实现处理器调度。

考虑如何组织进程,首先就要设定进程控制块的内容。

进程控制块PCB记录各个进程执行时的情况。

不同的操作系统,进程控制块记录的信息内容不一样。

操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。

这里的实验只是用了必不可少的信息。

一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类:

①标识信息

每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。

这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。

在后面给出的参考程序中,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。

②说明信息

用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放的位置、进程数据存放位置等等。

实验中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。

③现场信息

现场信息记录各个寄存器的内容。

当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块中,当进行进程调度时,从选中进程的进程控制块中读取现场信息进行现场恢复。

现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字等。

在实验中,可选取几个寄存器作为代表。

用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字。

④管理信息

管理信息记录进程管理和调度的信息。

例如进程优先数、进程队列指针等。

实验中,仅包括队列指针。

因此,可将进程控制块结构定义如下:

structpcb

intname;

//进程标识符

intstatus;

//进程状态

intAX,BX,CX,DX;

//进程现场信息,通用寄存器内容

intPC;

//进程现场信息,程序计

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1