最新Linux多进程并发执行实验

合集下载

操作系统实验04 Linux 多进程编程

操作系统实验04 Linux 多进程编程

《操作系统》实验报告实验序号:实验四实验项目名称:实验04 Linux 多进程编程学号1207022103 姓名陈华荣专业、班网络工程实验地点实1-311 指导教师李桂森实验时间2014.10.26一、实验目的及要求1.通过本实验的学习,使学生掌握Linux多进程编程的基本方法。

2.实验内容:利用Linux多进程实现题目所要求的功能。

3.以学生自主训练为主的开放模式组织教学二、实验设备(环境)及要求PC机三、实验内容与步骤1、编写一个显示“HELLO”的c语言程序,并利用GCC编译,然后运行此程序。

(提示:若没有gcc,需先安装gcc编译程序)指令:Apt-get install updateApt-get install gccCd /home/normaluesrTouch helloworld.cVim helloeorld.c在helloworld里编辑进:#include<stdio.h>Int main(){Printf(“helloworld”);Return 0;}然后用gcc进行编译运行:或者直接2、进程的创建:编制一程序,利用系统调用fork()创建两个子进程。

程序运行时,系统中有一个父进程和两个子进程活动,分别让他们显示“A”、“B”和“C”,分析程序运行结果。

3、用ctrl+alt+F2切换到第二个终端(tty2)并使用另外一个用户登录(可利用第二个实验创建的用户登录),然后使用who命令查看用户登录情况。

用ctrl+alt+F1切换到第二个终端(tty1),修改第二步的程序,在每个进程退出前都加上一个sleep(20)的函数来延缓进程的退出,然后运行此程序,立即切换到tty2,使用ps -a命令查看系统运行的进程,观察程序创建的进程都有哪些?pid是多少?4、进程的管道通信:编制一程序,使用系统调用pipe()建立一管道,两个子进程P1和P2分别向管道各写一句话,父进程则从管道中读取出来并显示在屏幕。

进程的同步与互斥实验报告

进程的同步与互斥实验报告

进程的同步与互斥实验报告1.实验目的进程(线程)的同步与互斥是操作系统中非常重要的概念,本实验旨在通过实际操作,加深对这些概念的理解和掌握。

通过编写多个进程(线程),并在其间进行同步与互斥操作,验证同步与互斥的实际效果。

2.实验环境本实验在Linux系统下进行,使用C/C++语言编程。

3.实验内容3.1同步在实验中,我们编写了两个进程A和B,这两个进程需要按照特定的顺序执行。

为了实现同步,我们使用信号量机制来确保进程A和B按照正确的顺序执行。

3.2互斥在实验中,我们编写了多个进程C和D,这些进程需要同时对一个共享资源进行访问。

为了实现互斥,我们使用互斥锁机制来确保同一时刻只有一个进程访问共享资源。

4.实验过程4.1同步实验编写进程A和进程B的代码,使用信号量机制实现同步。

进程A先运行,然后通过信号量唤醒进程B,进程B再开始执行。

通过观察进程的运行顺序,验证同步机制是否起作用。

4.2互斥实验编写进程C和进程D的代码,使用互斥锁机制实现互斥。

进程C和进程D同时对一个共享资源进行访问,通过互斥锁来确保同一时刻只有一个进程访问共享资源。

观察进程的输出结果,验证互斥机制是否起作用。

5.实验结果5.1同步实验结果进程A开始执行进程A执行完毕进程B开始执行进程B执行完毕5.2互斥实验结果进程C开始执行进程C访问共享资源进程C执行完毕进程D开始执行进程D访问共享资源进程D执行完毕6.实验分析通过上述结果可以看出,同步实验中进程A和进程B按照正确的顺序执行,证明了同步机制的有效性。

互斥实验中进程C和进程D能够正确地交替访问共享资源,证明了互斥机制的有效性。

7.实验总结通过本次实验,我深刻理解了进程(线程)的同步与互斥,并通过实际操作加深了对这些概念的理解。

同步和互斥是操作系统中非常重要的概念,对于应对资源竞争和提高程序性能具有重要意义。

