操作系统实验指导书实验二进程管理Word格式.docx
- 文档编号:16635754
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:308.29KB
操作系统实验指导书实验二进程管理Word格式.docx
《操作系统实验指导书实验二进程管理Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书实验二进程管理Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书 进程 管理