操作系统:进程创建与撤消
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
试验一:进程创建与撤销
计科112康岩岩201100814220
2013/4/10
实验一:进程创建与撤消
一、实验目的
1、加深对进程概念的理解和进程创建与撤消算法;
2、进一步认识并发执行的实质。
二、实验内容
本实验完成如下三个层次的任务:
(1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤
1、windows的进程管理
以下是win7的人物管理器,可以进行进程的查看、创建、撤销等操作,由于操作比较简单与琐碎,这里不再具体描述。
2、VC++/Java/C#的进程创建与撤销工具
对于本次试验,我使用C#进行进程创建、撤销等测试,具体内容在下面给出。
3、进程创建与撤销的模拟实现
(1)总体设计:
此次程序完全由c#实现,能够通过窗体界面详细地生动地显示进程的运行状态。下面一步一步的进行实现
①数据定义:
类PCB的定义如下:
class PCB{
string pcbName; //进程名
int pcbId; //ID
long startTime; //开始时间
long pcbRuntime = 0; //运行时间
int pcbLeve; //线程优先级
}
对于所有的进程信息,用以下表储存:
Dictionary
容器ThreadTable用来储存所有进程简直key 表示进程id,值为Hashtable,储存的为线程信息,
②函数
CREATE(PCB pcb)—进程创建:创建进程需要传入一个PCB 对象,然后启动一个单独的线程来操作该对象,操作该对象就是把线程运行的状态传送给PCB同时PCB也唯一地标示其所在的线程。一个PCB对象的创建可通过一个与使用这交互的界面实现,使用者在交互窗体上输入进程名称,优先级,然后根据输入创建相应对象;
killProcess(int id)—进程终止:由于每个进程都具有不用的pcbid,所以要结束一个进程需要将其id作为参数传入,在窗体应用程序上,使用者只需选中进程列表总相应进程后,即可选择执行中止函数。
③主界面设计:
利用C#的各种控件可以很方便地设计出界面,界面截图如下:
2-运行界面
(2)详细设计:
此程序主要是用来实现进程的创建与撤销以及进行进程状态的实时显示,这一系列通过界面的交互操作来完成。由于本程序需要用C#来进行实现,关于进程的创建及界面操作都具有其语言特色,比如需要用到事件、托管之类。
创建线程的函数如下,其中参数有交互窗体产生,主要包括进PcbName、PcbId及创建时间
private void createProcess(PCB pcb) {
//启动的线程函数为run
ParameterizedThreadStart ParStart = new
ParameterizedThreadStart(run);
hread thread = new Thread(ParStart);
//设置pcb的起始时间为当前时间
pcb.StartTime = DateTime.Now.ToFileTime();
Hashtable hash=new Hashtable();
//将线程信息和pcb信息存入hash表
hash.Add("thread",thread);
hash.Add("pcb",pcb);
//将hash表存入记录线程状态的总表
this.ThreadTable.Add(pcb.PcbId,hash);
thread.Start(pcb); //启动线程
}
run 函数定义如下
///
/// 线程运行的函数
///
/// 具有唯一pcbid的PCB对象,用来标示线程,也用来显示储存线程运行状态
private void run(object o) {
//定义委托,用来调用函数显示某一进程的状态GetNowFileTimeCallBack call = new GetNowFileTimeCallBack(updatePcbListTime);
PCB pcb = (PCB)o;
int pcbId = pcb.PcbId;
while (true) {
//得到运行时间
ong runtime = DateTime.Now.ToFileTime() - pcb.StartTime;
//回调信息
his.BeginInvoke(call, pcbId, runtime);
try {
Thread.Sleep(1000);
}catch (Exception e) { }
}
}
在run函数中有句代码如下:
this.BeginInvoke(call, pcbId, runtime);
此句代码回调了两个参数给updatePcbListTime,分别是进程的PcbId即当前线程的运行时间,有了这连个参数便可以在主界面上更新进程运行的时间,这个操作设计到c#对控件的有关操作,这里不再详细介绍,后面在源代码中会给出。
进程的撤销:
使用着在进程列表中选择一项进程,直接点击“结束进程”按钮即可,结束进程的函数如下:
private void killProcess(int id){
//根据id从进程信息表中得到进程信息
Hashtable h=ThreadTable[id];
Thread t=(Thread)h["thread"];//得到id对应的线程
try{
if (t != null && t.IsAlive) {
t.Abort(); //停止线程
}
}catch (Exception e) {