实验一 并发程序设计实验报告1
- 格式:doc
- 大小:117.50 KB
- 文档页数:5
篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对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号进程依次接收其它进程发送过来的消息并将其输出。
广州商学院操作系统实验报告(第 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 创建的新进程叫做自进程。
一、实验背景与目的随着计算机技术的发展,多任务处理和多进程并发已经成为操作系统设计中的基本要求。
为了更好地理解进程并发的基本原理和实现方法,我们进行了本次实验。
实验的目的是通过实践操作,加深对进程并发执行的理解,掌握进程创建、同步、互斥等基本概念,并学会使用相关系统调用实现进程的并发控制。
二、实验环境与工具实验环境:Windows 10操作系统,Visual Studio 2019开发环境。
实验工具:C++编程语言,WinAPI系统调用。
三、实验内容与步骤本次实验主要分为以下几个部分:1. 进程创建与并发执行- 使用CreateProcess函数创建多个进程,并观察它们的并发执行情况。
- 使用GetTickCount函数获取每个进程的执行时间,分析并发执行的效果。
2. 进程同步- 使用互斥锁(mutex)实现进程间的同步,确保同一时刻只有一个进程访问共享资源。
- 使用条件变量(condition variable)实现进程间的条件同步,实现生产者-消费者模型。
3. 进程互斥- 使用信号量(semaphore)实现进程间的互斥,避免资源竞争。
- 使用临界区(critical section)保护共享资源,防止多个进程同时访问。
4. 实验分析- 分析实验结果,总结进程并发、同步和互斥的原理和方法。
- 讨论实验中遇到的问题和解决方法。
四、实验代码示例以下是一个简单的实验代码示例,演示了使用互斥锁实现进程同步的过程:```cpp#include <windows.h>#include <iostream>using namespace std;// 全局互斥锁mutex mtx;void processFunction(){unique_lock<mutex> lock(mtx);cout << "Process " << GetCurrentProcessId() << " is running." << endl;lock.unlock();}int main(){// 创建两个进程CreateProcess(NULL, "process.exe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);// 主进程继续执行cout << "Main process is running." << endl;return 0;}```五、实验结果与分析1. 进程创建与并发执行通过实验,我们观察到多个进程可以并发执行,并且每个进程的执行时间都会有所不同。
Java程序设计实验报告一.实验要求1.实验一:Java程序的编辑、编译和运行(1)了解java语言特点,掌握JDK环境中编译、运行程序的操作。
(2)熟悉EditPlus编辑器的使用。
(3)掌握Java Application的程序结构和开发过程。
(4)了解Java程序文件名和类名的说明方法。
2.实验二:Java程序设计基础(1)了解Java 的数据类型;(2)掌握各种变量的声明方式;(3)理解运算符的优先级;(4)掌握Java 基本数据类型、运算符与表达式、数组的使用方法;(5)理解Java 程序语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法;(6)熟练掌握数组的使用(7)通过以上内容,掌握Java 语言的编程规则。
3.实验三:类的封装性设计(1)掌握从实体中抽象类与对象的方法(2)掌握定义类、创建对象、使用类与对象(3)掌握类及其成员的修饰符的使用(4)掌握构造函数的使用。
4.实验四:类的继承性与多态设计(1)掌握类的继承机制(2)熟悉类中成员的访问控制(3)掌握方法的多态性5.实验五:Applet小程序图形用户界面设计(1)掌握Java 的GUI 设计技术,(2)掌握AWT 和Swing 的应用技巧。
(3)掌握布局管理器(4)掌握事件处理的方法。
(5)掌握Java小程序的特点和编写方法。
二.实验内容1.实验一:java程序的编辑、编译和运行。
(1)使用EditPlus编写源程序(2)编写两个Java Application程序(A)输出一行文字“Hello,JAVA!”用消息对话框显示文本信息。
(B)找出教材复习题1.16中程序的错误,上机调试验证、修改得出正确输出结果。
A.错误程序public class Wlecome{public void Main(string[] args){System,out.println("Welcome to Java!);}}B.修改后程序public class Wlecome{public static void main(String[] args){System.out.println("Welcome to Java!");}}C.运行结果2实验二:分别使用while、do-while和for语句编程,找出所有的水仙花数并输出。
一、实验目的1. 了解并发执行的概念和原理。
2. 学习并发编程技术,提高程序执行效率。
3. 通过实验验证并发执行对程序性能的影响。
二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:IntelliJ IDEA4. 并发框架:Java并发包(java.util.concurrent)三、实验内容1. 实验一:线程同步2. 实验二:线程池3. 实验三:并发容器4. 实验四:Future和Callable四、实验步骤1. 实验一:线程同步(1)创建一个共享资源,用于模拟多个线程对资源的访问。
(2)使用synchronized关键字实现线程同步。
(3)比较同步前后程序执行时间。
2. 实验二:线程池(1)创建一个线程池,并提交多个任务到线程池中执行。
(2)比较线程池和普通线程执行任务的效率。
3. 实验三:并发容器(1)使用并发容器(如ConcurrentHashMap)和普通容器(如HashMap)进行数据操作。
(2)比较两种容器在并发环境下的性能差异。
4. 实验四:Future和Callable(1)使用Callable接口和Future接口实现异步计算。
(2)比较使用Future和Callable前后程序执行时间。
五、实验结果与分析1. 实验一:线程同步实验结果显示,在同步前,程序执行时间为5秒;在同步后,程序执行时间为2秒。
这说明线程同步可以有效地提高程序执行效率。
2. 实验二:线程池实验结果显示,在普通线程环境下,程序执行时间为10秒;在线程池环境下,程序执行时间为6秒。
这说明线程池可以显著提高程序执行效率。
3. 实验三:并发容器实验结果显示,在并发环境下,使用并发容器(如ConcurrentHashMap)的平均执行时间为1秒,而使用普通容器(如HashMap)的平均执行时间为3秒。
这说明并发容器在处理并发操作时具有更好的性能。
4. 实验四:Future和Callable实验结果显示,使用Future和Callable接口实现异步计算后,程序执行时间为4秒;而同步执行程序执行时间为8秒。
c语言程序设计实验报告怎么写C语言程序设计实验报告一、实验目的二、实验环境三、实验内容1. 实验一:C语言基础练习2. 实验二:流程控制语句练习3. 实验三:函数练习4. 实验四:数组和指针练习四、实验过程及结果分析1. 实验一过程及结果分析a. 编写程序代码的步骤及思路b. 程序运行结果及分析2. 实验二过程及结果分析a. 编写程序代码的步骤及思路b. 程序运行结果及分析3. 实验三过程及结果分析a. 编写程序代码的步骤及思路b. 程序运行结果及分析4. 实验四过程及结果分析a. 编写程序代码的步骤及思路b. 程序运行结果及分析五、总结与体会一、实验目的本次实验旨在通过对C语言基础知识的学习,掌握C语言编程技能,提高编程能力。
同时,通过对不同类型题目的练习,培养学生解决问题和思考问题的能力。
二、实验环境本次实验使用的是Visual Studio 2019开发环境,操作系统为Windows 10。
三、实验内容本次实验共分为四个部分,分别是C语言基础练习、流程控制语句练习、函数练习和数组和指针练习。
具体内容如下:1. 实验一:C语言基础练习a. 编写一个程序,输入两个整数,输出它们的和、差、积和商。
b. 编写一个程序,输入一个三位数的整数,将其百位数与个位数交换后输出。
c. 编写一个程序,输入六个整数,按照从小到大的顺序输出。
2. 实验二:流程控制语句练习a. 编写一个程序,输入两个整数a和b,如果a>b则交换它们的值,并输出结果。
b. 编写一个程序,输入三个整数a、b和c,求出其中最大值并输出。
c. 编写一个程序,输入一个字符c,如果它是大写字母,则将其转换成小写字母并输出;如果它是小写字母,则将其转换成大写字母并输出;否则不做处理。
3. 实验三:函数练习a. 编写函数sum(n),计算1到n之间所有整数的和,n由用户输入。
b. 编写函数isprime(n),判断一个整数n是否为素数,n由用户输入。
《C程序设计》实验教学大纲一、适用范围大纲适用信息管理专业本科教学使用。
二、课程名称C程序设计三、学时数与学分总学时:90 总学分:4实验学时:28 实验学分:1四、教学目的和基本要求目的:通过C程序设计实验,培养学生对学习程序设计的兴趣,加深对讲授内容的理解,尤其是通过上机来掌握语法规则,使学生全面了解 C 语言的特点,熟练掌握 C 语言程序设计的基本方法和编程技巧。
基本要求:了解和熟悉C语言程序开发的环境;学会上机调试程序,善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行,达到实验知识和理论知识的融会贯通。
上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止,上机结束后,应整理出实验报告。
注:带*的实验项目为选做实验项目六、教材、讲义及参考书《C程序设计题解与上机指导》谭浩强主编清华大学出版社七、实验成绩评定办法实验成绩=平时实验表现+实验报告。
实验成绩占总成绩的20%。
实验成绩以等级形式给出,评定等级分优、良、中、及格、不及格五类。
1、平时考核:上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止。
在实验中,教师可根据学生编程操作能力、观察和分析及运用知识能力、程序编制正确性以及学生的课堂纪律、实验态度、保持实验室卫生等方面的表现进行综合考核。
2、实验报告:学生实验后应按时完成实验报告。
八、实验教学大纲说明本大纲共安排28学时的实验,其中带*号实验项目为选做实验项目,实际课时为18学时。
实验项目多为设计性实验项目,每个设计性实验项目中都包含数个小的设计性题目,其中带*号的题目为选做题目,有时间和有能力的同学可以选做。
九、实验项目实验一C程序的运行环境和运行一个C程序的方法一、实验目的1.了解Visual C++6.0编译系统的基本操作方法,学会独立使用该系统。
2.了解在该系统上如何编辑、编译、连接和运行一个C程序。
《操作系统实验指南》实验一并发程序设计一、实验目的掌握Windows环境下,多进程并发程序设计方法,并通过程序的运行结果来验证分时系统和并发程序设计的优越性。
二、实验要求熟悉Windows操作系统及VC++程序设计方法三、实验内容在单进程(单用户、单任务)运行时,系统资源为单进程所独占,当进程在读/写磁盘文件时,CPU是处于等待I/O完成的空闲状态,因此造成较大的资源浪费。
在多进程运行(多任务)时,当某进程在等待I/O结果时,可以自动阻塞(blocked)起来,CPU可选择另一个就绪(ready)进程来执行,从而提高系统的运行效率,增加系统的吞吐量,提高系统交互操作性能。
本实验设计两个进程,WriteFile(写U盘)进程和Calculate(计算)进程,每个进程大约费时5秒。
设计两进程顺序执行程序,并测试所需时间。
设计两进程并发执行程序,并测试所需时间。
四、Windows及VC++并发程序设计简介1、Windows进程简介在Windows环境下,一个执行文件(*.exe)在执行时被看成是一个进程,即在Windows中最小的进程单位为执行文件。
但Windows是一个多任务的环境,允许多个执行文件(进程)同时(并发)运行。
2、VC++并发程序设计简介⑴、在程序中启动一个执行文件采用WinExec(LPCSTR lpCmdLine, UNIT uCmdShow)函数可启动一个执行文件的运行。
其中,lpCmdLine表示一个命令行,uCmdShow表示执行文件窗口显示特性。
最简洁的启动运行函数形式为:WinExec(“*.exe”, NULL);⑵、创建进程采用CreateProcess( LPCTSTR lpszImageName, // 执行文件名(进程名)LPCTSTR lpszCmdLine, // 命令行(参数)LPSECURITY_ATTRIBUTES lpsaProcess, // 进程安全属性LPSECURITY_ATTRIBUTES lpsaThread, // 线程安全属性BOOL bInheritHandles, // 继承特性DWORD fdwCreate, // 进程类型和优先级LPVOID lpvEnvironment, // 环境变量,由SET设置LPTSTR lpszCurrentDir, // 当前目录LPSTARTUPINFO lpStartupInfo, // 进程开始信息LPPROCESS_INFORMATION lpProcInfo) // 进程创建返回信息函数可创建一个进程。
操作系统实验⼀:并发程序设计---恢复内容开始---⼀、实验⽬的(1)加深对进程并发执⾏的理解,认识多进程并发执⾏的实质。
(2)观察进程共享资源的现象,学习解决进程互斥和同步的⽅法。
⼆、实验要求:本实验要求⽤⾼级语⾔,启动多进程并发运⾏,设计相应代码,显⽰进程⽆关并发、进程共享变量并发的运⾏结果。
并完成实验报告。
三、实验内容:分别实现以下四种情况的并发:1.并发的进程之间⽆关,显⽰进程名称,开始与结束时间。
模拟多终端售票情况,并发的多个终端进程之间共享剩余票数这个共享变量。
2.⽤全局变量实现。
3.⽤进程间共享数据机制实现。
4.⽤进程间共享数据机制和加锁机制实现。
四、实验过程与结果1. 算法思想与设计2. 算法实现代码3. 运⾏结果public class ThreadTest3 {public static void main(String[] args) {Shop shop = new Shop();for (int i = 1; i <= 5; i++) {new Thread(shop,"").start();}}}class Shop implements Runnable{String name;ticket t;public Shop() {t.total = 100;t.count = 0;}public void run() {while (t.total>0) {synchronized (this) {try {Thread.sleep(new Random().nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"_____"+t.count);t.total--;t.count++;}}}}class ticket {int total;int count;}通过共享变量实现import osimport threadingtickis=1000lock=threading.Lock()def sale_tickis(thread_name):global tickisglobal lockwhile 1:lock.acquire()if tickis!=0:tickis-=1print(thread_name,"余票为:",tickis)else:print(thread_name,"票卖完了")os._exit(0)lock.release()class my_thread(threading.Thread):def__init__(self,name=""):threading.Thread.__init__(self)=namedef run(self):sale_tickis()if__name__=="__main__":for i in range(1,21):thread = my_thread("线程" + str(i))thread.start()。
实验一并发程序设计实验报告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();}}执行结果:实验心得体会:我的底子很差,做起实验很吃力在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间.比如运行时候,你要清楚各个运行的指令,如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半.做实验时,一定要耐心仔细每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做.做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛.通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.。
实验一并发程序设计实验报告
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();}
}
执行结果:
实验心得体会:我的底子很差,做起实验很吃力在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间.比如运行时候,你要清楚各个运行的指令,如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半.做实验时,一定要耐心仔细每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做.做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛.
通过这次测试技术的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅.。