电 子 科 技 大 学
作 业 报 告
一、作业名称
期末作业:
编写一个线程池,实现对海量数据排序输入:给定一个目录,其中包含大量的普通文件每个文件中又包含了大量的数据每个数据都是64位的有符号数文件/数据格式可自由设定,数据随机生成典型设置:所有文件包含的总的数据量达到128GB每个文件包含的数据个数并不平均,其空间占用量少的可能仅几十KB,多的可能上GB文件个数可以达到10万个输出:按照从小到大的顺序,将排好序的数据写入到指定文件中,文件格式自定义限制用于缓存文件数据、中间排序结果的内存远小于128GB,比如只能使用64MB缓存要求建立一个包含若干线程的线程池,可以按照归并排序思路,在多线程间完成排序,程间交换数据按照粗粒度锁、免锁、无锁实现方式,从低到高综合评分,要尽可能减少数据复制操作
二、作业要求
需要写明自己对该作业需求的理解,明确作业目标
需要处理的数据量非常大,总数据量达到128GB,分布在约10万个文件中。每个文件包含64位有符号整数数据,文件格式和数据格式需要自定义。可用内存远小于数据总量,仅有64MB内存可用于缓存文件数据和中间排序结果。需要建立一个包含若干线程的线程池来并行处理数据。需要实现一个排序算法,考虑到数据量和内存限制,选择归并排序。
第一次尝试使用pthread库处理,出现无法解析符号错误,原因在于我使用MinGW,需要使用静态链接phtread库。转换思路,使用Visual Studio自带的线程进行实现
三、设计与实现
给出自己的设计方案,可以包括模块图、类图、流程图或时序图、关键代码及分析
- 实现文件读取和数据排序
从文件中读取数据、排序数据以及将排序后的数据写入到指定文件中的逻辑。使用内存映射文件(Memory-Mapped Files)来处理大文件,以减少内存消耗。
- 为了减少锁的使用,使用原子操作和无锁编程技术,例如InterlockedExchange原子操作更新任务队列的状态
- 为了减少数据复制,通过直接在内存映射文件上操作数据来减少数据复制。此外,使用指针和引用来传递数据,不使用复制数据本身的做法。
线程池结构体定义:
typedef struct {
HANDLE mutex;
HANDLE cond;
int head;
int tail;
int count;
Task queue[MAX_QUEUE];
} ThreadPool;
四、测试
需要说明测试方案、测试代码的设计实现方案,以及测试结果,如截图等
测试程序说明
初始化线程池ÿ