北方工业大学《计算机操作系统》实验报告——进程管理
操作系统实验报告进程管理

操作系统实验报告进程管理操作系统实验报告:进程管理引言操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户与计算机之间的接口。
进程管理是操作系统的重要功能之一,它负责对计算机中运行的各个进程进行管理和调度,以保证系统的高效运行。
本实验报告将介绍进程管理的基本概念、原理和实验结果。
一、进程管理的基本概念1. 进程与线程进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。
线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。
进程和线程是操作系统中最基本的执行单位。
2. 进程状态进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。
就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某些事件的发生。
3. 进程调度进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的使用权。
常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转等。
二、进程管理的原理1. 进程控制块(PCB)PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态信息,如进程标识符、程序计数器、寄存器值等。
通过PCB,操作系统可以对进程进行管理和控制。
2. 进程创建与撤销进程的创建是指操作系统根据用户的请求创建一个新的进程。
进程的撤销是指操作系统根据某种条件或用户的请求终止一个正在运行的进程。
进程的创建和撤销是操作系统中的基本操作之一。
3. 进程同步与通信多个进程之间可能需要进行同步和通信,以实现数据共享和协作。
常见的进程同步与通信机制包括互斥锁、信号量和管道等。
三、实验结果与分析在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。
通过该程序,我们可以观察到不同调度算法对系统性能的影响。
实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等待时间过长,影响系统的响应速度。
(完整word版)操作系统实验报告实验一进程管理

实验一进程管理一、目的进程调度是处理机管理的核心内容.本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法.二、实验内容及要求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.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,研究解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。
2.实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件,分析进程的创建过程。
3.实验内容(1)进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。
试观察记录屏幕上的显示结果,并分析原因。
源代码如下:#include<XXX>#include<XXX>#include<unistd.h>#include <XXX>#include <XXX>int main(int argc,char* argv[]){pid_t pid1,pid2;pid1 = fork();if(pid1<0){fprintf(stderr,"childprocess1 failed");exit(-1);}else if(pid1 == 0){printf("b\n");}else{pid2 = fork();if(pid2<0){fprintf(stderr,"childprocess1 failed"); exit(-1);}else if(pid2 == 0){printf("c\n");}else{printf("a\n");sleep(2);exit(0);}}return 0;}结果如下:分析原因:pid=fork();操纵体系创建一个新的历程(子历程),而且在历程表中相应为它建立一个新的表项。
进程管理实验报告分析(3篇)

第1篇一、实验背景进程管理是操作系统中的一个重要组成部分,它负责管理计算机系统中所有进程的创建、调度、同步、通信和终止等操作。
为了加深对进程管理的理解,我们进行了一系列实验,以下是对实验的分析和总结。
二、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 分析进程争用资源的现象,学习解决进程互斥的方法。
4. 了解Linux系统中进程通信的基本原理。
三、实验内容1. 使用系统调用fork()创建两个子进程,父进程和子进程分别显示不同的字符。
2. 修改程序,使每个进程循环显示一句话。
3. 使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号,实现进程的终止。
4. 分析利用软中断通信实现进程同步的机理。
四、实验结果与分析1. 实验一:父进程和子进程分别显示不同的字符在实验一中,我们使用fork()创建了一个父进程和两个子进程。
在父进程中,我们打印了字符'a',而在两个子进程中,我们分别打印了字符'b'和字符'c'。
实验结果显示,父进程和子进程的打印顺序是不确定的,这是因为进程的并发执行。
2. 实验二:每个进程循环显示一句话在实验二中,我们修改了程序,使每个进程循环显示一句话。
实验结果显示,父进程和子进程的打印顺序仍然是随机的。
这是因为并发执行的进程可能会同时占用CPU,导致打印顺序的不确定性。
3. 实验三:使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号在实验三中,我们使用signal()捕捉键盘中断信号(按c键),然后通过kill()向两个子进程发送信号,实现进程的终止。
实验结果显示,当按下c键时,两个子进程被终止,而父进程继续执行。
这表明signal()和kill()在进程控制方面具有重要作用。
4. 实验四:分析利用软中断通信实现进程同步的机理在实验四中,我们分析了利用软中断通信实现进程同步的机理。
操作系统实验报告----进程管理

