实验一 并发程序设计实验报告1

合集下载

操作系统实验报告

操作系统实验报告

篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。

通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++6.0企业版。

三、实验内容和步骤第一部分:程序1-1windows 2000 的gui 应用程序windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。

:: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ;/* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ )return(0) ; }在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。

接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。

这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。

这一指令是visual studio c++ 编译器特有的。

接下来是winmain() 方法。

其中有四个由实际的低级入口点传递来的参数。

并行程序实验报告

并行程序实验报告

并行程序设计实验报告姓名:学号:一、实验目的通过本次试验,了解使用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号进程依次接收其它进程发送过来的消息并将其输出。

进程的创建与并发执行之一实验报告(A35)

进程的创建与并发执行之一实验报告(A35)

广州商学院操作系统实验报告(第 2 次)实验名称:进程的创建与并发执行之一实验时间:2021/3/31一.实验目的(1)理解进程与程序的联系与区别以及并发程序的基本特性。

(2)学会在在程序中使用fork() 函数创建克隆式子进程的基本编程方法。

二.实验内容命令进程的创建与并发执行三.实验主要步骤实验2.1 命令进程的创建与并发执行②启动Linux,进入黑屏界面;②在tty1上用root账号登录,在tty2和tty3上则分别以普通用户账号登录;③在tty1上输入命令“ps --help”,即在tty1上创建命令进程ps,以查看ps命令的help信息;④在tty2上输入命令“man man”,即在tty2上创建命令进程man,以查看man命令的help信息,不要终止该man命令;⑤在tty3上执行命令“man pstree”,即在tty3上创建命令进程man,查看pstree命令的help信息,同样也不要终止该man命令;⑥在tty1上执行ps命令,查看本控制台上所有进程的基本信息;⑦在tty1上执行pstree命令,查看进程的分层结构。

⑧再在tty1上执行ps命令,查看本系统的所有进程的详细信息,并从中找到并记下tty2上的man命令进程的PID;你能看到ps命令输出的全部信息吗?如果不能,可以利用Linux的“重定向”或“管道”功能,例如,可输入如下管道命令行:ps –aux | more该命令行的语义是:将ps命令的输出结果作为输入传递给more命令(分页显示),并执行more命令。

)⑨撤消tty2上的man命令进程;⑩再执行ps命令,查看被撤消的进程是否还存在;⑾切换到tty2,观察man命令是否还在执行或已终止;再切换到tty3,观察man命令是否还在执行或已终止;tty2(已经终止)tty3(未终止)⑿注销(不要关机)。

tty3tty2tty1实验2.2 使用fork创建进程本实验使用系统调用fork()创建多个子进程,实现多进程并发执行。

线程并发实验报告

线程并发实验报告

一、实验目的1. 理解线程的概念和并发编程的基本原理。

2. 掌握线程的创建、同步和通信方法。

3. 通过实验加深对线程并发编程的理解,提高编程能力。

二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C++三、实验内容本次实验主要涉及以下内容:1. 线程的创建与销毁2. 线程的同步与互斥3. 线程的通信4. 线程池的使用四、实验步骤1. 线程的创建与销毁(1)创建线程:使用C++11标准中的`std::thread`类创建线程。

```cpp#include <iostream>#include <thread>void threadFunction() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;}int main() {std::thread t1(threadFunction);std::thread t2(threadFunction);t1.join(); // 等待线程t1结束t2.join(); // 等待线程t2结束return 0;}```(2)销毁线程:线程会在任务执行完毕后自动销毁,无需手动销毁。

2. 线程的同步与互斥(1)互斥锁:使用`std::mutex`类实现线程间的互斥。

```cpp#include <iostream>#include <thread>#include <mutex>std::mutex mtx;void threadFunction() {mtx.lock();std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;mtx.unlock();}int main() {std::thread t1(threadFunction);t1.join();t2.join();return 0;}```(2)条件变量:使用`std::condition_variable`类实现线程间的条件同步。

并发服务器端程序设计实验报告

并发服务器端程序设计实验报告

河南师范大学综合性、设计性实验项目简介
Linux内置的Telnet客户端连接情况
Windows内置的Telnet客户端连接情况采用并发设计服务端程序对于多用户连接也是工作正常的:
相应的客户端端程序可以正确与服务器交互(不过客户端还是很简陋的,还没有通用性):
1、UNIX(Linux)中,终端输入在缺省情况下是被“一锅端”的,也就是说整行输入是被一起处理的。

它意味着在读入数据时必须按一下回车键表示输入行结束后才能得到输入的数据。

为了得到对每一个键盘输入的相应,我采用了system( "stty raw -echo" )来开启终端驱动的一次一字符模式。

2、由于发送缓冲区的存在,每次write之后数据不是立刻发送到对方的,可能是将多次write的数据一起送达,这就对数据过滤造成了一些麻烦。

Telnet交互类似于一种状态机模式,假如要写出健壮的程序就只好对数据包的每个字节进行分析了。

注:开课时间填本实验项目所有实验班的具体上课时间,如11月12日下午3:00-5:00。

程序并发执行实验报告

程序并发执行实验报告

一、实验目的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)简单的并发程序通过创建两个线程,实现了两个任务同时执行。

并行程序设计实验报告

并行程序设计实验报告

并行程序设计实验报告实验报告:并行程序设计一、实验目的本实验旨在通过并行程序设计,提高程序的执行效率和性能,减少串行程序在处理大规模数据时出现的效率瓶颈。

二、实验原理1.任务划分:将大规模的任务划分成多个可并行执行的子任务。

2.任务分配:将各个子任务分配给不同的计算单元(如多线程、多进程、多核)进行处理。

3.任务合并:将各个子任务的计算结果进行合并,得到最终的结果。

三、实验内容本次实验主要涉及多线程编程和数据并行编程。

1.多线程编程多线程编程是指在一个单独的程序中同时运行多个线程,利用系统的多核资源来提高程序的执行效率。

多线程编程可以通过线程的创建、启动、运行和同步等操作来实现。

在本实验中,我们将使用C++编程语言,并利用其提供的多线程库来实现多线程编程。

具体步骤如下:(1)使用pthread库创建并启动多个线程。

(2)利用线程同步机制(如互斥锁、信号量等)保证线程的正确执行顺序和数据的正确性。

(3)通过编写并行程序,将大规模任务划分成多个子任务,并分配给不同的线程进行处理。

2.数据并行编程数据并行编程是指将大规模的数据划分成多个小块,并分配给多个计算单元(如GPU)进行并行处理。

每个计算单元都执行相同的计算操作,但操作的数据不同。

在本实验中,我们将使用CUDA平台进行数据并行编程。

(1)利用CUDA编程模型,将计算任务划分成多个线程块,并分配给不同的计算单元执行。

(2)通过编写并行程序,实现数据的划分和映射、任务的分配和协调。

四、实验结果经过多次实验,我们发现并行程序设计在处理大规模数据时能够显著提高程序的执行效率和性能。

相比于串行程序,多线程编程和数据并行编程分别提高了X%和Y%的执行速度。

同时,我们也发现在设计并行程序时,要考虑到数据的划分和映射、任务的分配和协调、线程的同步和通信等方面的问题。

这些问题对于程序的性能和正确性都有着重要的影响。

五、实验总结通过本次实验,我们了解到并行程序设计的基本原理和技术,以及它在优化程序性能和提高执行效率方面的重要作用。

操作系统实验报告 并发程序设计

操作系统实验报告 并发程序设计

《计算机操作系统》实验报告(一)学号:030702412 姓名:陈楠学院:数计学院专业:计算机类年级:2007级班级:4班实验时间:2009-2010学年第一学期指导教师:丁善镜、黄志华目录1、实验题目 (3)2、实验目的 (3)3、实验环境 (3)4、实验原理 (3)5、实验内容 (3)5.1、fork()函数机理探索 (3)5.1.1、原始代码段 (3)5.1.2、代码段修改一 (3)5.1.3、结论(1) (4)5.1.4、fock()函数原理 (4)5.1.5、代码段修改二 (4)5.2、并发执行测猜测 (5)5.2.1、并发执行改进 (5)5.2.2、代码段修改(3) (5)5.3、小结 (6)1、实验题目2、实验目的掌握在程序中创建新进程的方法,观察并理解多道程序并发执行的现象。

3、实验环境Red Hat Enterprise Linux 54、实验原理fork():建立子进程。

子进程得到父进程地址空间的一个复制。

返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。

不成功时对父进程返回-1,没有子进程。

5、实验内容分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原因。

5.1、fork()函数机理探索5.1.1、原始代码段#include<stdio.h>#include<unistd.h>void main (void){ int x=5;if( fork( ) ){x+=30;printf (“%d\n”,x);}elseprintf(“%d\n”,x);printf(“%d\n”,x);}为了了解fork()函数的机理,了解fork()是从哪里开始重复执行代码,特将代码做了第一次修改5.1.2、代码段修改一#include<stdio.h>#include<unistd.h>图1 验证fork()函数原理 图2 验证是否共享内存 void main (void){ int x=5;printf(“start \n”);if( fork( ) ){x+=30;printf (“father %d \n”,x);}elseprintf(“child %d \n”,x);printf(“out%d \n”,x);}右侧为第一次修改后代码的输出(图1)5.1.3、 结论(1)fock() 对于该语句之前的程序段只执行一次fock() 对于该语句返回两次值,并针对两次返回值依次执行之后的语句5.1.4、 fock()函数原理 被fork 创建的新进程叫做自进程。

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

实验一并发程序设计实验报告
1.目的
在单处理器环境下,实现多任务的核心是并发程序设计,进程的并发执行提高了CPU 的利用率,使得CPU与设备并行、设备与设备并行成为可能。

但并发执行也存在许多单任务中所没有的问题,其中之一是互斥和同步的控制。

2.要求
题目:在BACI环境下,对程序并发执行的实验:(1)没有控制时正确的程序执行的结果不正确;(2)BACI中PV操作的并发控制的实现。

内容:
第一题
程序:
semaphore s=1;
int count=100;
void pa()
{
int x;
p(s);
x=count;
x=x+1;
count=x;
v(s);
}
void pb()
{
int y;
p(s);
y=count;
y=y-1;
count=y;
v(s);
}
void main()
{
cout<<"begin count="<<count<<endl;
cobegin{pa();pb();}
count<<"end count="<<count<<endl;
}
程序运行结果:
第二题:
(1)一开始堆栈的初始值都为-1。

(2)原程序执行3次的截图
(3)可见该程序是错的。

(4)修改完的代码:
int stack[20];
int top;
semaphore s;
void getspace()
{
int x;
p(s);
x=stack[top];
top--;
cout<<" Out : "<<x<<endl;
v(s);
}
void release(int ad)
{
p(s);
top++;
stack[top]=ad;
cout<<" In : "<<ad<<endl;
v(s);
}
void main()
{
int i;
initialsem(s,1);
for(i=0;i<20;i++)
stack[i]=-1;
stack[0]=0;
stack[1]=156;
stack[2]=254;
stack[3]=129;
stack[4]=23;
top=4;
cobegin{getspace();release(100);}
cout<<"Top ="<<top<<endl;
for(i=0;i<=top;i++)
cout<<"Stack["<<i<<"] = "<<stack[i]<<endl;}
(1)修改完的执行结果:
第三题:
程序:
semaphore s;
semaphore n1;
semaphore n2;
semaphore s3;
int x;
void R(){
p(empty);
cout<<"x=";
cin>>x;
if(x%2==0)
v(n2);
else v(n1);}
}
void W1(){
p(n1);
p(s3);
cout<<"W1 print x="<<x<<endl; v(s3);
v(empty);
}
void W2(){
p(n2);
p(s3);
cout<<"W2 print x="<<x<<endl; v(s3);
v(empty);
}
void main(){
initialsem(empty,1); initialsem(n1,0);
initialsem(n2,0);
initialsem(s3,1);
cobegin{R();W1();W2();}
}
执行结果:
实验心得体会:我的底子很差,做起实验很吃力在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间.比如运行时候,你要清楚各个运行的指令,如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半.做实验时,一定要耐心仔细每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做.做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛.
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.。

相关文档
最新文档