- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
快速的排序问题
操作系统
快速排序 问题
懿
问题描述
对于有个乱序数据的数据文件执行快速排序 。
实验环境
本实验在 环境下实现 。
实验步骤
首先产生包含个随机数 (数据类型可选整型或者浮点型)的数据文件;
每次数据分割后产生两个新 的进程 (或线程)处理分割后的数据,每个进程 (线程)处理
的数据小于以后不再分割 (控制产生的进程在个左右);
线程 (或进程)之间的通信可以选择下述机制之一进行:
管道 (无名管道或命名管道)
消息队列
共享内存
通过适当的函数调用创建上述对象,通过调用适当的函数调用实现数据的读 出与写入;
需要考虑线程 (或进程)间的同步;
线程 (或进程)运行结束,通过适当的系统调用结束线程 (或进程)
解决思路
由于快速排序算法具有可分治 的特点,通过建立多线程并发进行排序可以达到加速的效
果。首先建立一个线程对原数据进行划分 ( ),得到两个区间分别建立两个线程进行
处理,直到数据数小于时不再划分,而是 自己完成排序 。这里遇到了一个问题,就是要控
制线程数在个左右。考虑到数据量较大,若按上述方法需要 同时建立远远超过个线程,只
用个线程则可能因为各线程均未到达长度小于的区间而产生死锁。故需要加入对线程的
分配机制。
操作系统
这里考虑静态建立个线程,同时建立一个队列 ,队列中的元 为待排序 区间的
首尾序号。为队列元 设置一个资源信号量,表示 队中元 个数,初始值为 。初始时将整个
数据的首尾加入 队列。每个线程执行函数从队中取出元 ,若 区间长度小于,则完成排
序 ,否则继续划分,并将得到的两个区间加入 队列,这样可以使线程数被控制在个并且不产
生死锁。
对于判断排序结束,可以设置一个共享变量记录已经排好序 的数据的数量,每
一次划分加,每次排序加 ,当增加到总数据个数时,将标志
量置为 ,即可通知各线程终止 。
每个线程执行的程序 的伪代码如下:
CODE 1: Function for each thread
void Parallel_Quicksort(char* shrmem)
{
// shrmem is the name of shared memory
HANDLE hMapSrc;
hMapSrc = OpenFileMapping(shrmem);
// get the starting address of the mapped view.
int *pBuf = (int *)MapViewOfFile(hMapSrc, BUF_SIZE);
/* Waiting to get sorting job from
the unsorted queue while sort not finished*/
while (!End P(N_unsorted))
{
P(queue);
// fetch job from unsorted
Param param0 = unsorted.front()
文档评论(0)