实验4 进程控制实验

合集下载

进程控制实验报告

进程控制实验报告

一、实验目的本次实验旨在通过Linux操作系统的实践操作,加深对进程控制概念的理解。

通过学习进程的创建、调度、同步、通信等基本操作,掌握进程控制的基本方法,并了解进程间通信的机制。

二、实验环境1. 硬件环境:Intel(R) Core(TM) i5-3210M CPU2.50GHz,4.00GB内存。

2. 软件环境:64位Linux操作系统。

三、实验内容1. 进程的创建与终止2. 进程的调度与优先级3. 进程同步与互斥4. 进程间通信四、实验步骤1. 进程的创建与终止(1)使用`fork()`函数创建子进程,通过比较返回值判断创建是否成功。

```cpid_t pid = fork();if (pid < 0) {perror("fork failed");exit(1);}```(2)使用`exit()`函数终止进程。

```cexit(0);```2. 进程的调度与优先级(1)使用`nice()`函数调整进程优先级。

```cnice(10); // 降低进程优先级```(2)使用`priority_seta()`函数设置进程优先级。

```cstruct sched_param param;param.sched_priority = 10;if (sched_setscheduler(pid, SCHED_RR, &param) == -1) { perror("sched_setscheduler failed");exit(1);}```3. 进程同步与互斥(1)使用`semaphore_t`类型的信号量实现进程同步。

```csemaphore_t sem;sem_init(&sem, 0, 1);sem_wait(&sem);// 执行临界区代码sem_post(&sem);sem_destroy(&sem);```(2)使用`mutex_t`类型的互斥锁实现进程互斥。

操作系统进程控制实验报告

操作系统进程控制实验报告

操作系统进程控制实验报告硬件环境:处理器:Intel(R) Core(TM) i5-3210M CPU @2.50GHz 2.50GHz安装内存:4.00GB系统类型:64位操作系统软件环境:Linux系统一、实验目的加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

掌握进程控制的方法,了解父子进程间的控制和协作关系。

练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。

二、实验步骤(1)分析实例实验(2)进行独立实验(3)思考并完成实验报告实验截图:思考:说明它们反映出操作系统教材中进程及处理机管理一节讲解的进程的哪些特征和功能?在真实的操作系统中它是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。

你对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和执行新程序的?信号的机理是什么?怎样利用信号实现进程控制?根据实验程序、调试过程和结果分析写出实验报告。

1.进程的概念:进程不仅是一段程序代码,还包括当前活动(通过程序计数器和寄存器中的内容来表示),另外,进程还包括进程堆栈段,和数据段等。

2.并发概念:是指进程之间交替并发执行3.进程通过系统调用fork()函数创建子进程,子进程由唯一的pid值标示,pid通常是一个整数值。

通过fork创建的子进程实际上是父进程的克隆体,通过复制原来进程的地址空间而成,父子进程同时执行fork之后的程序。

但是父子进程的pid值不同,可以通过对pid的判断,使父子进程执行不同的程序。

子进程如果想执行不同的程序,需要系统调用exec()函数装入新的程序执行。

4.信号的机理:信号是用来通知进程某个特定的事件已经发生。

信号是由特定的事件产生,信号必须要发送到进程,一旦发送,进程必须得到处理。

信号可以可以有系统默认处理也可以用户自定义处理。

进程控制实验报告

进程控制实验报告

测试过程: (实验中出现的问题、错误、解决方法)创建好项目和文件, 对文件进行编译和运行, 编译没有错误, 但是运行总是提示有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在整个系统中都可使用。

操作系统进程控制实验报告分析解析

操作系统进程控制实验报告分析解析

操作系统进程控制实验报告分析解析
本次实验的目的是通过自己编写一个简单的操作系统内核来深入了解操作系统进程控
制的机制。

实验采用的是汇编语言和C语言相结合的方式进行编写,在这个过程中我们首先要学
会如何引导操作系统进入内核,然后再进行进程的创建和控制。

在内核的启动阶段,我们需要自己编写汇编代码来实现操作系统内核运行的基本步骤。

在这个过程中,我们需要构造一个启动扇区来引导内核的运行。

在这个启动扇区中,我们
需要编写一些汇编代码来初始化段描述符,并将段选择符加载到寄存器中,最后将控制权
转移到C代码中进一步执行。