在实际开发中,我们应该合理使用同步和互斥机制,以确保程序的正确性和并发执行的效率。

并行程序实验报告

并行程序实验报告

并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用OpenMP编程的基本方法和MPI的编程方法,通过实践实现的基本程序,掌握基本的线程及进程级并行应用开发技术,能够分析并行性能瓶颈及相应优化方法。

二、实验环境Linux操作系统,mpi库,多核处理器三、实验设计与实现(一)MPI并行程序设计用MPI编写一个greeting程序,编号为0的进程接受其它各进程的“问候”,并在计算机屏幕上显示问候情况。

用MPI编写一个多进程求积分的程序,并通过积分的方法求π的值,结果与π的25位精确值比较。

(二)多线程程序设计用Pthreads或OpenMP编写通过积分的方法求π的程序。

把该程序与相应的MPI程序比较。

用Pthreads或OpenMP编写编写矩阵相乘的程序,观察矩阵增大以及线程个数增减时的情形。

四、实验环境安装(一)MPI环境安装1.安装kylin操作系统的虚拟机(用VirtualBox)2.安装增强功能,使之与windows主机能够文件共享。

3.拷贝mpich-3.0.4.tar.gz到/root/myworkspace/目录下,并解压(tar xzf mpich-3.0.4.tar.gz)4.下面开始安装mkdir /root/myworkspace/mpi./configure --prefix=/root/myworkspace/mpi --disable-f77 --disable-fcmakemake install5.配置环境变量打开/root/.bashrc文件,在文件的末尾加上两行:PATH=$PATH:/root/myworkspace/mpi/binexport PATH保存退出,然后执行命令source /root/.bashrc(二)openMP实验环境安装Visual Studio中修改:项目->属性->c/c++->语言,将“OpenMP支持”改成“是”:五、实验结果及分析(一)MPI并行程序设计实验一:问候发送与接收非零号进程将问候的信息发送给0号进程,0号进程依次接收其它进程发送过来的消息并将其输出。

进程同步实验报告

进程同步实验报告

一、实验目的1. 理解进程同步的概念和原理;2. 掌握进程同步的基本方法和机制;3. 学会使用信号量实现进程同步;4. 通过实验验证进程同步机制的有效性。

二、实验原理1. 进程同步:在多道程序设计中,进程的执行是并发的,但某些情况下需要保证多个进程按照一定的顺序执行,以避免出现数据不一致、死锁等问题。

进程同步是指通过某种机制,协调多个进程的执行顺序,保证它们能够正确、有效地共享资源。

2. 信号量:信号量是一种特殊的变量,用于实现进程同步。

信号量具有两个原子操作:P操作(wait)和V操作(signal)。

P操作用于申请资源,V操作用于释放资源。

3. 互斥锁:互斥锁是一种常见的进程同步机制,用于保证临界资源的互斥访问。

当一个进程进入临界区时,它会尝试获取互斥锁,如果锁已被其他进程获取,则该进程进入等待状态;当进程退出临界区时,它会释放互斥锁。

三、实验内容1. 实验环境:Linux操作系统,C语言编程环境。

2. 实验工具:gcc编译器、gdb调试器。

3. 实验步骤:(1)创建一个互斥锁,用于保护临界资源。

(2)编写两个进程,分别模拟对临界资源的访问。

(3)在进程访问临界资源前,使用P操作尝试获取互斥锁。

(4)在进程访问临界资源后,使用V操作释放互斥锁。

(5)编译并运行程序,观察进程执行情况。

四、实验结果与分析1. 实验结果:(1)在互斥锁的保护下,两个进程能够按照预期顺序访问临界资源。

(2)当其中一个进程正在访问临界资源时,另一个进程会进入等待状态。

(3)当进程访问临界资源完成后,它会释放互斥锁,允许其他进程访问。

2. 实验分析:(1)互斥锁能够有效地保护临界资源,避免数据不一致问题。

(2)信号量P操作和V操作保证了进程的同步,避免了死锁现象。

(3)通过实验验证了进程同步机制的有效性。

五、实验总结本次实验通过使用信号量和互斥锁,实现了进程同步。

