操作系统课设进程创建系统Word文档格式.docx
《操作系统课设进程创建系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课设进程创建系统Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
关键词:
PCB进程操作系统C++
第一章设计思想
1.设计原理
1.1.进程及进程创建
进程是一个程序在一组数据上的一次执行过程。
一个Windows进程包含自己独立的虚拟地址空间,用以保护私有的执行代码和数据不被其他的进程破坏。
进程由以下方面组成:
(1)至少一个可执行程序,包括代码和初始数据,一般在进程创建时说明。
(2)一个独立的进程用户空间,在进程创建时由操作系统分配。
它用于存放进程用户态运行的程序和处理的数据。
(3)系统资源。
这是指在进程创建时及执行过程中,由操作系统分配给进程的系统资源,包括I/O设备,文件等。
(4)一个执行栈区,包含运行现场信息。
一般的用户进程都是经历首先被创建,断断续续运行,最后结束的过程。
当要把新进程加入到系统时,操作系统创建管理该进程的所要的系统表格,为进程分配空间并初始化进程空间,准备好执行程序和数据。
一个进程可以创建一个新的进程,被创建的进程称为子进程,创建者进程称为父进程。
1.2.进程映像
一个进程至少执行一个可执行程序,这些程序往往以文件形式存放于辅存中,程序文件中还包含局部变量,全局变量数据以及常数定义。
因此,一个进程需要足够的存储空间来存放进程的程序和数据以便执行。
为了执行程序,操作系统还必须为进程分配一个栈区,用来保存过程调用时的现场。
我们把程序,数据,栈的集合称作进程映像(ProcessImage)。
没有进程映像,进程就不知道运行什么程序。
1.3.进程的数据结构
进程控制块(PCB)最重要的数据结构,每个进程控制块都包含操作系统所需的进程信息。
操作系统必须建立一个表格描述该进程的存放及状态。
这个表格被称为进程控制块(PCB)。
它描述了进程标识空间,运行状态,资源使用等信息。
进程控制块包含三大类信息:
(1)进程标识信息。
(2)处理机状态信息。
进程的用户栈区放在进程的用户空间,进程的核心栈区放在系统空间,逻辑上包含在进程控制块中,核心栈用于运行操作系统核心态的程序,每一个进程都有一个属于自己的核心栈。
运行现场主要包括a.用户可用的寄存器或通用寄存器b.控制和状态寄存器。
(3)进程控制信息。
包括:
a.调度和状态信息b.进程间通信信息c.存储管理信息d.进程所用资源列表e.链接信息。
2.算法思路
2.1需求分析
编写一段程序,使用系统调用创建子进程。
当此程序运行时,在系统中有一个父进程和子进程活动。
并且管理该进程的查看,终止以及它执行并创建子进程,在创建子进程中利用命令解释程序进行加减乘除运算。
2.2详细设计
1.进程的创建
应用程序是通过调用相应的进程创建函数来创建一个新的Windows进程的,最常用的进程创建函数是CreateProcess。
创建进程的过程是由三个部分配合完成的:
创建进程的系统服务,Windows子系统和新的进程,CreateProcess通过调用相关的系统服务来调入需要执行的映像文件并创建进程和初始线程对象,并通过消息通知Windows子系统新的进程和线程对象已被创建。
(1)CreateProcess通过调用进程服务找到执行文件的映像,并为其创建区域对象。
(2)创建执行进程对象,包括设置执行进程快,初始化进程的地址空间,初始化核心进程快和进程环境快。
(3)创建初始线程,包括创建执行进程快,设置线程的唯一标志和创建线程环境快。
(4)通过发送消息通知Windows子系统新的进程已被创建,子系统将初始线程插入进程的线程列表,并将新的进程加入子系统进程列表。
(5)将控制传回进程的初始线程,对进程进行初始化。
(6)在新的进程和线程的上下文内调入相应的动态链接库,开始执行程序。
Windows通过CreateProcess函数来创建进程的过程如图1所示。
图1Windows创建进程的过程
首先对所有属性初始化,优先级规定为0--31,确保进程号唯一,初始新建的进程状态为“就绪”,进程号是随机分配的;
然后执行进程并用build()函数创建子进程。
2.查看进程
通过调用output()函数来显示系统中的进程,若存在进程利用for循环中变量与全局变量比较显示该进程的进程号,优先级数,进程状态,累加器,时间片和需运行时间,若不存在进程显示系统当前没有进程。
3.终止进程
利用函数exit()来终止进程序列中选中的进程,用进程号来区分是否终止该进程,继续利用for循环判断首先看存在次进程否,若不存在输出“该进程号不存在”,若存在按进程号排序,然后给该进程赋值为0则该进程会被终止,最后输出其他进程的信息。
第二章模块的伪码算法
1.数据定义
1.1定义进程控制块的结构体
structpcb_task//进程控制块结构体
{
intA;
//累加器
intF;
//状态寄存器
intpc;
//程序寄数器
intpid;
//进程号
intppid;
//父进程号
intpriority;
//优先级数
intruntime;
//运行时间
inttimep;
//时间片
intodr[maxodr];
//进程需要执行的指令
charstatu[10];
//进程的状态
voidinit();
}pcb[maxpcb];
1.2定义功能函数
voidCreateProcess(int);
//case1:
创建进程
voidexec();
//case2:
执行并创建子进程
voidExit(int);
//case3:
进程终止(把要终止的进程从进程序列中去掉)
voidoutput();
//case4:
显示进程序列
voidoutput()//显示系统的所有进程
voidhelp()//命令解释程序
voidmenue()//界面
voidkernel()//虚拟kernel
voidMOV(intpid,intn)//赋值
voidADD(intpid,intn)//加
voidSUB(intpid,intn)//减
voidMUL(intpid,intn)//乘
voidDIV(intpid,intn)//除
2.模块类
2.1创建进程模块
voidCreateProcess(intppid)//case1:
创建进程
{
pcb[cur_pcb].init();
pcb[cur_pcb].ppid=ppid;
cur_pcb++;
cout<
<
"
进程创建成功!
新进程号是:
pcb[cur_pcb-1].pid<
endl<
endl;
output();
}
2.2执行并创建子进程模块
voidexec()//case2:
执行并创建子进程
{
inti,k,n;
inttpcb=-1,pid,stop=2000;
//tpcb优先级数pid进程号k最优进程在序列中的number
charord[10];
if(cur_pcb==0)
cout<
系统内没有进程!
return;
}
for(i=0;
i<
cur_pcb;
i++)//首先执行优先级最高的进程
if(tpcb<
=pcb[i].priority)
{
if(tpcb==pcb[i].priority&
&
pcb[i].pid<
pid)
pid=pcb[i].pid,k=i;
if(tpcb<
pcb[i].priority)
{
tpcb=pcb[i].priority;
pid=pcb[i].pid;
k=i;
}
}
printf("
执行进程%d\n"
pid);
//每次分别执行优先级高的进程
help();
请输入您的指令:
;
scanf("
%s"
ord);
while(!
check(ord))
cout<
您输入的指令是非法的,请重新输入:
scanf("
if(ord[0]=='
q'
||ord[0]=='
Q'
)return;
if(strcmp(ord,"
OUT"
)==0){cout<
输出如下"
output();
return;
}
请输入必要的参数:
%d"
&
n);
if(!
done(pid,ord,n)){output();
return;
}//如果发生中断就保护现场
else//否则对所有进程进行调整
strcpy(pcb[k].statu,"
运行"
);
for(i=0;
i<
cur_pcb;
i++)
if(i!
=k)
{
pcb[i].priority++;
if(strcmp(pcb[i].statu,"
)==0)
strcpy(pcb[i].statu,"
就绪"
if(rand()%3==0)strcpy(pcb[i].statu,"
等待"
}
pcb[k].timep=++Time;
pcb[k].priority-=1;
pcb[k].runtime-=1;
指令进行完以后的进程表(中间表,可能有的进程是需要终止的)"
//:
中间过程
output();
if(pcb[k].A<
=0){Exit(pid);
return;
}//进程完成1
if(pcb[k].runtime<
=0)//进程完成2
Exit(pid);
output();
return;
if(pcb[k].priority<
=0)pcb[k].priority=0;
tpcb=-1;
for(i=0;
i++)//选择最优的进程
if(tpcb<
if(tpcb==pcb[i].priority&
pid)
pid=pcb[i].pid,k=i;
if(tpcb<
{
tpcb=pcb[i].priority;
pid=pcb[i].pid;
k=i;
}
CreateProcess(pid);
//创建子进程
}
2.3界面模块
voidmenue()//界面
虚拟进程管理系统"
1.创建进程"
<
endl
<
2.执行程序并创建子进程"
3.终止进程"
4.查看进程"
5.退出系统"
endl<
第三章函数的调用关系图
图2函数调用关系图
第四章测试结果
1.进入创建系统的主界面.
图3进入系统主界面
2.创建进程,随机分配进程号,优先级,运行时间.
图4创建进程
图5创建了5个进程
3.进入执行程序并创建子程序界面,按照优先级调度执行程序.通过输入指令和必要的参数对程序进行加、减、乘、除、输出、退出、等操作.
图6进入执行程序并创建子程序界面
图7执行mov指令的结果
图8执行ADD指令
图9执行ADD指令的结果
3.进入终止进程
图10进入终止进程界面
图11通过输入需要终止进程的进程号终止进程
4.查看进程
图12查看进程界面
5.退出系统
图13退出系统界面
设计总结
经过两周的课程设计生活,从一开始拿到题目到后来的分析,构思,完成设计,这一系列的工作让我受益匪浅。
并且通过本学期的操作系统的学习以及这次课程设计,我对操作系统的理解和操作都有了比较大的进步。
通过这次课程设计,让我明白了怎样创建一个进程,以及如何在Windows系统下创建进程。
在课程设计的过程中,我不仅复习了课本上的知识,也更加明白,自己与社会要求之间还有很大的差距。
经两个星期的学习,我对进程管理中的相关内容进一步的了解了,也更近一步的加深了对编程的理解。
知道了自己的不足。
在学习操作系统的过程中也学到和巩固了许多计算机应用基础知识。
这次的设作业对我们来说也是一次自我的检验和挑战,在具体操作中对这学期所学的操作系统中进程这个部分的理论知识得到巩固加强,达到实训的目的,也发现了自己的不足之处,为我们以后的学习奠定了基础,同时体会到操作系统中的精髓,发现上机操作的重要作用。
通过实际操作,再次加深对C的理解,得到软件工程的综合训练,提高解决实际问题的能力。
其中,在此次实践设计中有遇到了很多困难,首先我们没有明白源码与伪码之间的差距,但在在老师的解释下我们理解了这两者之间的区别。
所以在后面的时间里虽然也有困难但在老师的辅导和查阅一些资料后一切问题迎刃而解。
此外,见识了真正的源代码也是更为重要的。
所以在平时学习课本知识的同时,也需要自己看看源代码与实际相结合,只有这样才能更好的提高我们的能力,加深理解。
并在此过程中对发现的问题要多加思索,查阅相关资料,充分利用网络上的资源。
最后,通过该题目的设计过程,我明白了自己的不足我更加努力,争取在毕业时达到步入社会的要求。
为自己的未来打好基础。
同时加深了我对进程创建的理解,更加理解了课程设计的重要意义,我知道了,只有将自己的理论与实际相结合,才能更好的将所学的知识应用于实践,加深自己的理解,更好的理解操作系统的深刻内涵。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明.
Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.蒲晓蓉,张伟利.《操作系统原理与实例分析》.机械工业出版社
7.张尧学,计算机操作系统教程,清华大学出版社
8.任满杰,操作系统原理实用教程,电子工业出版社
9.张坤,姜立秋,赵慧然.《操作系统实验教程》.清华大学出版社
致谢
在这次课程设计中,虽然只有短短的两周时间,却让我学会了很多东西。
使得我们将之前的理论知识运用与实践中,从开始一无所知到能够看懂并且理解程序,对操作系统的更进一步的巩固以及对进程的概念也有了更深刻的理解。
对操作系统中进程的创建的基本概念、工作原理以及设计方法进行了更深入的学习和了解。
在老师的教导下用通俗的语言和实例,阐述了操作系统创建进程的基本原理,采用的数据结构,设计思想,各模块的伪码算法,函数的调用关系图,以及测试和测试结果。
这段时间我们了解了程序的博大精深。
通过这次学习激发了我们对学习的的兴趣。
感谢老师给了我们这次实践的机会。
源代码
#include<
iostream>
cstring>
algorithm>
windows.h>
usingnamespacestd;
constintmaxpcb=1000;
constintmaxodr=1000;
constintmaxpid=1000;
boolpid_vis[maxpid];
intcur_pcb=0;
intTime=0;
structpcb_task//进程控制块结构体
intA;
voidpcb_task:
:
init()//所有的属性要进行一次初始化
A=pc=0;
priority=rand()%32;
//优先级为0-31
do{pid=rand()%maxpid;
}while(pid_vis[pid]);
pid_vis[pid]=true;
//确保进程号是唯一的
memset(odr,-1,sizeof(odr));
strcpy(statu,"
//初始新建的进程状态为"
runtime=3+rand()%10;
timep=0;
}boolcmp(pcb_taska,pcb_taskb){returna.pid<
b.pid;
进程终止(把要终止的进程从进程序列中去掉)
系统当前的进程表"
inti;
系统当前没有进程!
printf("
进程号优先级数进程状态累加器时间片需运行时间\n"
i++)
if(pid_vis[pcb[i].pid])
printf("
%d%d%s%d%d%d\n"
pcb[i].pid,pcb[i].priority,pcb[i].statu,pcb[i].A,pcb[i].timep,pcb[i].runtime);
printf("
\n"
cout<
endl<
endl;
"
指令符数字(参数)指令解释"
MOVn把整数n赋给累加器A\n"
ADDn累加器A的值加上整数n,结果送到累加器A。
\n"
SUBn从累加器A的值减去整数n,结果送到累加器A。
MULn从累加器A的值乘以整数n,结果送到累加器A。
DIVn从累加器A的值除以整数n,结果送到累加器A。
OUT累加器的内容输出到端口(显示器)\n"
QUIT退出"
endl
boolcheck(char*x)//检测命令符是否合法
if(strcmp(x,"
MOV"
)==0||strcmp(x,"
ADD"
SUB"
MUL"
)==0)returntrue;
//strcmp()检查是否相等,但两值相等时等于0
elseif(strcmp(x,"
DIV"
OUT