操作系统课程设计进程创建系统说明书.docx
《操作系统课程设计进程创建系统说明书.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程创建系统说明书.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统课程设计进程创建系统说明书
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2010年秋季学期
操作系统原理课程设计
题目:
进程创建系统
专业班级:
计算机科学与技术2班
姓名:
桌面小箭头
学号:
0123456789
指导老师:
兰州理工
成绩:
目录
前言3
摘要4
正文5
一、设计思想5
二、实验目的6
三、实验内容6
四、实验步骤7
1、需求分析7
2、概要设计7
3、各模块的伪码算法8
(1).使用系统调用fork()创建两个子进程的程序8
(2).修改程序之后,每一个进程循环显示一句话的程序:
9
五.调试分析11
总结15
致谢16
参考文献17
附录:
程序源代码18
前言
本课程设计是实现进程创建系统,我们还将学到有关进程的相关概念。
Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?
在现代的操作系统里面,都有程序和进程的概念.那么什么是程序,什么是进程呢?
通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现.一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程.当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别.为了充分的利用资源,系统还对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态.新建表示进程正在被创建,运行是进程正在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了,系统正在回收资源。
摘要
创建一个进程的系统调用很简单.我们只要调用fork函数就可以了. 当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样.当然创建两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪fork的返回值.当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的.父进程为什么要创建子进程呢?
前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源.一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用。
关键词:
进程的创建,进程的概念
正文
一、设计思想
进程创建系统的实现
1设计目的
(1)加深对操作系统系统调用功能和进程概念的理解,明确进程和程序的区别。
(2)掌握Linux中进程的创建方法,进一步理解进程的并发执行。
2设计要求
1、编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter…'及'son……',父进程显示'parent……',观察结果,分析原因。
二、实验目的
(1)加深对操作系统系统调用功能和进程概念的理解,明确进程和程序的区别。
(2)掌握Linux中进程的创建方法,进一步理解进程的并发执行。
(3)学生通过该题目的设计过程,可以初步掌握进程创建系统的原理、软件开发方法并提高解决实际问题的能力。
三、实验内容
1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。
2、编写程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符,如父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因;修改程序,每一个进程循环显示一句话,如子进程显示'daughter…'及'son……',父进程显示'parent……',观察结果,分析原因。
四、实验步骤
a)需求分析
编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示'a',子进程分别显示字符'b'和字符'c'。
修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter…'及'son……',父进程显示'parent……',观察结果,分析原因。
2、概要设计
本程序用到的抽象的数据有:
intp1,p2;inti;
主程序的流程图如下图(图一):
图一
3、各模块的伪码算法
(1).使用系统调用fork()创建两个子进程的程序
#include
#include
#include
intchild1();
intchild2();
intmain(intargc,char**argv)
{
pid_tchild_pid;
inti,j;
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild1();
else{
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild2();
else{
{
printf("a");
}
return0;
}
}
}
intchild1()
{
{
printf("b");
fflush(stdout);
}
return0;
}
intchild2()
{
{
printf("c");
}
return0;
}
(2).修改程序之后,每一个进程循环显示一句话的程序:
#include
#include
#include
intchild1();
intchild2();
intmain(intargc,char**argv)
{
pid_tchild_pid;
inti,j;
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild1();
else{
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild2();
else{
for(i=0;i<3;i++){
printf("Parent%d\n",i);
printf("Parent");
}
return0;
}
}
}
intchild1()
{
inti,j;
for(i=0;i<3;i++){
printf("daughter%d\n",i);
printf("daughter");
fflush(stdout);
}
return0;
}
intchild2()
{
inti,j;
for(i=0;i<3;i++){
printf("son%d\n",i);
printf("son");
}
return0;
}
五、结果分析
1.使用系统调用fork()创建两个子进程的程序的调试结果如下图:
图5-1运行结果图a
图5-2运行结果图b
图5-3运行结果图c
由上面的三个图可以看出来由于程序的并发执行,同一个程序运行的结果会有所区别。
2.修改程序之后,每一个进程循环显示一句话的调试结果如下图:
图5-4修改程序后运行结果a
图5-5修改程序后运行结果b
由上面的图可以看出来由于程序的并发执行,同一个程序运行的结果会有所区别。
总结
在这两周的操作系统课程设计中,我的题目是:
进程创建系统,,这两周课程设计中,通过该题目的设计过程,学会如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。
一个人要完成所有的工作是非常困难和耗时的。
在以后的学习中我会更加注意各个方面的能力的协调发展。
在课程设计时遇到了很多的问题,在老师的帮助和对各种资料的查阅中将问题解决,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。
这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一次自我验证。
在其中我学习到了很多平时书本中无法学到的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识融会,组织,配合学习,两周中我收益很大,学到很多。
致谢
能够完成这次操作系统课程设计,我要感谢我的指导老师刘嘉,她在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我的能力得到了提高,养成了科学、严谨学习习惯。
在本次课程设计当中,有很多同学帮助我完成对程序的测试,对我的课程设计的完成起了不小的作用,在他们的帮助下,我才能够比较好的完成这次课程设计,在此一并表示感谢。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.《操作系统教程》.高等教育出版社
4.曾明. 《Linux操作系统应用教程》.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静, 《操作系统教程--原理和实例分析》.高等教育出版社
7.周长林,《计算机操作系统教程》.高等教育出版社
8.张尧学,《计算机操作系统教程》,清华大学出版社
9.任满杰,《操作系统原理实用教程》,电子工业出版社
附录:
程序源代码
1.使用系统调用fork()创建两个子进程的程序清单:
#include
#include
#include
intchild1();
intchild2();
intmain(intargc,char**argv)
{
pid_tchild_pid;
inti,j;
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild1();
else{
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild2();
else{
{
printf("a");
}
return0;
}
}
}
intchild1()
{
{
printf("b");
fflush(stdout);
}
return0;
}
intchild2()
{
{
printf("c");
}
return0;
}
2.修改程序之后,每一个进程循环显示一句话的程序清单:
#include
#include
#include
intchild1();
intchild2();
intmain(intargc,char**argv)
{
pid_tchild_pid;
inti,j;
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild1();
else{
if((child_pid=fork())==-1){
return0;
}
if(child_pid==0)
returnchild2();
else{
for(i=0;i<3;i++){
printf("Parent%d\n",i);
printf("Parent");
}
return0;
}
}
}
intchild1()
{
inti,j;
for(i=0;i<3;i++){
printf("daughter%d\n",i);
printf("daughter");
fflush(stdout);
}
return0;
}
intchild2()
{
inti,j;
for(i=0;i<3;i++){
printf("son%d\n",i);
printf("son");
}
return0;
}