实验结果表明,信号量和互斥锁能够有效地保证进程按照预期顺序执行,避免数据不一致和死锁等问题。

操作系统-进程管理实验报告

操作系统-进程管理实验报告

操作系统-进程管理实验报告实验一进程管理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();操纵体系创建一个新的历程(子历程),而且在历程表中相应为它建立一个新的表项。

进程管理设计实验报告

进程管理设计实验报告

一、实验目的1. 理解进程管理的概念和作用;2. 掌握进程的创建、调度、同步与通信等基本操作;3. 分析并解决进程管理中的常见问题;4. 提高编程能力和系统设计能力。

二、实验环境1. 操作系统:Linux;2. 编程语言:C/C++;3. 开发工具:GCC。

三、实验内容1. 进程创建与调度(1)创建一个简单的进程,实现进程的创建、运行和退出;(2)实现进程的调度,采用时间片轮转算法(RR)进行进程调度;(3)分析进程调度的过程,观察不同调度算法对进程执行的影响。

2. 进程同步与互斥(1)实现进程同步,采用信号量机制实现进程间的同步;(2)实现进程互斥,使用互斥锁(mutex)保护临界资源;(3)分析进程同步与互斥的原理,解决死锁、饥饿等问题。

3. 进程通信(1)实现进程间的通信,采用管道(pipe)进行数据传输;(2)实现共享内存(shared memory)进行进程间通信;(3)分析进程通信的原理,解决通信中的同步与互斥问题。

4. 实验拓展(1)设计一个多进程并发程序,实现生产者-消费者问题;(2)实现进程的优先级调度,观察不同优先级对进程执行的影响;(3)分析并实现进程的动态创建与销毁,提高系统的灵活性和可扩展性。

四、实验步骤1. 编写进程创建与调度的代码,实现进程的创建、调度和执行;2. 编写进程同步与互斥的代码,实现信号量机制和互斥锁;3. 编写进程通信的代码,实现管道和共享内存通信;4. 编写实验拓展的代码,实现生产者-消费者问题、优先级调度和动态创建与销毁;5. 编译并运行实验程序,观察实验结果,分析并解决问题。

五、实验结果与分析1. 进程创建与调度实验结果显示,采用时间片轮转算法(RR)进行进程调度,进程按照一定的顺序执行,实现了进程的并发执行。

2. 进程同步与互斥实验结果显示,采用信号量机制实现进程同步,可以避免进程间的冲突,保证进程按预期顺序执行;使用互斥锁(mutex)保护临界资源,可以防止多个进程同时访问同一资源,避免数据竞争。

程序并发执行实验报告

程序并发执行实验报告

一、实验目的1. 理解并发执行的概念和原理。

2. 掌握多线程编程的基本方法。

3. 学会使用同步机制解决并发编程中的竞争条件。

4. 分析并发程序的性能和效率。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 创建一个简单的并发程序,实现两个线程同时执行。

2. 使用同步机制解决并发程序中的竞争条件。

3. 分析并发程序的性能和效率。

四、实验步骤1. 创建一个简单的并发程序(1)创建一个名为ConcurrentTest的类,该类继承自Thread类。

(2)在ConcurrentTest类的run方法中,打印出当前线程的名字。

(3)在主函数中,创建两个ConcurrentTest对象,分别命名为thread1和thread2。

(4)启动thread1和thread2线程。

(5)等待thread1和thread2线程执行完毕。

2. 使用同步机制解决并发程序中的竞争条件(1)创建一个名为Counter的类,该类包含一个私有变量count和一个静态同步方法add。

(2)在add方法中,增加count变量的值。

(3)在主函数中,创建一个Counter对象counter。

(4)创建两个线程,分别调用counter对象的add方法。

(5)启动两个线程,并等待它们执行完毕。

3. 分析并发程序的性能和效率(1)在主函数中,记录两个线程开始执行的时间。

(2)在主函数中,记录两个线程执行完毕的时间。

(3)计算两个线程执行所需的时间差。

五、实验结果与分析1. 实验结果(1)简单的并发程序在控制台中,可以看到thread1和thread2线程交替打印出它们的名字。