实验内容:进程管理一、实验目的1、掌握Linux中进程的创建方法及执行情况;2、加深对进程、进程树等概念的理解;3、掌握Linux中如何加载子进程自己的程序;4、掌握父进程通过创建子进程完成某项任务的方法;5.、掌握系统调用exit()和_exit()调用的使用。
6、分析进程竞争资源的现象,学习解决进程互斥的方法;进一步认识并发执行的实质二、实验内容(一)进程的创建1、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符。
#include<stdio.h>main(){int p,x;p=fork();if(p>0){x=fork();if(x>0)printf("father\n");elseprintf("child2");}elseprintf("child1");}输出结果:child1child2father2、运行以下程序,分析程序执行过程中产生的进程情况。
#include <stdio.h>main(){int p,x;p=fork();if (p>0)fork();else{fork();fork();}sleep(15);}实验步骤:编译连接gcc –o forktree forktree.c后台运行./forktree &使用pstree –h 查看进程树运行结果:├─gnom e-terminal─┬─bash─┬─forktree─┬─forktree─┬─forkt ree───forktree││││└─forktree│││└─forktree││└─pstree 分析:程序运行,系统首先创建一个进程forktree,执行到p=fork()创建一个子进程forktree,子进程获得处理机优先执行,父进程等待;执行else,当执行到第一个fork()函数时,子进程创建了一个进程forktree,称之为孙进程,孙进程获得处理机往下执行,子进程等待;执行到第二个fork()函数时,孙进程又创建一个进程forktree,称之为重孙进程,重孙进程很快执行完,将处理机还给孙进程,孙进程很快执行完,将处理机还给子进程;子进程继续往下执行,执行到第二个fork()函数,又创建一个进程forktree,称之为第二孙进程,并获得处理机执行,此进程很快执行完,将处理机还给子进程,子进程也很快执行完,将处理机还给父进程,父进程P>0执行if语句,运行fork()函数,又创建一个进程forktree,称之为第二子进程,此进程获得处理机执行很快运行完,将处理机还给父进程,父进程运行sleep(15)语句,休眠15秒,用pstree命令查询进程树。
操作系统实验报告-进程管理

