实验一-进程控制实验
- 格式:doc
- 大小:95.00 KB
- 文档页数:10
c语言实现进程控制的实验原理进程控制是操作系统中非常重要的一个概念,它涉及到对进程的创建、终止、挂起、恢复等操作。
本文将以C语言为例,介绍进程控制的实验原理。
一、进程控制的基本概念进程是计算机系统中正在运行的程序的实例。
操作系统通过进程控制来管理和控制进程的运行。
进程控制的基本概念包括进程创建、进程终止、进程挂起和进程恢复等。
1. 进程创建进程的创建是指在操作系统中创建一个新的进程。
在C语言中,可以使用fork()函数来创建一个新的进程。
fork()函数会创建一个子进程,子进程是父进程的一个副本,它们共享代码段、数据段和堆栈段。
子进程的代码从fork()函数之后开始执行,而父进程的代码继续执行。
通过判断fork()函数的返回值,可以确定当前是在父进程还是子进程中。
2. 进程终止进程的终止是指进程的执行结束或被强制终止。
在C语言中,可以使用exit()函数来终止当前进程的执行。
exit()函数会将进程的退出状态传递给父进程,并释放进程所占用的系统资源。
3. 进程挂起和恢复进程的挂起是指将一个正在运行的进程暂停执行,而进程的恢复是指将一个挂起的进程重新开始执行。
在C语言中,可以使用sleep()函数来使进程挂起一段时间。
sleep()函数会暂停当前进程的执行,直到指定的时间过去。
而进程的恢复可以通过设置一个定时器来实现,当定时器时间到达时,进程将恢复执行。
二、进程控制的实验原理为了更好地理解进程控制的原理,我们可以通过一个简单的实验来进行演示。
我们创建一个C语言程序,其中包含一个主进程和一个子进程。
主进程负责创建子进程,并通过信号机制来控制子进程的挂起和恢复。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>// 子进程的处理函数void child_process(){printf("Child process starts running.\n");sleep(5);printf("Child process finishes.\n");exit(0);}int main(){pid_t pid;// 创建子进程pid = fork();if (pid < 0){printf("Failed to create child process.\n"); return -1;}else if (pid == 0){// 子进程child_process();}else{// 父进程printf("Parent process starts running.\n");// 等待子进程运行5秒后发送SIGSTOP信号,使其挂起sleep(5);printf("Parent process sends SIGSTOP signal.\n");kill(pid, SIGSTOP);// 等待2秒后发送SIGCONT信号,使子进程恢复执行sleep(2);printf("Parent process sends SIGCONT signal.\n");kill(pid, SIGCONT);// 等待子进程结束wait(NULL);printf("Parent process finishes.\n");}return 0;}```在上面的代码中,我们首先使用fork()函数创建了一个子进程。
测试过程: (实验中出现的问题、错误、解决方法)创建好项目和文件, 对文件进行编译和运行, 编译没有错误, 但是运行总是提示有2个错误。
解决办法:在新建项目的时候“新建”, 然后新建文件, 程序就可以正常的运行了。
实验总结:1、课下没有对Microsoft Visual c++ 6.0进行深入的研究, 还是好多问题不知道怎么解决, 好好钻研一下这个很有必要的啊!评语与成绩:教师签名:年月日实验名称进程控制实验类型验证性实验时间实验环境Windows xp 、Microsoft Visual c++ 6.0实验目的与要求:1.通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作, 进一步熟悉操作系统的进程概念, 理解Windows 2000进程的“一生”。
2.通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
实验内容:本实验给出了三段程序:创建进程、正在运行的进程和终止进程, 阅读程序回答所提问题, 分析运行结果。
一、实验步骤: (算法描述、源程序、操作步骤和方法)二、创建进程回答问题:1.该程序是一个简单使用CreateProcess()API函数的例子。
首先形成简单的命令行, 提供当前EXE文件的指定文件名和代表生成克隆进程的号码。
大多数参数都可取默认值, 但是创建标志参数使用了CREATE_NEW_CONSOLE标志, 指示新进程分配自己的控制台, 这使得运行程序时, 在任务栏上产生许多活动标记。
然后该克隆进程的创建方法关闭传递过来的句柄并返回main ()函数。
在关闭程序之前, 每一进程的执行主线程暂停一下, 以便让用户看到其中的至少一个窗口。
2、CreateProcess()函数有几个核心参数?本实验程序中设置的各个参数的值是什么?答、CreateProcess()函数有10个核心参数参数的值为: CreateProcess(szFilename, //产生这个EXE的应用程序的名称szCmdLine, //告诉其行为像一个子进程的标志NULL, //缺省的进程安全性NULL, //缺省的线程安全性FALSE, //不继承句柄CREATE_NEW_CONSOLE, //使用新的控制台NULL, //新的环境NULL, //当前目录&si, //启动信息&pi);3.程序运行时屏幕显示的信息是什么?答、三、运行进程1、回答问题:2、给出运行结果(当前PID信息、操作系统版本、系统提示信息)答、运行结果为:2.如何获得当前的PID和操作系统版本可利用GetCurrentProcessId()API函数查看系统当前进程的标识符(pid), 该pid在整个系统中都可使用。
设计一个有N个进程的进程调度程序一、实验目的通过一个简单的进程调度模拟程序的实现,加深对各种进程调度算法,进程切换的理解。
二、实验内容1、进程调度算法:采用动态最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)。
2、每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:●进程名----进程标示数ID;●优先数----Priority,优先数越大优先权越高;●到达时间----进程的到达时间为进程输入的时间;●进程还需要运行时间----AllTime,进程运行完毕AllTime =0;●已用CPU时间----CPUTime;●进程的阻塞时间StartBlock----表示当进程在运行StartBlock个时间片后,进程将进入阻塞状态;●进程的阻塞时间StartTime----表示当进程阻塞StartTime个时间片后,进程将进入就绪状态;●进程状态----State;●队列指针----Next,用来将PCB排成队列。
3、调度原则●进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间;●进程的运行时间以时间片为单位进行计算;●进程在就绪队列中带一个时间片,优先数加1;●每个进程的状态可以是就绪R(Ready)、运行R(Run)、阻塞B(Block)、或完成F(Finish)四种状态之一;●就绪进程获得CPU后都只能运行一个时间片,用已占用CPU时间加1来表示;●如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减3,然后把它插入就绪队列等待CPU;●每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查;●重复以上过程,直到所要进程都完成为止。
三、实验要求完成实验内容并写出实验报告,报告应具有以下内容:1、实验目的。
进程控制实验报告进程控制实验报告引言:进程控制是操作系统中的重要概念之一,它负责管理和调度计算机系统中的各个进程,确保它们能够按照一定的顺序和优先级进行执行。
本实验旨在通过编写一个简单的进程控制程序,加深对进程控制的理解,并探索其在实际应用中的作用。
实验目的:1. 理解进程控制的基本概念和原理;2. 掌握进程创建、终止和切换的方法;3. 熟悉进程调度算法的实现;4. 分析进程控制在实际应用中的意义和效果。
实验过程:本次实验中,我们选择使用C语言编写一个简单的进程控制程序,通过创建多个进程并进行调度,观察它们的执行顺序和状态变化。
首先,我们定义了一个进程结构体,包含进程ID、进程状态和进程优先级等信息。
然后,我们编写了创建进程的函数,通过调用系统调用接口fork()来创建新的进程,并为其分配唯一的进程ID。
在进程创建完成后,我们实现了一个简单的进程调度算法,根据进程的优先级和状态来决定下一个要执行的进程。
我们使用了优先级队列来管理进程,将优先级高的进程排在队列的前面,以确保它们能够优先执行。
接下来,我们模拟了进程的运行过程,通过设置进程的状态和优先级,来模拟进程的创建、终止和切换。
我们观察到,当一个进程被创建时,它会被添加到就绪队列中,等待系统调度执行。
当一个进程的时间片用完或者发生阻塞时,它会被暂停并切换到下一个就绪进程执行。
实验结果:通过多次运行实验程序,我们观察到进程的创建、终止和切换过程。
我们发现,进程的创建是一个相对较慢的过程,而进程的切换则非常迅速。
这是因为进程的创建需要为其分配资源和初始化环境,而进程的切换只需要保存和恢复进程的状态即可。
我们还发现,进程的优先级对于进程的执行顺序有重要影响。
当一个进程的优先级较高时,它会被优先执行,而其他进程则需要等待。
这使得系统能够根据进程的重要性和紧急程度来进行合理的调度,提高系统的效率和响应速度。
讨论与总结:进程控制是操作系统中非常重要的一部分,它负责管理和调度计算机系统中的各个进程。
《Linux 操作系统设计实践》实验一:进程管理实验目的:(1) 加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质.(3) 学习通过进程执行新的目标程序的方法。
(4) 了解Linux 系统中进程信号处理的基本原理.实验环境:Red Hat Linux实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a";子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因.程序代码:#include<stdio。
h〉int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0)putchar(’b');else{while((p2=fork())==—1);if(p2==0)putchar(’c');elseputchar(’a');}return 0;}运行结果:bca分析:第一个while里调用fork()函数一次,返回两次。
子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。
(2)进程的控制①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
程序代码:#include〈stdio。
h>int main(){int p1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1 is running!\n”);else{while((p2=fork())==—1);if(p2==0)printf(”Child2 is running!\n”);elseprintf(”Fath er is running!\n”);}return 0;}运行结果:Child1 is running!Child2 is running!Father is running!分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话.第一个while里调用fork()函数一次,返回两次。
软件学院操作系统实验报告实验题目:实验一、进程控制实验学号:日期:2013年04月12日班级:5班姓名:韩俊晓Email:实验目的:加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。
实验要求:编写一个多进程并发执行程序。
父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps命令总在ls 命令之前执行。
硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:1)与进程创建、执行有关的系统调用说明进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过exec()系统调用族装入一个新的执行程序。
父进程可以使用wait()或waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。
fork()系统调用语法:#include <unistd.h>pid_t fork(void);fork成功创建子进程后将返回子进程的进程号,不成功会返回-1. exec 系统调用有一组6个函数,其中示例实验中引用了execve 系统调用语法:#include <unistd.h>int execve(const char *path, const char *argv[], const char * envp[]); path 要装入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空). envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。
实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…r w),共有w类,每类数目为r1…r w。
随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。
建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
进程控制与进程通信程序实验报告一、引言进程是计算机系统中最基本的概念之一,是操作系统中最小的资源管理单位。
进程控制与进程通信是操作系统中重要的内容,涉及到进程的创建、调度和终止,以及进程间的信息传递和同步管理。
本实验旨在通过编写进程控制与进程通信程序,加深对操作系统中进程管理和通信机制的理解。
二、实验目的1. 理解进程的概念和特点,掌握进程的创建、调度和终止方法。
2. 掌握进程通信的基本原理和方法,包括共享内存、管道、消息队列和信号量等。
3. 能够编写简单的进程控制和进程通信程序。
三、实验内容1. 进程控制实验:编写一个程序,实现进程的创建、调度和终止。
通过调用系统调用函数,创建多个子进程,并通过进程控制函数实现父子进程的协作与同步。
2. 进程通信实验:编写一个程序,实现进程间的信息传递和同步管理。
通过共享内存、管道、消息队列或信号量等机制,实现不同进程之间的数据交换和共享。
四、实验步骤1. 进程控制实验:(1)创建父进程和子进程:使用fork()函数创建子进程,并通过判断返回值来区分父子进程。
(2)调度子进程:使用wait()函数等待子进程的结束,以实现父子进程的同步。
(3)终止子进程:使用exit()函数终止子进程的运行。
2. 进程通信实验:(1)共享内存:使用shmget()函数创建共享内存段,使用shmat()函数映射共享内存到进程的地址空间,实现共享数据的读写。
(2)管道:使用pipe()函数创建管道,使用fork()函数创建子进程,通过读写管道实现进程间的数据传输。
(3)消息队列:使用msgget()函数创建消息队列,使用msgsnd()函数向消息队列发送消息,使用msgrcv()函数从消息队列接收消息,实现进程间的消息传递。
(4)信号量:使用semget()函数创建信号量,使用semop()函数对信号量进行P操作和V操作,实现进程间的同步和互斥。
五、实验结果通过实验,我们成功实现了进程的创建、调度和终止,以及进程间的信息传递和同步管理。
课程名称操作系统课程编号A2130330实验地点综合实验楼A511/A512 实验时间2019-04-29校外指导教师校内指导教师常光辉实验名称实验一进程控制描述与控制评阅人签字成绩一、实验目的实验1.1 Windows“任务管理器”的进程管理通过在Windows任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。
实验1.2 Windows Server 2016进程的“一生”1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows Server 2016进程的“一生”;2)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
二、工具/准备工作1. 回顾教材相关内容;2. 在VMware WorkStation Pro中安装Windows Server 2016,如图1-1到图1-4;图1-1 新建虚拟机图1-2 Windows Server 2016安装程序图1-3 Windows Server 2016安装过程图1-4 Windows Server 2016安装完成3. 并在系统中安装Visual Studio 2019或Visual C++ 6.0或其他C++编译软件。
三、实验环境操作系统:Windows Server 2016(虚拟机)编程语言:C++集成开发环境:Visual Studio 2019四、实验步骤与实验过程实验1.1 Windows“任务管理器”的进程管理启动并进入Windows环境,单击Ctrl + Alt + Del键1,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口2。
图1-5 任务管理器在本次实验中,使用的操作系统版本是: Windows Server 2016当前机器中由你打开,正在运行的应用程序有:1)Task Manager (任务管理器,即当前应用)2)记事本(打开了测试文件new.txt,如图1-6所示)图1-6 记事本Windows“任务管理器”的窗口由 5 个选项卡组成,分别是:1)进程2)性能3)用户4)详细信息5)服务当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察):1)应用2)后台进程3)Windows进程1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了 45 个进程。
实验一进程控制描述与控制公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]实验一:进程控制描述与控制[1] Windows“任务管理器”的进程管理一、实验名称Windows“任务管理器”的进程管理二、实验目的通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。
三、实验内容与步骤1. 使用任务管理器终止进程2. 显示其他进程计数器3. 更改正在运行的程序的优先级?启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。
在本次实验中,你使用的操作系统版本是:_______Windows_XP______________________当前机器中由你打开,正在运行的应用程序有:1) _______ ________2) ___________实验一___3) _________操作系统_____________4) ___________百度首页 ________5)Windows“任务管理器”的窗口由____4__个选项卡组成,分别是:1) _______应用程序______________2) _进程__________________3) ______ 性能___________________4) ________联网__________________当前“进程”选项卡显示的栏目分别是 (可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了__40___个进程。
请试着区分一下,其中:系统 (SYSTEM) 进程有____25__个,填入表3-1中。
?表3-1 实验记录?Wmiprvse SYSTEM005376kcidaemon SYSTEM00300kcidaemon SYSTEM00856kcidaemon SYSTEM50284kcisvc SYSTEM00924kcsrss SYSTEM007412kmqtgsvc SYSTEM?004144kmqsvc SYSTEM006632ksnmp SYSTEM004340ktcpservcs SYSTEM003840k服务 (SERVICE) 进程有_____5_个,填入表3-2中。
测试过程:(实验中出现的问题、错误、解决方法)1、创建好项目和文件,对文件进行编译和运行,编译没有错误,但是运行总是提示有2个错误。
解决办法:在新建项目的时候“新建”,然后新建文件,程序就可以正常的运行了。
实验总结:1、课下没有对Microsoft Visual c++ 6.0进行深入的研究,还是好多问题不知道怎么解决,好好钻研一下这个很有必要的啊!评语与成绩:教师签名:年月日实验名称进程控制实验类型验证性实验时间实验环境Windows xp 、Microsoft Visual c++ 6.0实验目的与要求:1.通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程的“一生”。
2. 通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
实验内容:本实验给出了三段程序:创建进程、正在运行的进程和终止进程,阅读程序回答所提问题,分析运行结果。
实验步骤:(算法描述、源程序、操作步骤和方法)一、创建进程回答问题:1、该程序是一个简单使用CreateProcess()API函数的例子。
首先形成简单的命令行,提供当前EXE文件的指定文件名和代表生成克隆进程的号码。
大多数参数都可取默认值,但是创建标志参数使用了CREATE_NEW_CONSOLE标志,指示新进程分配自己的控制台,这使得运行程序时,在任务栏上产生许多活动标记。
然后该克隆进程的创建方法关闭传递过来的句柄并返回main ()函数。
在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。
2、CreateProcess()函数有几个核心参数?本实验程序中设置的各个参数的值是什么?答、CreateProcess()函数有10个核心参数参数的值为:CreateProcess(szFilename, //产生这个EXE的应用程序的名称szCmdLine, //告诉其行为像一个子进程的标志NULL, //缺省的进程安全性NULL, //缺省的线程安全性FALSE, //不继承句柄CREATE_NEW_CONSOLE, //使用新的控制台NULL, //新的环境NULL, //当前目录&si, //启动信息&pi);3、程序运行时屏幕显示的信息是什么?答、二、运行进程回答问题:1、给出运行结果(当前PID信息、操作系统版本、系统提示信息)答、运行结果为:2、如何获得当前的PID和操作系统版本(1)可利用GetCurrentProcessId()API函数查看系统当前进程的标识符(pid),该pid在整个系统中都可使用。
进程管理实验报告进程管理实验报告引言:进程管理是操作系统中的重要概念,它负责调度和控制计算机系统中的各个进程,确保它们能够有序地执行。
本实验旨在通过实际操作和观察,深入了解进程管理的原理和方法,并通过实验结果分析其影响因素和优化策略。
实验一:进程创建与终止在本实验中,我们首先进行了进程的创建和终止实验。
通过编写简单的程序,我们能够观察到进程的创建和终止过程,并了解到进程控制块(PCB)在其中的作用。
实验结果显示,当一个进程被创建时,操作系统会为其分配一个唯一的进程ID,并为其分配必要的资源,如内存空间、文件描述符等。
同时,操作系统还会为该进程创建一个PCB,用于存储该进程的相关信息,如进程状态、程序计数器等。
当我们手动终止一个进程时,操作系统会释放该进程所占用的资源,并将其PCB从系统中删除。
这样,其他进程便可以继续使用这些资源,提高系统的效率和资源利用率。
实验二:进程调度算法进程调度算法是决定进程执行顺序的重要因素。
在本实验中,我们通过模拟不同的进程调度算法,比较它们在不同场景下的表现和效果。
我们选择了三种常见的进程调度算法:先来先服务(FCFS)、最短作业优先(SJF)和轮转调度(RR)。
通过设置不同的进程执行时间和优先级,我们观察到不同调度算法对系统吞吐量和响应时间的影响。
实验结果显示,FCFS算法适用于执行时间较短的进程,能够保证公平性,但在执行时间较长的进程出现时,会导致等待时间过长,影响系统的响应速度。
SJF 算法在执行时间较长的进程时表现出色,但对于执行时间较短的进程,可能会导致饥饿现象。
RR算法能够在一定程度上平衡各个进程的执行时间,但对于执行时间过长的进程,仍然会影响系统的响应速度。
实验三:进程同步与互斥在多进程环境中,进程之间的同步和互斥是必不可少的。
在本实验中,我们通过模拟进程间的竞争和互斥关系,观察进程同步与互斥的实现方式和效果。
我们选择了信号量机制和互斥锁机制作为实现进程同步和互斥的方法。
进程控制实验报告进程控制实验报告一、实验目的本实验旨在通过实际操作,深入理解进程控制的概念、原理和实现方式,掌握进程控制的技巧和方法,提升解决实际问题的能力。
二、实验原理进程控制是操作系统内核的重要功能之一,它负责协调和管理系统中多个进程的执行顺序和资源分配。
进程控制的主要任务包括创建和终止进程、进程切换和进程同步等。
本实验将通过具体的操作,学习和体验进程控制的过程和细节。
三、实验步骤1.实验准备(1)了解和熟悉实验室环境,包括计算机硬件配置、操作系统版本等信息。
(2)准备实验材料,包括相关文档、软件工具等。
(3)明确实验任务和目的,制定实验计划。
2.创建进程(1)打开实验环境,启动操作系统。
(2)使用编程语言(如C语言)编写一个简单的程序,该程序将创建一个新的进程。
(3)编译并运行程序,观察和记录进程的创建过程。
3.进程切换(1)编写一个程序,该程序将在两个进程之间进行切换。
(2)运行程序,观察和记录进程切换的过程和效果。
4.进程同步(1)使用信号量或其他同步机制实现两个进程的同步。
(2)运行程序,观察和记录进程同步的过程和效果。
5.进程终止(1)编写一个程序,该程序将终止一个指定的进程。
(2)运行程序,观察和记录进程终止的过程和效果。
6.实验总结与报告编写(1)总结实验过程和结果,梳理实验中的问题和解决方法。
(2)编写实验报告,包括实验目的、原理、步骤、结果分析等。
四、实验结果与分析通过本次实验,我们成功地创建了一个新的进程,并实现了进程之间的切换、同步和终止。
在实验过程中,我们深入理解了进程控制的概念、原理和实现方式,掌握了进程控制的技巧和方法。
同时,我们也遇到了一些问题,如进程创建失败、进程切换不成功等,但通过仔细分析问题原因并采取相应的解决方法,最终成功解决了这些问题。
通过本次实验,我们不仅学到了专业知识,也提高了解决实际问题的能力。
五、实验结论与建议本次实验让我们更加深入地理解了进程控制的相关知识,并掌握了进程控制的基本操作方法。
课程名称:操作系统实验名称:进程的控制班级:092017姓名:江波同组人:___________________________指导教师评定:_____________________ 签名:__________________________一、实验目的:1.熟悉Linux环境2.知道如何在Linux环境下如何编写C语言程序3.知道如何在Linux环境下进程是如何被控制和管理的二、实验要求:在Linux环境下用记事本编写如下代码,并对其进行编译和运行,观察执行时屏幕上出现的现象,并分析其原因,然后再对代码进行适当的修改再观察执行时的现象并分析其原因。
#include <stdio.h>main (){int p1 , p2 , i;while ((p1= fork ()) < 0 ) ;if( p1 == 0 )for (i = 0 ; i< 50 ; i++)printf (“child %d\n” , i) ;else{ while (( p2 = fork ()) <0 ) ;if ( p 2 == 0 )for ( i= 0 ; i < 50 ;i++ )printf ( “son%d \n ”, I )elsefor ( i = 0 ;i < 50 ;i++ )printf (“daughter %d \n ”, i ) ;}}三、实验步骤:(1)登入Linux虚拟机。
(2)在虚拟机环境下用记事本编写上面代码,保存完之后在终端里面对它进行调试、编译和运行。
(3)观察运行结果,得出结论。
(4)再修改部分代码并调试、编译、运行观察结果。
四、实验结果:Child0Child1Child2Child4Child5Child6Child7Child8Child9...Son0Son1Son2Child3Son3Son5Son6Son7Son8Son9...Daughter0Daughter1Daughter2Son4Daughter3Daughter4Daughter5Daughter6Daughter7Daughter8Daughter9...五、实验感想:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。
进程控制实验报告进程控制实验报告一、引言进程控制是操作系统中的重要概念,它涉及到进程的创建、调度、终止等方面。
本篇实验报告将介绍我们在进程控制实验中所进行的工作和实验结果。
二、实验目的本次实验的目的是通过编写程序,了解进程的创建、调度和终止过程,并掌握相关的系统调用和操作。
三、实验环境我们使用的实验环境是Linux操作系统,并使用C语言编写程序。
四、实验步骤1. 进程创建在实验中,我们编写了一个简单的程序,用于创建新的进程。
通过调用系统调用fork(),我们可以在父进程中创建一个子进程。
子进程是父进程的副本,它们共享一些资源,但有各自独立的执行空间。
2. 进程调度在实验中,我们使用了系统调用exec()来进行进程调度。
通过调用exec(),我们可以在一个进程中执行另一个可执行文件。
这样,原来的进程将被替换为新的进程,并开始执行新的程序。
3. 进程终止在实验中,我们使用了系统调用exit()来终止一个进程。
当一个进程执行完毕或者遇到错误时,可以调用exit()来结束自己的执行。
同时,exit()函数还可以传递一个整数值作为进程的返回值,供其他进程获取。
五、实验结果通过实验,我们成功地创建了多个进程,并进行了调度和终止操作。
我们观察到,创建的子进程在父进程的基础上执行,并且具有独立的执行空间。
在调度过程中,我们能够看到进程的切换和执行结果的输出。
在终止过程中,我们成功地结束了进程的执行,并获取了进程的返回值。
六、实验总结通过本次实验,我们深入了解了进程控制的相关概念和操作。
我们通过编写程序,实际操作了进程的创建、调度和终止过程。
这些实验结果对于我们理解操作系统的工作原理和进程管理机制具有重要意义。
七、实验感想本次实验让我们深刻认识到进程控制在操作系统中的重要性。
进程的创建、调度和终止是操作系统能够高效运行的基础。
通过实验,我们不仅掌握了相关的系统调用和操作,还加深了对操作系统原理的理解。
八、实验改进在实验中,我们可以进一步扩展功能,例如实现进程间的通信和同步机制。
进程的管理和控制实验报告实验目的:本实验旨在了解进程的管理和控制,掌握进程的创建、终止和状态转换等操作,并通过实际的代码编写和运行实验,加深对进程管理的理解。
实验原理:在操作系统中,进程是执行中的程序的实例。
进程管理涉及到创建新进程、终止现有进程、管理进程的状态等操作。
进程的创建:进程的创建可以通过系统调用fork()来完成。
fork()系统调用会创建一个新的进程,称为子进程,子进程将继承父进程的代码、数据和资源。
通过fork()的返回值来区分父子进程,父进程返回子进程的进程ID,子进程返回0。
进程的终止:进程的终止可以通过系统调用exit()来完成。
exit()系统调用会终止当前进程的执行,并返回一个退出状态码。
一个进程的终止也可以由其他进程通过发送终止信号来实现。
进程的状态转换:进程在执行过程中会经历不同的状态,包括就绪态、运行态、阻塞态等。
进程的状态转换可以通过系统调用来实现。
例如,当进程被阻塞时,可以通过系统调用sleep()将其状态转换为阻塞态,当等待的事件发生时,再将其状态转换为就绪态。
实验步骤:1. 编写一个简单的程序,包含进程的创建、终止和状态转换等操作。
2. 使用fork()系统调用创建子进程,并在子进程中执行一段代码。
3. 在父进程中对子进程进行管理,包括等待子进程的终止和获取子进程的退出状态码。
4. 在子进程中通过exit()系统调用终止进程的执行。
5. 在父进程中通过wait()系统调用等待子进程的终止,并获取子进程的退出状态码。
6. 在子进程中通过系统调用sleep()将进程的状态转换为阻塞态。
7. 在父进程中发送终止信号给子进程,观察子进程的终止情况。
实验结果与分析:经过实验,我们成功地创建了子进程并在子进程中执行了一段代码。
父进程能够正确地等待子进程的终止并获取子进程的退出状态码。
在子进程中使用sleep()系统调用后,观察到子进程的状态转换为阻塞态。
当父进程发送终止信号给子进程时,子进程能够正确地终止执行。
实验一:进程控制与描述一、实验目的:利用Windows提供的API函数,编写程序,实现进程的创建和终止(如创建写字板进程及终止该进程),加深对操作系统进程概念的理解,观察操作系统进程运行的动态性能,获得包含多进程的应用程序编程经验。
二、实验原理:1.进程的创建进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。
具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。
随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。
在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。
最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。
2.实现技巧CreateProcess()函数的原型声明如下:BOOL CreateProcess(LPCTSTR lpApplicationName, // 可执行模块名LPTSTR lpCommandLine, // 命令行字符串LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性BOOL bInheritHandles, // 句柄继承标志DWORD dwCreationFlags, // 创建标志LPVOID lpEnvironment, // 指向新的环境块的指针LPCTSTR lpCurrentDirectory, // 指向当前目录名的指针LPSTARTUPINFO lpStartupInfo, // 指向启动信息结构的指针LPPROCESS_INFORMATION lpProcessInformation //指向进程信息结构的指针)可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。
实验一-进程控制实验
实验一进程控制
一、实验目的:
加深对进程概念的理解,明确进程和程序的区别;掌握Linux操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。
二、实验平台:
虚拟机:VMWare9以上
操作系统:Ubuntu12.04以上
编辑器:Gedit | Vim
编译器:Gcc
三、实验内容:
(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示“身份信息”:父进程显示“Parent process! PID=xxx1 PPID=xxx2”;子进程显示“Childx process! PID=xxx PPID=xxx”。
多运行几次,观察记录屏幕上的显示结果,并分析原因。
说明:
xxx1为进程号,用getpid()函数可获取进程号;
xxx2为父进程号,用getppid()函数可获取父进程号;
Childx中x为1和2,用来区别两个子进程;
wait()函数用来避免父进程在子进程终止之前终止。
程序源码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#define NUM 2
int main(void)
{
pid_t pid1,pid2;
if((pid1=fork())<0){
printf("创建进程1失败");
}else{
if(pid1==0){
//子进程1执行
printf("Child1 process: ");
printf("PID=%d PPID=%d \n",getpid(),getppid());
sleep(2);
}else{
if((pid2=fork())<0){
printf("创建进程2失败");
}else{
if(pid2==0){ //子进程2执行
printf("Child2 process: ");
printf("PID=%d
PPID=%d \n",getpid(),getppid());
}
else{
//父进程执行
wait();
wait();
printf("Parent process: ");
printf("PID=%d
PPID=%d \n",getpid(),getppid());
exit(0);
}
}
}
}
}
执行结果
whtcmiss@whtcmiss-VirtualBox:~/Desktop $ gcc test1.c -o test
whtcmiss@whtcmiss-VirtualBox:~/Desktop $ ./test
Child2 process: PID=2527 PPID=2525
Child1 process: PID=2526 PPID=2525
Parent process: PID=2525 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop $ ./test
Child2 process: PID=2530 PPID=2528
Child1 process: PID=2529 PPID=2528
Parent process: PID=2528 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop $ ./test
Child2 process: PID=2533 PPID=2531
Child1 process: PID=2532 PPID=2531
Parent process: PID=2531 PPID=2127
实验结果分析:
第一次程序运行结果,两个子进程的PPID 都是2525,是由同一个进程创建。
而父进程PID 是2525,父进程PPID是2127,说明父进程也是一系统进程的子进程。
第二次程序运行结果,父进程PID是2528,PPID是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID是逐渐递增的。
(2)fork()和exec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程
序single.c改造成可并发执行3个进程的程序multi_process.c;并用time命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。
//single.c
#include <stdio.h>
#define NUM 5
int main(void)
{
void print_msg(char *m);
print_msg("Good ");
print_msg("Morning ");
print_msg("007\n"); //将007替换为本人学号
return 0;
}
void print_msg(char *m)
{
int i;
for(i = 0; i<NUM; i++){
printf("%s",m);
fflush(stdout);
sleep(1);
}
}
编译运行方法:
#gcc single.c –o single
#time ./single
单线程执行结果:
多线程代码:
#multi_process.c
#include <stdio.h>
#include<unistd.h>
#include<stdlib.h>
#define NUM 5
int main(void)
{
pid_t pid[3];
int i;
for(i=1;i<=3;i++){
pid[i-1]=fork();
if(pid[i-1]==0||pid[i-1]==-1)
break;
}
if(pid[0]==0){
execl("print","print","Good",NULL);
}
else {
if(pid[1]==0){
execl("print","print","Hello",NULL);
}
else{
if(pid[2]==0){
execl("print","print","201300814113",NULL);
}
wait();
wait();
wait();
exit(0);
}
}
return 0;
}
实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。
实验总结
本次实验首先要明确进程和程序的区别,我通过在Linux操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。
实验过程中也了解了父进程与子进程的运行过程及其机制。