




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘 要计算机系统中的核心系统软件是操作系统,它负责控制和管理整个系统的资源并组织用户高效、协调使用这些资源,使计算机中各部件高效地并行运行。进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位。在 UNIX 系统中,用户创建一个新进程的唯一方法就是调用系统调用 fork。调 用 fork 的进程称为父进程,而新创建的进程叫做子进程。本课程设计
2、是实现进程创建系统,我们还将学到有关进程的相关概念。 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面,都有程序和进程的概念.那么什么是程序,什么是进程呢? 通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件。而进程是一个开始执行但是还没有结束的程序的实例。就是可执行文件的具体实现一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使
3、程序变成进程以供系统调用。在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别。为了充分的利用资源,系统还对进程区分了不同的状态。将进程分为新建,运行,阻塞,就绪和完成五个状态。新建表示进程正在被创建,运行是进程正在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了,系统正在回收资源。关键词:进程;操作系统;父进程;子进程;进程创建系统;目 录1 绪论11.1概述11.2学习方法11.3进程及进程创建21.4进程映像21.5设计思想32 伪码算法43 函数调用关系图84 结果分析10
4、5 结论14参考文献16致 谢17附 录181 绪论1.1概述 通过本课程的学习,使学习掌握操作系统的基本概念、原理、技术和使用方法;能用程序设计语言编写和调试运行操作系统的主要方法和模块;深入的了解操作系统在计算机系统中的使用及地位,以及它与硬件和其他软件之间的关系;进而了解操作系统控制整个计算机系统的全过程,具有操作系统的整体概念。本课程设计是实现进程创建系统,我们还将学到有关进程的相关概念。 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面,都有程序和进程的概念.那么什么是程序,什么是进程呢?
5、通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现. 一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程. 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别. 为了充分的利用资源,系统还对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态. 新建表示进程正在被创建,运行是进程正
6、在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了,系统正在回收资源。进程和程序的区别。掌握Linux中进程的创建方法,进一步理解进程的并发执行。了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。编写程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符,如父进程显示'a',子进程分别显示字符'b'和字符'c
7、9;。试观察记录屏幕上的显示结果,并分析原因; 修改程序,每一个进程循环显示一句话,如子进程显示'daughter '及'son ',父进程显示 'parent ',观察结果,分析原因。1.2学习方法 计算机操作系统具有其自身的规律性,在掌握其基本原理的同时,加强实习环节的训练对学习这门课有极大的帮助。 获取知识的同时,掌握科学的基本规律及研究方法。做到最大化对本门课程知识的了解。 培养自我拓展知识和运用知识的能力,并且在学习中多进行操作训练,做到熟能生巧。1.3进程及进程创建 进程是操作系统的一个核心概念。其概念至今未有严格的公认的定义。一般的
8、讲,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。其基本状态有三种,ready(就绪),running(运行),wait(等待)。死锁是指,在两个或者多个并发进程中,如果每个进程有某种资源而又都等待别的进程释放他们现在保持的资源,否则就不能向前推进,成称这一组进程产生了死锁。通俗的讲,就是两个或者多个进程无止境的等候着永远不会成立的条件的一种系统状态。产生死锁的根本原因是系统能够提供的资源数比要求该资源数的少,其具体原因是1系统的资源不足2进程推进顺序非法。解锁是指通过软件或者硬件手段解除移动通讯设备对于运营网络的限制。进程是一个程序在一组数据上的一次执行过程。一个Windo
9、ws进程包含自己独立的虚拟地址空间,用以保护私有的执行代码和数据不被其他的进程破坏。进程由以下方面组成:(1)至少一个可执行程序,包括代码和初始数据,一般在进程创建时说明。(2)一个独立的进程用户空间,在进程创建时由操作系统分配。它用于存放进程用户态运行的程序和处理的数据。(3)系统资源。这是指在进程创建时及执行过程中,由操作系统分配给进程的系统资源,包括I/O设备,文件等。(4)一个执行栈区,包含运行现场信息。一般的用户进程都是经历首先被创建,断断续续运行,最后结束的过程。操作系统提供了进程创建的系统调用。用户程序可以通过“进程创建”系统调用创建新的进程去运行新的程序。当要把新进程加入到系统
10、时,操作系统创建管理该进程的所要的系统表格,为进程分配空间并初始化进程空间,准备好执行程序和数据。一个进程可以创建一个新的进程,被创建的进程称为子进程,创建者进程称为父进程。1.4进程映像进程映像也称进程图像,是进程执行的上下文环境,包括处理机中各通用寄存器的值,进程的内存映像,打开文件的状态和进程占用的资源信息等。它又:进程控制块(PCB)、进程执行的程序(code)/程序、进程执行时所用的数据/数据集合、进程执行时使用的工作区组成。 一个进程至少执行一个可执行程序,这些程序往往以文件形式存放于辅存中,程序文件中还包含局部变量,全局变量数据以及常数定义。因此,一个进程需要足够的存储空间来存放
11、进程的程序和数据以便执行。为了执行程序,操作系统还必须为进程分配一个栈区,用来保存过程调用时的现场。我们把程序,数据,栈的集合称作进程映像(Process Image)。没有进程映像,进程就不知道运行什么程序。1.5设计思想1.使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c',多次运行此程序,对比运行结果。2.修改上述程序,每一个进程循环显示一句话。子进程显示'daughter '及'son
12、 ',父进程显示 'parent '多次运行,对比结果。 3. 再次修改,在程序中使用调用lockf()来给每一个子进程加锁或解锁并运行程序,对比结果。2 伪码算法 伪码是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易的以任何一种编程语言实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似于自然语言。介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码,不用拘泥于具体实现。相比程序语言它更类似于自然语言。它是半角式化、不标准的语言。它可以将整个算法运行过程的结构用接近自然愿与你的形式(可以使用任何一种你熟悉的意思表达出来)描述出来。
13、对于概要设计中的使用系统调用fork()创建两个子进程,创建的过程函数如下:(1)函数使用头文件如下: #include<iostream> Using namespace std;(2)main() 系统调用格式 参数定义 Int p1,p2; 调用函数fork() P1=fork(); If(p1=0)cout<<”b”<<endl; Else if(p1>0) P2=fork(); If(p2=0)cout<<”c”<<endl; Else if(p2>0) cout<<”a”<<endl;R
14、eturn 0; 使用系统调用fork( )创建两个子进程 #include <iostream> using namespace std; int main() int p1,p2; p1=fork(); if(p1=0) cout<<"b"<<endl; else if(p1>0) p2=fork(); if(p2=0) cout<<"c"<<endl; else if(p2>0) cout<<"a"<<endl; return 0;修
15、改程序之后,每一个进程循环显示一句话#include<iostream>using namespace std;int main() int p1,p2; p1=fork();/获得fork()函数返回值赋给P1 if(p1=0) for(int i=0;i<3;i+) cout<<"daughter"<<i<<endl; cout<<"b"<<endl; else if(p1>0) p2=fork(); if(p2=0) for(int i=0;i<3;i+) c
16、out<<"son"<<i<<endl; cout<<"c"<<endl; else if(p2>0) for(int i=0;i<3;i+) cout<<"parent"<<i<<endl; cout<<"a"<<endl; return 0; 在程序中使用调用lockf()来给每一个子进程加锁#include<iostream>using namespace std;i
17、nt main() int p1,p2; p1=fork();/获得fork()函数返回值赋给P1 if(p1=0) lockf(1,1,0);/ 加锁 for(int i=0;i<3;i+) cout<<"daughter"<<i<<endl; cout<<"b"<<endl; lockf(1,0,0);/解锁 else if(p1>0) p2=fork(); if(p2=0) lockf(1,1,0);/ 加锁 for(int i=0;i<3;i+) cout<<
18、;"son"<<i<<endl; cout<<"c"<<endl; lockf(1,0,0);/解锁 else if(p2>0) for(int i=0;i<3;i+) cout<<"parent"<<i<<endl; cout<<"a"<<endl; return 0; 3 函数调用关系图函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);sca
19、nf ("%d",&b);都是以函数语句的方式调用函数。函数作为另一个函数调用的实际出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。 函数调用关系图如下:P1=fork(),p2=fork()
20、;P1=0P1>0Cout<<”a”P2=0P2>0Cout<<”c”Cout<<”a” 图3.1函数调用关系图 使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。 如在所有函数定义之前,在函数外预先
21、说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。4 结果分析(1) 使用系统调用fork( )创建两个子进程的程序的调试结果: 在打开cygwin软件以后,先输入文件所在位置,如下面图中所示“cd f:/cygwin”以后,按回车,在系统弹出的输入栏里再输入“g+ create.cpp -o create”后,再次回车,然后继续在输入栏里输入”./creat.exe”后,便得到调试结果,重复输入,可以得到不同的结果数据,如下图所示: 图4.1第一次执行结果 图4.2第二次执行结果 由上面的两个图可以看出来由于程序的并发执行,同一个程序运行的结果会有所区别。(2) 修改程序
22、之后,同一个程序运行的结果会有所区别。 在打开cygwin软件以后,先输入文件所在位置,如下面图中所示“cd f:/cygwin”以后,按回车,在系统弹出的输入栏里再输入“g+ xiugai.cpp -o xiugai”后,再次回车,然后继续在输入栏里输入”./xiugai.exe”后,便得到调试结果,重复输入,可以得到不同的结果数据,如下图所示: 图4.4修改后第一次执行结果 图4.5修改后第二次执行结果 图4.6修改后第三次执行结果(3) 在程序中使用调用lockf()来给每一个子进程加锁的调试结果: 在打开cygwin软件以后,先输入文件所在位置,如下面图中所示“cd f:/cygwin
23、”以后,按回车,在系统弹出的输入栏里再输入“g+ jiasuo.cpp -o jiasuo”后,再次回车,然后继续在输入栏里输入”./jiasuo.exe”后,便得到调试结果,重复输入,可以得到不同的结果数据,如下图所示: 图4.7加锁后第一次执行结果 图4.8加锁后第二次执行结果 由上面的运行结果可以看出在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥。5 结论 经过两周的课程设计生活,从一开始拿到题目到后来的分析,构思,完成设计,这一系列的工作让我受益匪浅。并且通过本学期的操作系统的学习以及这次课程设计,我对操作系统的理解和操作都有了比较大的进步。通过这次课程设计
24、,让我明白了怎样创建一个进程。经两个星期的学习,我对进程管理中的相关内容进一步的了解了,也更近一步的加深了对编程的理解。知道了自己的不足。 通过这次实验,让我明白了怎样创建一个进程,以及如何使用系统调用来调用fork()函数,当fork()的返回值为0的时候表示当前进程是子进程,当fork()函数的返回值是大于0的时候表示当前进程是父进程,当fork()返回值是-1的时候表示创建进程失败。通过实验使我见到了由于程序的并发执行,同一个程序运行的结果会有所区别;并且知道了使用调用lockf()来给每一个子进程加锁,来实现进程之间的互斥。更重要的是通过这次实验使我学会了如何在linux的环境下使用g
25、cc、gdb来编辑和编译程序。总之通过这次上机实验让我学到了许多书本上面学不到的知识,锻炼了自己的动手能力和编程的能力。通过该题目的设计过程,我明白了自己的不足我更加努力,争取在毕业时达到步入社会的要求。为自己的未来打好基础。 同时加深了我对进程创建的理解 ,更加理解了课程设计的重要意义,我知道了,只有将自己的理论与实际相结合,才能更好的将所学的知识应用于实践,加深自己的理解,更好的理解操作系统的深刻内涵。通过这一次的课程设计,我不仅仅学到了专业知识,更使我懂得如何做事。其实每一次的课程设计都是在教会我怎么样做事情,它告诉我完成一件事情,光靠团队的人数是没有任何优势的,关键在于团队之中是否有优
26、秀的骨干去引领这个团队完成这件事情。但可惜的是,每次都没有,而本来并不优秀也不是骨干的我无奈成为了矮子军里的姚明,我只好在无限的感慨中奋力完成课程报告。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不
27、可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可。我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 参考文献1汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社,2001.2王清,李光明.计算机操作系
28、统.冶金工业出版社,2003.3孙钟秀等. 操作系统教程. 高等教育出版社,2003.4曾明.Linux操作系统应用教程. 陕西科学技术出版社,2005. 5张丽芬,刘利雄.操作系统实验教程. 清华大学出版社,2006.6孟静,操作系统教程原理和实例分析. 高等教育出版社,2000.7周长林,计算机操作系统教程. 高等教育出版社,2011.8张尧学,计算机操作系统教程,清华大学出版社,2000.9任满杰,操作系统原理实用教程,电子工业出版社,2006.10张坤.操作系统实验教程,清华大学出版社,2006. 致 谢在这次课程设计中,虽然只有短短的两周时间,却让我学会了很多东西。使得我们将之前的理
29、论知识运用与实践中,从开始一无所知到能够看懂并且理解程序,对操作系统的更进一步的巩固以及对进程的概念也有了更深刻的理解。对操作系统中进程的创建的基本概念、工作原理以及设计方法进行了更深入的学习和了解。这次课程设计使我学到了很多东西,真正做到了理论与实践相结合,得到了软件工程的综合训练,大大地提高了解决实际问题的能力。当然,这与老师的指导和同学们的帮助是分不开的。在此我要诚心感谢老师的耐心指导。在整个设计过程当中给我提出了很多意见,并指出了许多错误和不足之处,使我受益匪浅。为她付出了个人的宝贵时间来辅导我们而表示忠心的感谢!还要感谢我们班的同学,他们在这次设计当中给了我很多帮助,没有他的帮助这次
30、的课设是不可能顺利完成的。附 录源程序代码如下1使用系统调用fork( )创建两个子进程的程序清单:#include <iostream>#include <unistd.h>using namespace std;int main() int p1,p2; p1=fork(); if(p1=0) cout<<"b"<<endl; else if(p1>0) p2=fork(); if(p2=0) cout<<"c"<<endl; else if(p2>0) cout<<"a"<<endl; return 0;2修改程序之后,每一个进程循环显示一句话的程序清单:#include<iostream>using namespace std;int main() int p1,p2; p1=fork();/获得fork()函数返回值赋给P1 if(p1=0) for(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年市政工程计划与管理试题及答案
- 经济法考试技巧与试题及答案
- (高清版)DB35∕T 2228-2024 科技成果转化效果评估导则
- 2025-2030年隐形眼镜护理液行业市场深度调研及发展前景趋势与投融资研究报告
- 2025-2030年辅助护肝食品行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年眼镜行业市场发展现状及竞争格局与投资价值研究报告
- 2025年中级经济师的工程经济学试题及答案
- 2025年中级经济师重点试题及答案
- 2025-2030年牛皮纸市场市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年标示牌市场发展现状分析及行业投资战略研究报告
- 硕士外语水平考试指南与答案
- 2025年福建省三明市中考二模生物试题(原卷版+解析版)
- 完形填空15篇(答案解析)-2025年中考英语分类专练(深圳专用)
- 2025年事业单位e类考试真题及答案
- 2025-2030中国印度醋栗提取行业市场发展趋势与前景展望战略研究报告
- 《急性冠状动脉综合征》课件
- 2025北京各区高三一模数学分类汇编解析 答案
- 第18课《井冈翠竹》 课件
- 2024年陕西氢能产业发展有限公司所属单位招聘笔试真题
- 奶茶饮品采购合同协议
- (四调)武汉市2025届高中毕业生四月调研考试 英语试卷
评论
0/150
提交评论