修改上述程序,将每个进程输出结果修改为每个进程输出几行字符(在此,如果为第一个子进程,则连续输出10行“the first child process”;如果为第二个子进程,则连续输出10行“the second child process”;如果为父进程,则连续输出10行“the parent process”),再观察程序的执行结果,并分析原因。然后,在上述程序中使用函数lockf()给每个进程加锁(锁定屏幕输出),从而实现进程之间互斥,观察并分析结果。
二、实验步骤及过程(可以附算法)
1.进入vi编辑器,创建test.c文件
2.输入代码如下;
3.输入gcc –o test test.c对test.c文件进行编译,输入./test对test.c文件进行执行,结果如下。
4.创建te.c文件
5.输入代码如下;
6.输入gcc –o te te.c对te.c文件进行编译,输入./te对te.c文件进行执行,结果如下。
实验名称:进程管理
组别:合作者:日期:5/24
一、预习:实验内容及要求
(实验目的:
1.加深对进程概念的理解,区分进程和程序的区别
2.进一步了解进程并发执行的本质
(2).实验内容:
1.创建进程
编写一段程序,使用函数fork()创建两个子进程,执行该程序时,在系统中同时存在一个父进程以及两个子进程活动。此时,让每个进程在屏幕上显示一个字符:父进程显示字符“p”;子进程分别显示字符“a”和字符“b”。请观察并记录程序的执行结果,并分析具体原因。
7.加入lockf()函数代码如下
8.再次编译并执行;
三、实验结果及分析(可另加附页)
通过本次实验了解了进程的进本操作,还有几个函数的基本调用,有fork()函数,lockf函数等等。
操作系统-实验三-进程管理-实验报告

计算机与信息工程学院实验报告一、实验内容1.练习在shell环境下编译执行程序(注意:①在vi编辑器中编写名为sample.c的c语言源程序②用linux自带的编译器gcc编译程序,例如:gcc –o test sample.c③编译后生成名为test.out的可执行文件;④最后执行分析结果;命令为:./test)注意:linux自带的编译程序gcc的语法是:gcc –o 目标程序名源程序名,例如:gcc –o sample1 sample1.c,然后利用命令:./sample 来执行。
如果仅用“gcc 源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。
2.进程的创建仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。
观察记录屏幕上的显示结果,并分析原因。
3.分析程序实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。
二、实验步骤1. 利用fork()创建一个小程序(1)编写程序#include <sys/types.h>main (){int i=5;pid_t pid;pid=fork();for(;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("i am the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("i am the parent process, my process id is %d and i=%d\n",getpid(),i);}for(i=5;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("the parent process, my process id is %d andi=%d\n",getpid(),i);}}(2)运行程序(3)分析程序在这里,主程序先运行,在屏幕上输出一个a,之后两个子程序分别运行而输出c和b。
操作系统进程管理实验报告

操作系统进程管理实验报告一、引言在现代计算机科学中,操作系统的进程管理是确保系统高效运行的关键环节。
本实验旨在通过观察和分析操作系统的进程管理行为,深入理解进程的创建、运行和终止过程,以及操作系统如何对进程进行调度和资源分配。
二、实验目标1、理解进程的基本概念、进程状态及转换。
2、掌握进程的创建、终止和调度方法。
3、观察和分析进程在运行过程中的资源消耗和调度行为。
4、分析操作系统对进程的资源分配和调度策略对系统性能的影响。
三、实验环境与工具本实验在Linux操作系统上进行,使用GNU/Linux环境下的工具进行进程的创建、监控和调度。
四、实验步骤与记录1、创建进程:使用shell命令“fork”创建一个新的进程。
记录下父进程和子进程的PID,以及它们在内存中的状态。
2、进程状态观察:使用“ps”命令查看当前运行进程的状态,包括进程的PID、运行时间、CPU使用率等。
同时,使用“top”命令实时监控系统的CPU、内存等资源的使用情况。
3、进程调度:在“crontab”中设置定时任务,观察系统如何根据预设的调度策略分配CPU资源给各个进程。
4、资源分配:通过修改进程的优先级(使用“nice”命令),观察系统如何调整资源分配策略。
5、终止进程:使用“kill”命令终止一个进程,并观察系统如何处理该进程占用的资源。
五、实验结果与分析1、创建进程:通过“fork”系统调用,成功创建了一个新的进程,并获取了父进程和子进程的PID。
在内存中,父进程和子进程的状态分别为“running”和“ready”。
2、进程状态观察:使用“ps”命令可以看到父进程和子进程的状态均为“running”,同时显示了它们的CPU使用率和运行时间等信息。
通过“top”命令,可以实时监控系统的CPU、内存等资源的使用情况,为进一步分析提供了数据支持。
3、进程调度:在“crontab”中设置定时任务后,系统会根据预设的调度策略以及各个进程的运行状态,动态地分配CPU资源给各个进程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<程序一>子进程和父进程输出字符串有相互嵌插的现象。由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。
<程序二>因为lockf(1,1,0)锁定标准输出设备,lockf(1,0,0)解锁标准输出设备,在lockf(1,1,0)与lockf(1,0,0)中间的for循环输出不会被中断,加锁与不加锁效果不相同。
printf("bbb");
lockf(1,0,0);
exit(0);
}
else
{
lockf(1,1,0);
for(i=0;i<10000;i++)
printf("ccc");
lockf(1,0,0);
exit(0);
}
}
}
/*第3题33.c*/
#include<stdio.h>
#include<signal.h>
2.在3题中,因为我自己的粗心导致注释行出错,使kill(p1,16)函数没有调用成功,只出现了“parent process is killed!”,没有输出其余两句。在出现错误之后我立马去检查,便解决了这个问题。
3.在第3题中,要求让父进程捕捉键盘上来的中断信号(即按Del键),但是在实际实验中当我按下Del键时并没反映,后来经查资料,知道了在Linux系统下应该是按下Ctrl+C键。
进程结束最常用的方法是调用exit函数,在main函数中调用的return,最终也是调用exit,这些都属于进程的正常终止。
4.lockf(files,mode,size):用于锁定文件的某些段或者整个文件
files是文件描述符;mode是锁定和解锁:1表示锁定,0表示解锁.size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾.。
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);
signal(SIGINT,SIG_IGN);/*忽略^c信号*/
while(wait_mark!=0)
lockf(1,1,0);
printf("child process1 is killed by parent!\n");
main()
{
intp1,p2,i;
if(p1=fork())
{
lockf(1,1,0);
for(i=0;i<10000;i++)
printf("aaa");
lockf(1,0,0);
exit(0);
}
else
{
if(p2=fork())
{
lockf(1,1,0);
for(i=0;i<10000;i++)
五、编译与执行过程截图
1.进程的创建
进程的创建:系统调用fork()创建两个子进程。当程序运行时,系统中有一个父进程和两个子进程活动。父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。如图,有acb;abc两种情况出现了
2.进程的控制
子进程和父进程互相抢占处理机,导致输出“乱序”现象的出现,可以看到在“bbb”中出现了“aaa”。
exit(0);
}
else
{
while((pid2=fork( ))==-1);
if(pid2==0)
{
lockf(fd[1],1,0);/*互斥*/
sprintf(outpipe,"child 2 process is sending message!");
write(fd[1],outpipe,50);
exit(0);
}
}
}
九、实验体会
#include<unistd.h>
voidwaiting(),stop(),alarming();
intwait_mark;
main()
{
intp1,p2;
if(p1=fork())/*创建子进程p1*/
{
if(p2=fork())/*创建子进程p2*/
{
wait_mark=1;
signal(SIGINT,stop);/*接收到^c信号,转stop*/
八、调试后的程序源代码
/*第一题:creat.c*/
#include<stdio.h>
main( )
{
intp1,p2;
while((p1=fork( ))==-1);/*创建子进程p1*/
if(p1==0) putchar('b');
else
{
while((p2=fork( ))==-1);/*创建子进程p2*/
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"child 1 process is sending message!");/*把串放入数组outpipe中*/
write(fd[1],outpipe,50);/*向管道写长为字节的串*/
lockf(fd[1],0,0);
2.wait():进程的等待,常用来控制父进程与子进程的同步:
在父进程中调用wait函数,则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止状态字,系统会向父进程发出SIGCHLD信号。当接收到信号后,父进程提取子进程的终止状态字,从wait返回继续执行原程序。
3.exit():结束进程
signal(SIGALRM,alarming);/*接受SIGALRM*/
waiting();
kill(p1,16);/*向p1发软中断信号*/
kill(p2,17);/*向p2发软中断信号*/
wait(0);/*同步*/
wait(0);
printf("parent process is killed!\n");
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,先接收P1发来的消息,然后再接收P2发来的消息,显示在屏幕上。
六、实验结果与分析
1.进程的创建运行结果:acb,abc,其实,从进程执行并发来看,输出abc的任何排列都是有可能的。因为fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,父进程与子进程的输出内容会叠加在一起,输出次序带有随机性。
实验报告书
学生姓名
学号
班级
2012 — 2013学年第一学期
《计算机操作系统》实验报告
实验名称
进程管理
实验序号
1
实验日期
2012年12月
实验人
一、实验目的和要求
1.加深对进程概念的理解,明确进程和程序的区别
2.进一步认识并发执行的实质
3.分析进程争用资源的现象,学习解决进程互斥的方法
4.了解Linux系统中进程通信的基本原理
5.signal(int signum,void(* handler)(int)):signal()会依参数signum指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。
6.kill(pid_t pid,int sig),可以用来送参数sig指定的信号给参数pid指定的进程。
因为加锁了,所以各子进程和父进程各自打印出各自的字符串,并没有出现穿插的现象。
3.进程的软中断通信
使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出:
exit(0);
}
else
{
wait_mark=1;
signal(17,stop);
signal(SIGINT,SIG_IGN);/*忽略^c信号*/
while(wait_mark!=0);
lockf(1,1,0);
printf("child process2 is killed by parent!\n");
4.进程的管道:进程p1和进程p2分别从管道的一端向管道输入了信息,父进程从管道的另一端读出了信息,先为p1的消息再为p2的消息,连接了一个读进程和一个写进程实现他们之间通信的一个共
享。首先,通过pipe()先创建了一个管道,子进程p1,p2是共享输入端的,所以要通过lockf()进行加锁解锁实现互斥,并且是先由p1向管道发送消息,然后是p2。父进程通过wait(0)等待子进程结束后从管道读取消息。
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
intpid1,pid2;
main( )
{
intfd[2];
charoutpipe[100],inpipe[100];
pipe(fd);/*创建一个管道*/
while((pid1=fork( ))==-1);
七、调试时遇到的问题及解决方法(提供BUG截屏)
1.在第2(1)题中因为循环次数太少,所以并没有出现乱序的情况,后来老师提醒我们可以把循环次数大大增加,因为处理机的速度是很快的,如果不把循环次数i的值设为比较大的数的话,很可能体现不出来进程并发执行时的调度顺序和父子进程的抢占处理机问题,这个数字的设定也因机器而异,本来在我的程序中i的设置值为500,后来我改为了10000,才出现了乱序的现象。