(2)使用同步机制解决竞争条件在控制台中,可以看到Counter对象的count变量值正确地增加了。

(3)分析并发程序的性能和效率thread1和thread2线程执行所需的时间差为0.01秒。

2. 实验分析(1)简单的并发程序通过创建两个线程,实现了两个任务同时执行。

实验二 进程管理(linux)

实验二 进程管理(linux)

实验二进程管理(Linux)一、实验类型本实验为设计性实验。

二、实验目的与任务1)加深对进程概念的理解,明确进程和程序的区别。

2)进一步认识并发执行的实质三、预习要求1)进程的概念2)进程控制的概念及内容3)进程的并发执行4)熟悉互斥的概念5)用到的Linux函数有:fork(),lockf()等。

四、实验基本原理使用fork()系统调用来创建一个子进程,父进程和子进程并发执行,交替输出结果。

使用lockf()系统调用对临界区进行加锁操作,实现对共享资源的互斥使用。

五、实验仪器与设备(或工具软件)实验设备:计算机一台,软件环境要求: Linux操作系统和gcc编译器。

六、实验内容1)进程的创建编写一段程序,使用系统调用fork( ) 创建两个子程序。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

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

运行程序10次,观察记录屏幕上的显示结果,并分析原因。

2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程间的互斥,观察并分析出现的现象。

(1)进程的创建参考程序如下:#include<stdio.h>main(){int p1,p2;while((p1=fork())==-1); //p父进程p1子进程1if(p1!=0){while(((p2=fork())==-1); //p父进程p2子进程2if(p2==0) putchar('b');else putchar('c');}else putchar('a');}运行结果:略cab bca bac分析:原因:Fork()函数有三个返回值:1.-1 执行不成功2.0 表示当前正在执行子进程3.其他数值表示当前正在执行父进程,值是子进程的进程标识符PID4.获取当前进程的标识符getpid()5.获取当前进程的父进程的标识符getppid()(2)进程的控制参考程序如下#include<stdio.h>main(){int p1,p2,i;while ((p1=fork())==-1); // 父进程p,子进程p1if(p1==0){for(i=0;i<500;i++)printf("child_p1_ %d\n",i);}else{while((p2=fork())==-1);//父进程p,子进程p2if(p2==0)for(i=0;i<500;i++)printf("chind_p2_ %d\n",i);else for(i=0;i<500;i++)printf("father_p_%d\n",i);}}运行结果:略分析:由于函数printf()输出和字符串之间不会被中断,因此字符串内部的字符顺序输出不变。

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

一、实验目的
1
2
1、对理论课中学习的进程、程序等的概念作进一步的理解,明确进程和程序3
的区别;
2、加深理解进程并发执行的概念,认识多进程并发执行的实质;
4
5
3、观察进程争夺资源的现象,分析其过程和原因,学习解决进程互斥的方法;6
4、对经典的多用户、多任务的优先级轮转调度系统Linux有一定的了解;
7
5、了解Linux系统中多进程之间通过管道通信的基本原理和应用方法。

8
9
二、实验内容
10
1、用virtual虚拟机运行linux虚拟系统;
11
2、分析并理解源程序;
12
3、在linux中输入相应程序并观察运行结果。

13
14
三、实验原理
15
(一)多进程并发执行是使用后台任务来实现任务的“多进程化”。

在不加控16
制的模式下,不管有多少任务,全部都后台执行。

也就是说,在这种情况下,有17
多少任务就有多少“进程”在同时执行。

18
(二)实验中要用到的函数
19
1、fork()函数——进程创建函数。

2、getpid()函数——取得目前进程的进程标识码。

20
21
3、exit()函数——用来正常终结目前进程的执行。

22
4、sleep()函数——用来延时,它会被挂起,把处理器让给其他的进程。

23
5、printf()函数——是格式化输出函数, 一般用于向标准输出设备按规24
定格式输出信息。

25
(三)实验中要用的命令
1、cd 命令:
26
27
功能:改变工作目录。

28
语法:cd [directory]
说明:该命令将当前目录改变至directory所指定的目录。

若没有指定
29
30
directory,则回到用户的主目录。

