夏磊 S1048035 2010 级秋季班
操作系统报告
实验 3-- 多进程(线程)实现快速排序
姓名:
夏磊
学号: S1048035
班级: 2010 级秋季班
指导教师: 陈向群、原仓周
第 1页 / 共 38页
夏磊 S1048035 2010 级秋季班
目录
操作系统报告................................................................................................... 1
1
设计思路及主要代码分析........................................................................3
1.1 实验目的...................................................................................................................................... 3
1.2 实验要求...................................................................................................................................... 3
1.3 设计思路...................................................................................................................................... 3
程序流程图 ..........................................................................................................................3
设计说明..............................................................................................................................5
程序结构设计......................................................................................................................6
1.3.1
1.3.2
1.3.3
1.4 程序代码...................................................................................................................................... 7
多线程排序 ..........................................................................................................................7
多进程排序 ........................................................................................................................18
1.4.1
1.4.2
2
实验结果及问题分析 ............................................................................. 29
2.1 多线程排序................................................................................................................................ 29
运行结果............................................................................................................................29
2.1.1
2.1.2 结果分析............................................................................................................................29
2.2 多进程排序................................................................................................................................ 30
运行结果............................................................................................................................30
结果分析............................................................................................................................31
2.2.1
2.2.2
3
4
5
实验小结............................................................................................... 31
问题回答............................................................................................... 32
附录 ...................................................................................................... 38
5.1 机器环境及配置........................................................................................................................ 38
5.2 编译环境.................................................................................................................................... 38
5.3 程序及源码................................................................................................................................ 38
第 2页 / 共 38页
夏磊 S1048035 2010 级秋季班
1 设计思路及主要代码分析
1.1 实验目的
使用多进程(线程)方式,实现快速排序,体会多进程(线程)的实
际应用中的优势。
1.2 实验要求
在 Windows 环境下,编写一个多进程(线程)进行快速排序的
程序,使用的是产生 1,000,000 个随机数的文件。
要求说明你的程序运行的系统资源配置,给出测试结果并对测试
程序和结果做出说明。
1.3 设计思路
1.3.1 程序流程图
1) 多线程排序流程图
第 3页 / 共 38页
夏磊 S1048035 2010 级秋季班
2) 多进程排序流程图
第 4页 / 共 38页
夏磊 S1048035 2010 级秋季班
1.3.2 设计说明
1) 每次数据分割后产生两个新的进程(线程)处理分割后的数据,
线程直接共享内存数据,进程间的数据交换采用内存映射文件。
2) 每个进程(线程)处理的数据小于 1000 以后不再分割(控制
产生的进程在 20 个左右)。
3) 利用一些技巧使分割尽可能均匀:比较第一个、最后一个、中
间一个,三者中中间值作为分割值。
第 5页 / 共 38页
夏磊 S1048035 2010 级秋季班
1.3.3 程序结构设计
1) 可运行程序文件
程序主要为 2 个主运行程序和 1 个子进程排序程序。
2 个主运行程序分别为:线程排序程序 FileMapSort_Thread.exe
和进程排序程序 FileMapSort_Proc.exe。
1 个子进程排序程序为:qsort_proc.exe。
2) 测试数据
程序中使用随机函数初始化 1,000,000 个测试使用的数据,写到
二进制文件 Unsorted.dat 中,然后读取到内存或内存映射文件,以
便多线程(进程)排序,排序后将结果写到二进制文件 Sorted.dat
中。
出于 IO 的性能考虑使用了二进制文件读写,另外,为了便于查
看,排序前的数据和排序后的数据分别保存在了对应的 Unsorted.txt
和 Sorted.txt 中。
3) 时间计算
由于数据量较大,时间较长,使用 GetTickCount()即可。
第 6页 / 共 38页
夏磊 S1048035 2010 级秋季班
1.4 程序代码
1.4.1 多线程排序
1) 主程序代码:FileMapSort_Thread.cpp
#include
#include
#include "functions.h"
// 数据缓冲区指针
extern int* g_pData;
// 数据量大小
extern int g_nDataCount;
// 信号量,用于控制排序线程的数目
HANDLE hSemaphoreThread = NULL;
// 事件,用于通知控制台线程排序完成
HANDLE hEventSortOver = NULL;
第 7页 / 共 38页
夏磊 S1048035 2010 级秋季班
/**
* 线程参数结构
*/
struct ThreadParam
{
int* m_pData;
int m_nLow;
int m_nHigh;
// 数据缓冲区指针
// 数据开始下标
// 数据截止下标
};
/**
* 线程函数
*/
DWORD WINAPI threadProc( LPVOID lpParam );
/**
* 主函数
*/
void main( int argc, char** argv )
{
//作业 2:进程同步机制实验——生产者消费者问题
//作者:夏磊 S1048035
//指导教师:陈向群、原仓周
printf( "==============================================================
====\n" );
printf( "
printf( "
printf( "
printf( "==============================================================
作业 2-1:多线程实现快速排序\n" );
学生:夏磊 S1048035
指导教师:陈向群、原仓周
\n" );
\n" );
====\n" );
char szFileName[80];
int nTimeGap = 0;
HANDLE hThread = NULL;
// 文件名
// 时间计数
// 线程句柄
// 初始化数据缓冲区,信号量和事件
g_pData = new int[g_nCount];
hSemaphoreThread
=
CreateSemaphore(
NULL,
g_nThreadBoundary,
g_nThreadBoundary, NULL );
hEventSortOver = CreateEvent( NULL, false, false, NULL );
if( hSemaphoreThread==NULL || hEventSortOver==NULL )
{
printf( "信号量初始化失败!\n" );
第 8页 / 共 38页