在内核运行的过程中,我们需要进行进程的创建和控制。

在这个过程中,我们需要以
某种方式来实现进程的调度,以保证系统的稳定和高效。

在本次实验中,我们采用了基于
时间片的轮转调度算法来实现进程的调度。

通过这个调度算法,我们可以实现进程的快速
切换,从而增强了系统的响应速度和稳定性。

最后,在本次实验中,我们还需要学会如何进行进程的同步和通信。

在这个过程中,
我们可以使用信号量机制来实现进程之间的同步和通信。

通过这个机制,我们可以定义一
些信号量,然后让进程在访问共享资源时进行加锁和解锁,从而实现对共享资源的互斥访问。

总之,通过本次实验,我们深入了解了操作系统进程控制的机制,学会了如何编写一
个简单的操作系统内核,以及如何进行进程的创建和控制。

通过这个实验,我们对操作系
统的理解更加深入,对于进一步学习操作系统原理和实现方法,具有很大的帮助作用。

进程管理实验报告分析(3篇)

进程管理实验报告分析(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. 理解进程的概念和特点,掌握进程的创建、调度和终止方法。

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操作,实现进程间的同步和互斥。

五、实验结果通过实验,我们成功实现了进程的创建、调度和终止,以及进程间的信息传递和同步管理。

操作系统进程控制实验报告

操作系统进程控制实验报告

操作系统实验报告实验题目:进程控制专业计算机科学与技术学生姓名班级学号 12006715 指导教师指导单位计算机学院日期 2014年11月13日一、实验目的1.学习和了解进程控制的基本和常用的系统调用fork wait sleep exit exec等等2. 查看 /usr/src/include/sched.h中的task_struct 数据结构,并分析Linux 操作系统进程状态。

3.通过进程创建的应用实例,深刻理解进程创建的过程将以下例题输入运行,并分析运行结果程序例题1#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(void){pid_t pid;int data=5;if((pid=fork())<0){printf("fork error\n");exit(0);}else if(pid==0){data--;printf("child\'s data is:%d\n",data);exit(0);}else{printf("parent\'s data is:%d\n",data);}exit(0);}程序例题2用fork创建一个子进程,由其调用execve启动shell命令ps查看系统当前的进程信息#include <stdio.h>#include <sys/types.h>#include <unistd.h>main( ){pid_t pid;char *path="/bin/ps";char *argv[5]={ "ps","-a","-x",NULL};printf(“Run ps with execve by child process:\n”);if((pid=fork( ))<0){printf(“fork error!”);exit(0);}else if (pid==0){if(execve(path,argv,0)<0){printf(“fork error!”);exit(0);}printf(“child is ok!\n”);exit(0);}wait( );printf(“it is ok!\n”);exit(0);}3.创建一个共享内存,实现一个生产者进程写共享内存,一个消费者进程读共享内存,并在写前读后输出写和读的内容。

过程控制实验报告

过程控制实验报告

过程控制实验报告实验目的:1.理解进程控制的基本概念和原理;2.掌握进程调度算法的原理和实现方式;3.掌握进程间通信的方法和实现方式。

实验仪器和材料:1.计算机;2. 操作系统(Windows、Linux等);3.编程语言C或C++。

实验过程:在操作系统的支持下,实现了一个简单的进程调度和通信的模拟程序。

1.进程的创建和管理通过调用操作系统提供的系统调用函数,实现进程的创建和管理。

首先,编写一个创建进程的函数createProcess,该函数通过调用系统调用函数fork创建一个新的进程,并通过调用系统调用函数exec加载并执行一个可执行文件。

创建的进程可以通过调用系统调用函数wait等待其他进程的结束,并通过调用系统调用函数exit退出当前进程。

2.进程调度算法实现了三种常见的进程调度算法:先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转算法(RR)。

首先,编写一个函数schedule,该函数根据调度算法从就绪队列中选择一个进程,并调用操作系统提供的系统调用函数进行进程切换。

调度算法的选择通过用户输入进行控制。

3.进程间通信实现了两种常见的进程间通信方法:管道和共享内存。

首先,编写一个函数createPipe,该函数通过调用系统调用函数pipe创建一个管道,用于实现进程间的通信。

然后,编写一个函数createSharedMemory,该函数通过调用系统调用函数shmget创建一块共享内存,用于实现进程间的共享数据。

实验结果:在实验过程中,使用C语言编写了一个模拟进程调度和通信的程序。

通过调用系统调用函数,在操作系统的支持下,成功实现了进程的创建和管理、进程调度算法的实现以及进程间通信的功能。

实验结果显示,不同的进程调度算法对进程执行的顺序和时间有不同的影响;而进程间通信的方法可以实现进程之间的数据交换和共享。

实验总结:通过本次实验,理解了进程控制的基本概念和原理,掌握了进程调度算法和进程间通信的实现方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四进程控制实验
一、实验目的
1、掌握进程的概念,明确进程和程序的区别。

2、认识和了解并发执行的实质。

3、分析进程争用资源的现象,学习解决进程互斥的方法。

二、实验内容
1、进程的创建
编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。

让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。

试观察记录屏幕上的显示结果,并分析原因。

(1分)
<参考程序>
# include<stdio.h>
void main()
{ int p1, p2;
while((p1=fork())= = -1);
if(p1= =0)
putchar(‘b’);
else
{ while((p2=fork())= =-1);
if(p2= =0)
putchar(‘c’);
else
putchar( ‘a’);
}
}
执行结果:
分析:
创建子进程p1,看当前是不是在子进程中,如果在p1中输出b,否则创建子进程p2,如果在子进程p2中输出c,否则在父进程中输出a。

2、修改第一题,在每个进程中显示当前进程识别码和父进程识别码。

(2分)
#include<stdio.h>
#include<unistd.h>
void main(){
int p1, p2;
while((p1= fork()) == -1);
if(p1 == 0){
putchar('b');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
else
{ while((p2 = fork()) ==-1);
if(p2 == 0){
putchar('c');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
else{
putchar('a');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
} }
3、 编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。

(3分)(写其中一个即可)
图一:
#include<stdio.h>
#include<unistd.h> a 父进程
子进程 图1 进程树 b c
d
a d
b
c e
图2 进程树
void main()
{ int p1,p2,p3;
while((p1=fork())==-1);
if(p1==0) /* 子进程1中*/
{ while((p2=fork())==-1);
if(p2==0) /* 子进程2中*/
{ while((p3=fork())==-1);
if(p3==0) /* 子进程3中*/
{putchar('d');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid());}
else
{ putchar('c');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid()); /* 子进程2中*/}
}
else
{ putchar('b');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid()); /* 子进程1中*/}
}
else /* 父进程中*/
{putchar('a');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid());}}
4、编程创建2个子进程,子进程1运行指定路径下的可执行文件(如:/home/user/birthday),子进程2在暂停10s之后退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。