为了改变到指定目录,用户必须拥有对指定31
目录的执行和读权限。

该命令可以使用通配符。

32
2、mkdir命令:
33
功能:创建一个目录(类似MSDOS下的md命令)。

34
语法:mkdir [选项] dir-name
35
说明:该命令创建由dir-name命名的目录。

要求创建目录的用户在当前目录36
中(dir-name的父目录中)具有写权限,并且dirname不能是当前目录中已有37
的目录或文件名称。

38
3、ls 命令:
功能:ls是英文单词list的简写,其功能为列出目录的内容。

这是用户最常
39
40
用的一个命令之一,因为用户需要不时地查看某个目录的内容。

该命令类似于
41
DOS下的dir命令。

42
语法:ls [选项] [目录或是文件]
43
说明:对于每个目录,该命令将列出其中的所有子目录与文件。

对于每个文44
件,ls将输出其文件名以及所要求的其他信息。

默认情况下,输出条目按字母45
顺序排序。

当未给出目录名或是文件名时,就显示当前目录的信息。

46
4、vim、clear命令在这里就不做介绍了。

47
(四)实验源程序如下:
48
#include <stdio.h>
49
#include <unistd.h>
50
#include <sys/types.h>
#include <sys/wait.h>
51
52
#include <stdlib.h>
53
main(){
int pid1,pid2,i=1;
54
55
while((pid1=fork())==-1);
56
if(pid1==0){
57
printf("This is child process 1,pid=%d\n",getpid());
58
sleep(1);
59
for(i='A';i<='Z';i++){
printf("Child process1 print:%c\n",i);
60
61
sleep(1);
62
}
63
exit(0);
64
} else{
65
while((pid2=fork())==-1);
66
if(pid2==0){
67
printf("This is child process 2,pid=%d\n",getpid());
68
sleep(1);
69
for(i='a';i<='z';i++){
70
printf("Child process1 print:%c\n",i);
71
sleep(1);
72
} exit(0);
73
} else{printf("This is a parent process,pid=%d\n",getpid());
74
sleep(1);
75
for(i=1;i<=26;i++){
76
printf("Parent process print:%d\n",i);
77
sleep(1);
exit(0);
78
79
}
80
}
81
}
82
}
83
四、实验步骤
84
1、打开Virtual Box虚拟机,并运行linux操作系统;
85
2、在linux操作系统中输入相关指令如下:
86
cd /(进入根目录下);
87
ls(查询根目录下的文件);
88
mkdir mylinux(在根目录下新建一个文件夹mylinux);
89
vim jinchengbingfa.c(新建一个c文件);
90
3、进入vim编辑器,输入源程序,保存并退出;
91
4、输入gcc jinchengbingfa.c -o jinchengbingfa对文件进行编译;
92
5、./ jinchengbingfa进行调试;
93
6、调试无误后截图,然后关闭系统,实验毕。

94
95
五、实验截图
1、调试过程(截图):
96
97
2、部分程序(截图):
98
99
100
3、调试结果(截图):
101
102
103 104
六、实验心得
105
106
完成这这次实验,实话实说,花了不少心思,当然一份耕耘一分收获,到最107
后我学到不少知识。

108
通过这次实验,首先,我学会了怎么装virtual虚拟机和怎么装linux系统,109
以前,装系统对我来说,永远是渴望而不可及的事情,总觉得能装系统的人的110
都是超人,现在也让我幻想了一下超人的感觉,真的颇有成就感,我的这点小111
小的满足都是因为我们有一位很负责的老师,很耐心地指导我们实验,很细心112
地帮我们分析并改正调试过程中的种种错误,万分感谢老师。

在此,只想由衷113
地对老师说声“谢谢”,其次,我能更加熟练地运用linux常用指令,常用命114
令,最后,对进程之间的并行执行理解更加深刻!
115
最重要的是,从这次实验的过程中,让我又收获了生活赋予我的一个“幸运116
儿”,那就是希望的种子!做任何事,只要自己肯努力,肯花心思,希望就不再渺茫,梦想也不再遥远!
117
118。

相关文档
最新文档