进程的创建实验报告
操作系统实验报告--进程的创建
{
printf("父进程id=%d,父进程打印a\n",getpid());
exit(0);
}
}
随机执行:
程序执行如下:
1.父进程里的fork调用,复制父进程生成一个副本即为子进程1
2.得到父进程与子进程1
3.随机执行这两进程中的一个,(两个进程都是压在栈里)
4.假设(那么栈底下的就是父进程)执行的是子进程1,则fork返回值是0,则for循环中断!这是也是子进程不能创建自己的子子进程的一个重点!i=0,往下继续执行当前进程的后面的程序,打印当前子进程1的信息,并且按照要求打印出b。这个进程执行完毕后自动销毁!
printf("\n开始调用fork函数:\n如果调用成功应该会生成一个子进程1\n返回值: 若成功调用一次则返回两个值,\n子进程返回0,父进程返回子进程标记(ID);\n否则,出错返回-1。\n");
fpid1=fork();
fpid2=fork();
if(fpid1<0)exit(0);
else if(fpid1>0)
{
break;
}
}
if(pid==-1)
{
perror("fail to fork!\n");
exit(1);
}
else if(pid==0)
{
printf("子进程%did=%d,打印%c,其对应的父进程id=%d\n",i+1,getpid(),98+i,getppid());
exit(0);
}
源代码:
#include<stdio.h>
#include<unistd.h>
进程的创建实验报告
进程的创建实验报告进程的创建实验报告引言:在计算机科学领域中,进程是一个非常重要的概念。
进程是计算机程序的执行实例,它具有独立的内存空间和执行环境。
进程的创建是操作系统中一个关键的操作,本实验旨在通过编写一个简单的程序来演示进程的创建过程。
实验目的:通过实验,我们的目标是深入理解进程的创建过程,并了解操作系统是如何管理进程的。
实验步骤:1. 引入必要的头文件:在开始编写代码之前,我们需要引入一些必要的头文件。
这些头文件包括<sys/types.h>、<sys/wait.h>和<unistd.h>。
这些头文件提供了创建进程所需的函数和数据类型。
2. 创建一个子进程:在主程序中,我们使用fork()函数来创建一个子进程。
fork()函数会在当前进程的基础上创建一个新的进程,这个新进程称为子进程。
子进程和父进程几乎完全相同,只有在返回值上有所区别。
如果fork()函数返回0,表示当前进程是子进程;如果返回一个正整数,表示当前进程是父进程。
3. 子进程的执行:在子进程中,我们可以编写任意的代码来执行特定的任务。
子进程可以使用exec()函数来执行其他程序,或者执行一系列的操作。
在本实验中,我们简单地输出一条信息,以展示子进程的执行过程。
4. 父进程的执行:在父进程中,我们可以编写代码来执行其他任务,或者等待子进程的结束。
在本实验中,我们使用wait()函数来等待子进程的结束。
wait()函数会暂停父进程的执行,直到子进程结束为止。
5. 编译和运行程序:在完成代码编写后,我们需要将程序编译成可执行文件,并运行它。
我们可以使用gcc编译器来编译程序,然后运行生成的可执行文件。
实验结果:在运行程序后,我们可以观察到以下结果:子进程开始执行。
父进程等待子进程结束。
子进程结束。
父进程继续执行。
结论:通过本实验,我们成功地演示了进程的创建过程。
我们了解了操作系统是如何管理进程,并且掌握了使用fork()函数来创建子进程的方法。
操作系统实验二实验报告
操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
实验一进程的创建
实验⼀进程的创建集美⼤学计算机⼯程学院实验报告课程名称:操作系统班级:计算1014指导教师:李传⽬姓名:实验项⽬编号:实验⼀学号:实验项⽬名称:进程的创建实验成绩:实验(⼀)进程的创建1.实验⽬的1、掌握进程的概念,明确进程的含义2、认识并了解并发执⾏的实质2. 实验内容1、编写⼀段程序,使⽤系统调⽤fork( )创建两个⼦进程。
当此程序运⾏时,在系统中有⼀个⽗进程和两个⼦进程活动。
让每⼀个进程在屏幕上显⽰⼀个字符:⽗进程显⽰'a',⼦进程分别显⽰字符'b'和字符'c'。
试观察记录屏幕上的显⽰结果,并分析原因。
2、修改上述程序,每⼀个进程循环显⽰⼀句话。
⼦进程显⽰'daughter …'及'son ……',⽗进程显⽰'parent ……',观察结果,分析原因。
3. 实验准备(1)⽹上查找资料,了解⽤fork创建进程的过程。
4. 参考程序程序1:1 #include ""stdio.h "23 int main()4 {5 fork();6 printf("hello!\n");7 exit(0);8 }打印(2个)hellohello*************222222222***************** 程序2:1 #include ""stdio.h "23 int main()4 {5 fork();6 fork();7 printf("hello!\n");8 exit(0);9 }打印(4个)hellohellohellohello*************3333***************** 程序3:1 #include ""stdio.h "23 int main()4 {5 fork();6 fork();7 fork();8 printf("hello!\n");9 exit(0);10 }打印(8个)hellohello::hellohellohellohellohellohello******************************程序4:1 试观察记录屏幕上的显⽰结果,并分析原因。
操作系统进程的创建实验报告
分析main()函数流程图如下:
三、.思考题
1)进程创建的核心内容是什么?
答:内容是:1、申请空白PCB 2、为新进程分配资源
3、初始化进程控制块4、将新进程插入到就绪队列
2)该设计和实际的操作系统进程创建相比,缺少了哪些步骤?
答缺少的步骤有:只是模拟的创建,并没有分配资源
只是模拟的创建并没有分配资源四实验总结通过本次实验让我对进程的创建有更深的理解是我真真切切的理解到进程和程序的本质区别
一、实验内容
树形图1:
树形图1分析:进程1、2、3是根进程的子进程,相反的根进程是进程1、2、3的父进程,他们分别对应的优先级为2、2、2;接下来进程4、5又是进程1的子进程,进程6、7是进程2的子进程,进程8是进程3的子进程。
四、实验总结
通过本次实验,让我对进程的创建有更深的理解,是我真真切切的理解到进程和程序的本质区别。学会了如何使用基本命令进行调试和运行程序。总之这让我受益非浅。
各个方面都很符合要求,完成很好,体会写得很深入,继续努力ing。
输入如下:
createpc(1,0,2)
createpc(2,0,2)
createpc(3,0,2)
createpc(4,2,3)
createpc(5,2,3)
createpc(6,2,3)
createpc(7,5,3)
createpc(8,5,3)
运行截图如下:
二、函数分析:
分析createpc(para)函数流程图如下:
输入如下:
createpc(1,0,2)
createpc(2,0,2)
createpc(3,0,2)
createpc(4,0,2)
进程创建实验报告
进程创建实验报告进程创建实验报告引言:进程是计算机系统中的基本概念之一,也是操作系统的核心概念之一。
进程创建是操作系统中的一个重要操作,它涉及到资源的分配和管理,对于操作系统的正常运行具有重要意义。
本实验旨在通过编写一个简单的程序,探索进程创建的过程以及相关概念。
一、实验目的本实验的主要目的是了解进程创建的基本过程,并掌握相关的概念和操作。
通过实践,加深对操作系统的理解和应用。
二、实验环境本实验使用的是Linux操作系统,具体的版本为Ubuntu 20.04 LTS。
在该环境下,我们可以使用C语言编写程序,并通过gcc编译器进行编译和运行。
三、实验步骤1. 编写源代码首先,我们需要编写一个简单的C语言程序,用于创建一个新的进程。
在程序中,我们可以使用fork()函数来创建新的进程。
具体的代码如下:```c#include <stdio.h>#include <unistd.h>int main() {pid_t pid;pid = fork();if (pid < 0) {printf("Failed to create a new process.\n");} else if (pid == 0) {printf("This is the child process.\n");} else {printf("This is the parent process.\n");}return 0;}```2. 编译和运行程序在终端中,使用gcc编译器将源代码编译为可执行文件。
具体的命令如下:```shellgcc -o process_create process_create.c```编译成功后,我们可以通过运行可执行文件来创建新的进程。
具体的命令如下:```shell./process_create```3. 观察输出结果运行程序后,我们可以观察到输出结果。
进程的创建 操作系统实验报告
进程的创建
一.实验目的
1、掌握进程的概念,明确进程的含义。
2、认识并了解并发执行的实质。
二.实验内容
编写一段程序,使用系统调用fork( )创建一个子进程。
当此程序运行时,在系统中有一个父进程和一个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程显示字符'b'。
试观察记录屏幕上的显示结果,并分析原因。
三.实验过程及结果
1.打开centos,在文档中输入创建进程的代码。
图1 代码界面
2.在桌面上右击,在下拉列表中选择Open in Terminal,打开控制台,然后输入编译和运行的命令,当输入编译命令的时候,桌面会生成一个a.out的文件。
图2 编译界面
3.当输入运行命令,就会显示出结果了
图3 最终结果
四.实验小结
1.代码在执行的时候,就创建了一个进程,此时的进程是父进程。
2.当代码执行到fork()函数时,就创建了一个子进程,因为子进程是继承父进程的,所以他们的内容基本上是一样的。
3.可以看到,在最后输入运行命令时,同时跳出两个结果,证明了进程是并发执行的。
4.对于进程的定义,从不同的角度有不同的定义,较典型的有:进程是程序的一次执行,进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位等。
5.并发执行就是指两个或者多个事件在同一时间间隔内发生。
创建进程的实验报告
一、实验目的1. 理解进程的概念和特点。
2. 掌握创建进程的方法和过程。
3. 熟悉进程调度和同步机制。
4. 分析进程创建过程中可能遇到的问题及解决方法。
二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发工具:Visual Studio 2019三、实验原理进程是操作系统中进行资源分配和调度的基本单位。
创建进程是操作系统提供的一项基本功能,它允许用户在系统中启动新的程序。
在创建进程的过程中,操作系统会为进程分配一定的资源,如内存、文件句柄等。
四、实验内容1. 创建进程2. 父子进程的同步3. 进程的终止五、实验步骤1. 创建进程(1)编写C/C++程序,使用系统调用创建进程。
(2)父进程调用`fork()`函数创建子进程。
(3)在子进程中执行特定任务。
(4)父进程和子进程分别调用`wait()`函数等待对方结束。
2. 父子进程的同步(1)父进程和子进程使用信号量实现同步。
(2)父进程调用`sem_wait()`函数等待信号量。
(3)子进程调用`sem_post()`函数释放信号量。
3. 进程的终止(1)父进程调用`kill()`函数终止子进程。
(2)子进程调用`exit()`函数结束进程。
六、实验结果与分析1. 创建进程(1)在父进程中调用`fork()`函数创建子进程。
(2)父进程和子进程分别输出“父进程”和“子进程”信息。
实验结果:```父进程子进程```2. 父子进程的同步(1)父进程和子进程使用信号量实现同步。
(2)父进程调用`sem_wait()`函数等待信号量。
(3)子进程调用`sem_post()`函数释放信号量。
实验结果:```父进程子进程```3. 进程的终止(1)父进程调用`kill()`函数终止子进程。
(2)子进程调用`exit()`函数结束进程。
实验结果:```父进程子进程```七、实验总结通过本次实验,我们掌握了以下内容:1. 进程的概念和特点。
实验一进程创建 Linux实验报告
实验一进程创建【实验目的和要求】1、1.了解进程的概念及意义;2.了解子进程和父进程;3.掌握创建进程的方法。
【实验内容】1、1.子进程和父进程的创建;2.编写附件中的程序实例;3.撰写实验报告。
【实验原理】1、原型:#include <unistd.h>pid_t fork(void);在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。
新进程为子进程,而原进程为父进程。
fork函数创建子进程的过程为:使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。
通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。
子进程和父进程继续执行fork调用之后的指令。
子进程是父进程的副本。
例如,子进程获得父进程数据空间、堆和栈的副本。
注意,这是子进程所有用的副本。
父进程和子进程并不共享这些存储空间部分。
父进程和子进程共享正文段。
2、原型:#include <unistd.h>pid_t vfork(void);vfork函数的调用序列和返回值与fork相同,但两者的语义不同。
vfork函数用于创建一个新进程,而该进程的目的是exec一个新程序。
vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,它在父进程的空间中运行。
vfork保证子进程先运行,在它调用exit之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。
操作系统实验三实验报告
(一)进程创建
编写程序实现创建多个进程,并观察进程的执行情况。通过调用Windows API函数`CreateProcess`来创建新的进程。在创建进程时,设置不同的参数,如进程的优先级、命令行参数等,观察这些参数对进程执行的影响。
(二)进程控制
实现对进程的暂停、恢复和终止操作。使用`SuspendThread`和`ResumeThread`函数来暂停和恢复进程中的线程,使用`TerminateProcess`函数来终止进程。通过控制进程的执行状态,观察系统的资源使用情况和进程的响应。
(一)进程创建实验结果与分析
创建多个进程后,通过任务管理器观察到新创建的进程在系统中运行。不同的进程优先级设置对进程的CPU占用和响应时间产生了明显的影响。高优先级的进程能够更快地获得CPU资源,执行速度相对较快;而低优先级的进程则在CPU资源竞争中处于劣势,可能会出现短暂的卡顿或计一个多进程同步的程序,使用信号量、互斥量等同步机制来协调多个进程的执行。例如,实现一个生产者消费者问题,多个生产者进程和消费者进程通过共享缓冲区进行数据交换,使用同步机制来保证数据的一致性和正确性。
四、实验步骤
(一)进程创建实验步骤
1、打开Visual Studio 2019,创建一个新的C++控制台应用程序项目。
六、实验中遇到的问题及解决方法
(一)进程创建失败
在创建进程时,可能会由于参数设置不正确或系统资源不足等原因导致创建失败。通过仔细检查参数的设置,确保命令行参数、环境变量等的正确性,并释放不必要的系统资源,解决了创建失败的问题。
(二)线程控制异常
在暂停和恢复线程时,可能会出现线程状态不一致或死锁等异常情况。通过合理的线程同步和错误处理机制,避免了这些异常的发生。在代码中添加了对线程状态的判断和异常处理的代码,保证了线程控制的稳定性和可靠性。
进程创建模拟实验报告
进程创建模拟实验报告
一.实验目的
1.加深对进程概念的理解,明确进程和程序的区别。
2.深入了解系统如何组织进程,创建进程。
3.掌握进程相关数据结构。
二.实验要求
1.编写程序完成实验内容
2.对测试数据进行分析
3.撰写实验报告
三.实验内容
1.进程的创建
2.对代码进行测试
3.进程控制
四.实验原理
1.进程
(1)进程是程序是一次执行
(2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动(3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
2.进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个进程控制块(PCB),它是进程实体的一部分,是操作系统管理进程最重要
的数据结构。
其主要包含四类信息:进程标识符,处理机状态,进程调度信息,进程控制信息。
3.进程创建流程
(1)申请空白PCB
(2)为新进程分配资源
(3)初始化进程控制块
(4)将新进程插入就绪队列
4.进程树
P1
P2 P3 P4 P5
P6 P7 P8 P9 P10 P11
P12
五.实验步骤
1.在C++环境下输入实验提供的代码,并对程序运行
2.输入createpc 命令创建进程,输入showdetail 显示每个进程及其子进程的信息
3.对代码进行测试
六.实验总结
1.运行结果
2.解释函数
3.问题解答。
进程的创建实验报告
操作系统实验报告哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称进程的创建2. 实验目的(1)练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
(2)调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
3. 实验类型验证性实验4. 实验内容二、实验环境EOS操作系统三、实验过程1. 设计思路和流程图2.算法实现3.需要解决的问题及解答(1)在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。
提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
答:后文中,有此题解决方案。
(2)尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。
(3)在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。
能够交换这些函数被调用的顺序吗?思考其中的原因。
答:PspCreateProcessEnvironment的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。
PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。
PspCreateThread创建了进程的主线程。
这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。
进程创建实验报告
进程创建实验报告第一篇:进程创建实验报告实验二进程的创建一、实验目的熟悉进程的创建过程,了解系统调用函数fork()和 execl()。
二、实验内容1、阅读实例代码fork1,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握系统调用fork()的用法,返回值的意义。
2、阅读实例代码fork2,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握在程序中运行一个操作系统命令和运行一个程序的方法。
3、修改fork2,使之能把运行的命令和程序作为参数传给fork2。
三、设计思想1、程序框架pid =-1 pid = 0 pid > 02、用到的文件系统调用函数 fork()和 execl()四、调试过程1、测试数据设计(1)fork1 命名程序1:编写程序1:编译程序1:运行程序1:(2)fork2 编写程序2:运行程序2:(3)修改fork2 编写修改程序2:修改后的运行结果:2、测试结果分析(1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child.I’m the parent.第二次,执行父进程的时候,返回的是子进程的进程号pid > 0,即pid的值仍然不为-1,所以又输出了一次I’m the child.I’m the parent。
(2)对于程序2:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid > 0,所以输出I’m the parent.Program end.当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child.并调用了execl()函数,查看了指定路径中的文件。
操作系统实验报告(进程的创建)范文
实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。
2、了解进程间的调用以及实现。
3、分析进程竞争资源的现象,学习解决互斥的方法。
4、加深对进程概念的理解,认识并发执行的本质。
二.实验环境Windows 系统的计算机一台,安装了Linux虚拟机三、实验内容与步骤1、fork()系统调用的使用例子程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;printf("before fork();glod=%d,loc=%d.\n",glob,loc);if((pid=fork())<0){printf("fork() error. \n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes glob and loc: \n");}elsewait(0);printf("parent process doesn't change the glob and loc:\n");printf("glob=%d,loc=%d\n",glob,loc);exit(0);}运行结果:2、理解vofork()调用:程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;if((pid=vfork())<0){printf("vfork() error\n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes the glob and loc\n");exit(0);}elseprintf ("parent process doesn't change the glob and loc\n");printf("glob=%d,val=%d\n",glob,loc);}运行结果:3、给进程指定一个新的运行程序的函数exec().程序代码:printe1.c代码:#include<stdio.h>int main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}file4.c代码如下:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>char * env_list[]={"USER=root","PATH=/root/",NULL};int main(){pid_t pid;if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execle("/root/print1","print1","arg1","arg2",(char *)0,env_list)<0) printf("execle error!\n");exit(0);}if((waitpid(pid,NULL,0))<0)printf("WAIT ERROR!\n");exit(0);if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execlp("print1","print1","arg1",(char *)0)<0)printf("execle error!\n");exit(0);}exit(0);}运行结果:4、进程终止函数exit()。
进程创建实验报告范文-图文
进程创建实验报告范文-图文(计算机学院)课内实验报告实验名称:进程管理-进程调度专业名称计算机科学与技术班级:学生姓名:学号(8位)指导教师:实验日期:一.实验目的及实验环境1.实验目的通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSI某规范中fork和kill系统调用的功能和使用。
2.实验环境(1)硬件显示器:NVIDIAGeForceGT某850M硬盘空间:1.0TB(2)软件虚拟机名称及版本:VM12.0操作系统名称及版本:Cento6.7编译器:GCC二.实验内容1、实验前准备工作根据下发的Linu某进程管理实验PPT内容,将实验代码补充完整。
并考虑:先猜想一下这个程序的运行结果。
假如运行“./proce20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。
可以多运行一会儿,并在此期间启动、关闭一些其它进程,看proce的输出结果有什么特点,记录下这个结果。
开另一个终端窗口,运行“pau某|grepproce”命令,看看proce究竟启动了多少个进程。
回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。
按q退出程序再看进程情况。
3、回答问题编写、编译、链接、执行实验内容设计中的代码,并回答如下问题:1)你最初认为运行结果会怎么样?答:子进程按序号输出。
2)实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
答:子进程基本按序号输出,但有几个顺序错误,可能是某些子进程执行太快,抢占资源,导致顺序错误。
3)proc_number这个全局变量在各个子进程里的值相同吗?为什么?答:相同,因为全局变量是共享资源,所以值相同。
4)kill命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?杀死,不会出现在主进程中,第二次是杀死本组全部子进程,杀死后程序只剩主进程。
5)使用kill命令可以在进程的外部杀死进程。
模拟进程创建实验报告(3篇)
第1篇一、实验目的1. 理解进程的概念和进程创建的基本原理。
2. 掌握使用C语言模拟进程创建的方法。
3. 熟悉进程的属性和进程之间的通信机制。
4. 分析实验结果,加深对进程管理的理解。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019三、实验原理进程是计算机中程序执行的基本单位,是操作系统进行资源分配和调度的一个独立单位。
进程创建是操作系统的一个重要功能,它负责为进程分配必要的资源,并建立进程控制块(PCB)。
在模拟进程创建实验中,我们将使用C语言编写程序,模拟进程的创建、运行和销毁过程。
通过模拟进程的创建,我们可以了解进程的基本属性,如进程ID、进程状态、父进程ID等。
四、实验步骤1. 定义进程结构体,包含进程的基本属性,如进程ID、进程状态、父进程ID等。
```ctypedef struct {int pid; // 进程IDint state; // 进程状态int parent_pid; // 父进程ID// 其他属性} Process;```2. 编写进程创建函数,用于创建新进程。
```cProcess create_process(int parent_pid) {Process new_process;new_process.pid = ...; // 分配进程IDnew_process.state = ...; // 设置进程状态 new_process.parent_pid = parent_pid;// 设置其他属性return new_process;}```3. 编写进程运行函数,用于模拟进程的运行过程。
```cvoid run_process(Process p) {// 模拟进程运行过程// ...}```4. 编写进程销毁函数,用于销毁进程。
```cvoid destroy_process(Process p) {// 销毁进程资源// ...}```5. 编写主函数,模拟进程创建、运行和销毁过程。
进程创建的实验报告
一、实验目的1. 理解进程的概念及其在操作系统中扮演的角色。
2. 掌握进程创建的基本原理和过程。
3. 学习使用编程语言实现进程的创建和基本管理。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019三、实验原理进程是操作系统中执行的基本单元,是系统进行资源分配和调度的基本单位。
进程创建是指操作系统创建一个新的进程,使其从无到有,成为系统中的一个可执行实体。
进程创建的基本原理如下:1. 系统为进程分配必要的资源,如内存、CPU时间等。
2. 创建进程控制块(PCB),记录进程的基本信息。
3. 将进程插入到进程队列中,等待调度。
四、实验内容1. 创建一个名为“HelloWorld”的进程,该进程在执行时打印“Hello, World!”。
2. 研究进程创建的过程,分析进程控制块(PCB)的结构。
3. 使用编程实现进程的创建、调度和销毁。
五、实验步骤1. 创建一个新的C语言项目,命名为“进程创建实验”。
2. 在主函数中,使用系统调用创建一个新的进程。
3. 编写进程函数,实现打印“Hello, World!”的功能。
4. 编写进程的调度函数,实现进程的创建、调度和销毁。
5. 编译并运行程序,观察进程创建和执行过程。
六、实验代码```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>// 进程函数void processFunc() {printf("Hello, World!\n");}int main() {pid_t pid;pid = fork(); // 创建子进程if (pid == -1) {// 创建进程失败perror("fork");exit(1);} else if (pid == 0) {// 子进程processFunc();exit(0);} else {// 父进程wait(NULL); // 等待子进程结束printf("子进程结束,PID:%d\n", pid);}return 0;}```七、实验结果与分析1. 编译并运行程序,观察进程创建和执行过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
哈尔滨工程大学
计算机科学与技术学院
一、实验概述
1. 实验名称
进程的创建
2. 实验目的
(1)练习使用EOS API 函数CreateProcess 创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
(2)调试跟踪CreateProcess 函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。
3. 实验类型
验证性实验
4. 实验内容
二、实验环境
EOS 操作系统
三、实验过程 1. 设计思路和流程图
2. 算法实现
3. 需要解决的问题及解答
(1)在源代码文件提供的源代码基础上进行修改,要求使用同时创建10个进程。
提示:可以使用PROCESS_INFORMATION 类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
答:后文中,有此题解决方案。
(2)尝试根据之前对PsCreateProcess 函数和PspCreateProcessEnvironment 函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。
(3)在PsCreateProcess 函数中调用了PspCreateProcessEnvironment 函数后又先后调用了PspLoadProcessImage 和PspCreateThread 函数,学习这些函数的主要功能。
能够交换这些函数被调用的顺序吗?思考其中的原因。
答:PspCreateProcessEnvironment 的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。
PspLoadProcessImage 是将进程的可执行映像加载到了进程的地址空间中。
PspCreateThread 创建了进程的主线程。
这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。
因此不能交换他们的顺序。
准备实调试PsCreateProcess 函数: ①调试进程控制块的创建过程
调试练习使用控制台命令创练习通过编程的方式让应用程序创建另一个应用程序的进程
4.主要数据结构、实现代码及其说明
主要使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
5.源程序并附上注释
使用同时创建10个进程的原代码及注释如下:
#include ""
.\n\n");
rocessHandle, INFINITE);
rocessHandle, &ulExitCode);
printf("\nThe process %d exit with %d.\n",j,ulExitCode);
rocessHandle);
CloseHandle(ProcInfo[j].ThreadHandle);
}
printf("CreateProcess Failed, Error code: 0x%X.\n", GetLastError());
nResult = 1;
return nResult;
}
for(i = 0; i < 10; i++){
rocessHandle, INFINITE);
rocessHandle, &ulExitCode);
}
for( i =0 ; i < 10; i++){
printf("\nThe process %d exit with %d.\n",i,ulExitCode);
rocessHandle);
CloseHandle(ProcInfo[i].ThreadHandle);
}
return nResult;
}
6. 程序运行时的初值和运行结果
a.使用控制台命令创建EOS应用程序进程
b.查看应用程序创建另一个应用程序的进程的执行结果:
c.调试进程控制块的创建过程
将鼠标移动到“监视”窗口中此表达式的“值”属性上,会弹出一个临时窗口,在临时窗口中会按照进程控制块的结构显示各个成员变量的值(可以参考PROCESS结构体的定义)。
由于只是新建了进程控制块,还没有初始化其中成员变量,所以值都为0。
d.接下来调试初始化进程控制块中各个成员变量的过程:
1.创建进程的地址空间,即4G虚拟地址空间。
在代码行(文件的第437行)NewProcess->Pas = MmCreateProcessAddressSpace(); 添加一个断点。
2.按F5继续调试,到此断点处中断。
3.按F10执行此行代码后中断。
4.在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。
说明已经初始化了进程的4G虚拟地址空间。
使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值结果如下:
e.要求使用同时创建10个进程
四、实验体会
本实验主要的问题就是用同时创建10个进程:因为编程基础不好,刚开始的程序很难通过编译.最后使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。
使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。
并对细节做了部分修正才成功。