(3分)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int main() {
pid_t child1, child2, child;
if ((child1 = fork()) == -1) {
perror("execle error");
exit(1);
} else if (child1 == 0) {
printf(("In child1:execute'birth'\n"));
if (execle("/home/nmy/abc/birthday.out", " ", NULL, NULL) == -1) { perror("execle error");
exit(1);
}
}
else
//创建子进程2
if ((child2 = fork()) == -1) { //子进程2出错处理
perror("execle error");
exit(1);
} else if (child2==0){ //在子进程2中使其暂停10秒
printf(("In child2:sleep for 10 seconds and then exit'\n"));
sleep(10);
exit(0);
} else{ //在父进程中等待两个子进程的退出
printf("In father process...\n");
child = waitpid(child1,NULL,0); //阻塞式等待
if(child==child1){
printf("Get child1 exitcode\n");
} else{
printf("Error occured!\n");
}
do {
child = waitpid(child2,NULL,WNOHANG); //非阻塞式等待
if(child==0){
printf("The child2 process has not exited\n");
sleep(1); }
}while (child==0);
if(child==child2){
printf("Get child2 exitcode\n");
} else{
printf("Error occured!\n");
}
}
exit(0);
}
等待10秒后的输出结果:
10秒内输出结果:
三、实验总结和体会(1分)
在本次实验中,我学会了创建子进程,其格式调用是fork(),如果fork成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。

如果fork失败则直接返回-1。

通过实验编写,我学会进程的函数调用,同时也分清了进程和程序的区别:程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;进程具有并发性;一个程序可对应多个进程即多个进程可执行同一程序;一个进程可以执行一个或几个程序。

相关文档
最新文档