用多线程同步方法解决生产者消费者问题操作系统课程设计


    



    题 目
    线程步方法解决生产者-消费者问题(ProducerConsumer Problem)
    学 院
    计算机科学技术学院
    专 业
    软件工程
    班 级

    姓 名

    指导教师













    目 录
    目 录 1
    课程设计务书 1
    正 文 2
    1设计目求 2
    11设计目 2
    12设计求 2
    2设计思想系统台 2
    21设计思想 2
    22系统台语言 3
    3详细算法描述 3
    4源程序清单 6
    5运行结果运行情况 9
    6调试程 11
    7总结 12
    科生课程设计成绩评定表 13
















    课程设计务书
    学生姓名: 专业班级:
    指导教师: 工作单位: 计算机科学技术学院
    题目 线程步方法解决生产者-消费者问题 (ProducerConsumer Problem)
    初始条件:
    1. 操作系统:Linux
    2. 程序设计语言:C语言
    3. 界缓区设20存储单元初值0放入/取出数项增序设定1-2020整型数
    求完成务 (包括课程设计工作量技术求说明书撰写等具体求)
    1.技术求:
    1)生产者/消费者产生线程设计正确步算法
    2)生产者消费者界缓区进行操作时显示界缓区前全部容 前指针位置生产者/消费者线程定义标识符
    3)生产者消费者两
    4)生产者消费者间须享缓区进行操作函数代码

    2. 设计说明书容求:
    1)设计题目求
    2)总设计思想系统台语言工具等
    3)数结构模块说明(功流程图)
    4)出户名源程序名目标程序名源程序运行结果(注明存储程序 运行结果机IP址目录)
    5)运行结果运行情况
    (提示 (1)界缓区数组实现
    (2)编译命令:cc lpthread o  目标文件名  源文件名
    (3)线程编程方法参见附件)

    3 调试报告:
    1)调试记录
    2)评析总结

    机时间安排:
    18周 ~ 五 08:0 - 12:00

    指导教师签名: 年 月 日
    系(责教师)签名: 年 月 日

    正 文
    1设计目求
    11设计目
    通研究Linux线程机制信号量实现生产者消费者问题(ProducerConsumer Problem)发控制
    12设计求
    1)生产者/消费者产生线程设计正确步算法
    2)生产者消费者该存储区进行操作时显示该存储区全部容
    前指针位置生产者消费者线程定义标识符
    3)生产者消费者两
    4)生产者消费者间须享存储区进行操作函数代码
    2设计思想系统台
    21设计思想
    问题中需Mutex两Semaphore
    中Mutex锁定界区解决享数buffer互斥访问问题(生成者消费者)
    需两Semaphore问题中两稀缺资源
    第种非空种资源消费者间进行竞争
    第二种非满种资源生产者间进行竞争
    般说需锁定界区需Mutex种稀缺资源需Semaphore
    稀缺资源分析想然稀缺资源定指享资源时候指线程会阻塞条件(进界区阻塞外)
    生产者消费者问题中消费者会缓区空时阻塞非空种稀缺资源
    需设置信号量consumer_semaphore初值设0
    生产者会缓区满时阻塞非满种稀缺资源
    需设置信号量producer_semaphore初值设bufferMAX_BUFFER
    22系统台语言
    课程设计Linux操作系统C语言完成工具GCC编译器VI编辑器

    3详细算法描述
    享数:
    Semaphore buffer_mutex1
    Semaphore producer_semaphoreMAX_BUFFER
    Semaphore consumer_semaphore0
    int buffer[MAX_BUFFER]

    Producer线程处理函数:
    while(1){
    Wait(producer_semaphore)
    Wait(buffer_mutex)
    Buffer[pn]product
    pn(pn+1)MAX_BUFFER
    Signal(consumer_semaphore)
    Signal(buffer_mutex)
    Sleep()
    }



    producer线程处理函数流程图:

    consumer线程处理函数
    while(1){
    Wait(consumer_semaphore)
    Wait(buffer_mutex)
    Consumebuffer[cn]
    cn(cn+1)MAX_BUFFER
    Signal(producer_semaphore)
    Signal(buffer_mutex)
    Sleep()
    }
    consumer线程处理函数流程图:







    4源程序清单
    户名:rj070126(IP:1921682254)
    源程序名:homerj070126pcc
    目标程序名:homerj070126pc
    运行结果:homerj070126outputtxt
    源程序清单:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define NUM_THREADS_P 5 *define the number of producer*
    #define NUM_THREADS_C 5 *define the number of consumer*
    #define MAX_BUFFER 20 *define the number of buffer*
    #define RUN_TIME 20 *define the run time*
    int buffer[MAX_BUFFER] *difine the buffer *
    int produce_pointer0consume_pointer0
    sem_t producer_semaphoreconsumer_semaphorebuffer_mutex
    pthread_t threads_p[NUM_THREADS_P] *producer*
    pthread_t threads_c[NUM_THREADS_C] *consumer*
    FILE* fd
    void *producer_thread(void *tid)
    void *consumer_thread(void *tid)
    void showbuf()
    void handler(){
    int i
    for(i0i pthread_cancel(threads_p[i])
    for(i0i pthread_cancel(threads_c[i])
    }

    int main(){
    int i
    signal(SIGALRMhandler)
    fdfopen(outputtxtw) *open a file to save the result*
    sem_init(&producer_semaphore0MAX_BUFFER) *set the value of semaphores*
    sem_init(&consumer_semaphore00)
    sem_init(&buffer_mutex01)
    for(i0i buffer[i]0 *initiate the buffer*

    *create the threads*
    for(i0i pthread_create(&threads_p[i]NULL(void*)producer_thread(void*)(i+1))
    for(i0i pthread_create(&threads_c[i]NULL(void*)consumer_thread(void *)(i+1))
    alarm(RUN_TIME) *set time to run*
    *wait the threads to exit*
    for(i0i pthread_join(threads_p[i]NULL)
    for(i0i pthread_join(threads_c[i]NULL)
    *destroy the semaphores*
    sem_destroy(&producer_semaphore)
    sem_destroy(&consumer_semaphore)
    sem_destroy(&buffer_mutex)
    fclose(fd)
    return 0
    }

    void *producer_thread(void *tid){
    *the thread can be canceled by other thread*
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLENULL)
    while(1){
    sem_wait(&producer_semaphore)
    srand((int)time(NULL)*(int)tid)
    sleep(rand()2+1) *one or two seconds to produce*
    while((produce_pointer+1)20consume_pointer)

    sem_wait(&buffer_mutex)
    buffer[produce_pointer]rand()20+1
    produce_pointer(produce_pointer+1)20

    if(produce_pointer0){ *if buffer was filled to the 19th*
    printf(producerd pointer_p2d produced2d\n(int)tid19buffer[19])
    fprintf(fdproducerd pointer_p2d produced2d\n(int)tid19buffer[19])
    }
    else{
    printf(producerd pointer_p2d produced2d\n(int)tidproduce_pointer1buffer[produce_pointer1])
    fprintf(fdproducerd pointer_p2d produced2d\n(int)tidproduce_pointer1buffer[produce_pointer1])
    }
    showbuf()
    sem_post(&buffer_mutex)

    sem_post(&consumer_semaphore) *inform the consumer the buffer is not empty*
    srand((int)time(NULL)*(int)tid)
    sleep(rand()5+1) *wait a few seconds then continue producing*
    }
    return ((void*)0)
    }

    void *consumer_thread(void *tid){
    *the thread can be canceled by other thread*
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLENULL)
    while(1){
    sem_wait(&consumer_semaphore)
    srand((int)time(NULL)*(int)tid)
    sleep(rand()2+1) *one or two seconds to consume*

    sem_wait(&buffer_mutex)
    printf(consumerd pointer_c2d consumed2d\n(int)tidconsume_pointerbuffer[consume_pointer])
    fprintf(fdconsumerd pointer_c2d consumed2d\n(int)tidconsume_pointerbuffer[consume_pointer])
    buffer[consume_pointer]0
    consume_pointer(consume_pointer+1)20
    showbuf()
    sem_post(&buffer_mutex)

    sem_post(&producer_semaphore)
    srand((int)time(NULL)*(int)tid)
    sleep(rand()5+1) *wait a few seconds then continue consuming*
    }
    return ((void*)0)
    }

    *show the content of buffer*
    void showbuf(){
    int i
    printf(buffer)
    fprintf(fdbuffer)
    for(i0i printf(2d buffer[i])
    fprintf(fd2d buffer[i])
    }
    printf(\n\n)
    fprintf(fd\n\n)
    }

    5运行结果运行情况
    程序运行结果:
    producer1 pointer_p 0 produced20
    buffer20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer3 pointer_p 1 produced13
    buffer20 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer2 pointer_p 2 produced 6
    buffer20 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer4 pointer_p 3 produced14
    buffer20 13 6 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer5 pointer_p 4 produced20
    buffer20 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer2 pointer_c 0 consumed20
    buffer 0 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer1 pointer_p 5 produced20
    buffer 0 13 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer1 pointer_c 1 consumed13
    buffer 0 0 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer3 pointer_c 2 consumed 6
    buffer 0 0 0 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer4 pointer_c 3 consumed14
    buffer 0 0 0 0 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer5 pointer_c 4 consumed20
    buffer 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer3 pointer_p 6 produced 1
    buffer 0 0 0 0 0 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer2 pointer_p 7 produced14
    buffer 0 0 0 0 0 20 1 14 0 0 0 0 0 0 0 0 0 0 0 0

    consumer3 pointer_c 5 consumed20
    buffer 0 0 0 0 0 0 1 14 0 0 0 0 0 0 0 0 0 0 0 0

    producer4 pointer_p 8 produced 6
    buffer 0 0 0 0 0 0 1 14 6 0 0 0 0 0 0 0 0 0 0 0

    consumer5 pointer_c 6 consumed 1
    buffer 0 0 0 0 0 0 0 14 6 0 0 0 0 0 0 0 0 0 0 0

    producer5 pointer_p 9 produced 8
    buffer 0 0 0 0 0 0 0 14 6 8 0 0 0 0 0 0 0 0 0 0

    consumer2 pointer_c 7 consumed14
    buffer 0 0 0 0 0 0 0 0 6 8 0 0 0 0 0 0 0 0 0 0

    consumer5 pointer_c 8 consumed 6
    buffer 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0

    producer1 pointer_p10 produced18
    buffer 0 0 0 0 0 0 0 0 0 8 18 0 0 0 0 0 0 0 0 0

    consumer1 pointer_c 9 consumed 8
    buffer 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0

    producer2 pointer_p11 produced10
    buffer 0 0 0 0 0 0 0 0 0 0 18 10 0 0 0 0 0 0 0 0

    producer4 pointer_p12 produced10
    buffer 0 0 0 0 0 0 0 0 0 0 18 10 10 0 0 0 0 0 0 0

    consumer4 pointer_c10 consumed18
    buffer 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0

    producer3 pointer_p13 produced 3
    buffer 0 0 0 0 0 0 0 0 0 0 0 10 10 3 0 0 0 0 0 0

    consumer3 pointer_c11 consumed10
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 10 3 0 0 0 0 0 0

    consumer2 pointer_c12 consumed10
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0

    producer1 pointer_p14 produced 6
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 0 0 0 0 0

    consumer1 pointer_c13 consumed 3
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0

    producer2 pointer_p15 produced18
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 18 0 0 0 0

    consumer5 pointer_c14 consumed 6
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0

    producer1 pointer_p16 produced 6
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 0 0 0

    producer3 pointer_p17 produced19
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 19 0 0

    consumer1 pointer_c15 consumed18
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 0 0

    producer5 pointer_p18 produced 7
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 7 0

    consumer3 pointer_c16 consumed 6
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 0

    producer4 pointer_p19 produced14
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 14

    consumer5 pointer_c17 consumed19
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 14

    consumer4 pointer_c18 consumed 7
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14

    producer1 pointer_p 0 produced 4
    buffer 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14

    consumer2 pointer_c19 consumed14
    buffer 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    consumer1 pointer_c 0 consumed 4
    buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer2 pointer_p 1 produced15
    buffer 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer3 pointer_p 2 produced13
    buffer 0 15 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    producer2 pointer_p 3 produced 3
    buffer 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    说明:
    producer2指定义标号2producerpointer_p3指该producer指针produced3指该producerbuffer[3]里写入3buffer 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 指该producer进行写操作存储区容

    6调试程
    通次课程设计加深操作系统课程认识解操作系统中信号量解决生产者—消费者问题算法实现:信号量解决生产者—消费者问题时通界缓区(数组实现类似循环队列)生产者消费者联系起假定生产者消费者优先级相缓区未满生产者生产产品产品送入缓区类似缓区未空消费者缓区中走产品消费解决生产者消费者问题应该设置两资源信号量中表示空缓区数目producer_semaphore表示初始值界缓区SIZE_OF_BUFFER表示缓区中产品数目consumer_semaphore表示初始值0外界缓区界资源必须互斥需设置互斥信号量buffer_mutex起初值1生产者消费者问题中信号量实现两种功首先生产产品消费产品计数器计数器初始值利资源数 目(界缓区长度)次确保产品生产者消费者间动作步步器生产者生产产品时首先资源信号量producer_semaphore互斥信号量buffer_mutex进行wait操作申请资源果通话生产产品产品送入缓区然互斥信号量buffer_mutex资源信号量consumer_semaphore进行signal操作释放资源消费者消费产品时首先资源信号量consumer_semaphore互斥信号量buffer_mutex进行wait操作申请资源果通话缓区取出产品 消费掉然互斥信号量buffer_mutex资源信号量producer_semaphore进行signal操作释放资源




    7总结
    通次课程设计巩固线程编程方法信号量步进线程技巧次课程设计程序运行结果预期致说明该程序利解决生产者消费者问题实现次课程设计目
    外体会深:门知识掌握仅学理知识远远够实际动手操 作相结合达功效短短课程设计结束专业知识更深理解更认识 实践重性理实践相结合达学效果特程序语言学



    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    生产者与消费者算法模拟课程设计

    课程设计说明书题目: 生产者与消费者算法模拟 院 系: 计算机科学与工程 专业班级: 信息安全(xxxx)班 学 号: 学生...

    3年前   
    636    0

    读《用正确的得方法解决问题》有感

    读《用正确的得方法解决问题》有感解决问题就能获得机会                 ——读《用正确的得方法解决问题》有感一本好书能成为人们的良师益友,让人走出迷惘,豁然开朗。可以说在这个世界...

    10年前   
    533    0

    读《用正确的方法解决问题》有感

    读《用正确的方法解决问题》有感 最近研习了行领导为大家精心挑选的这本书,朱雪强先生的著作《用正确的方法解决问题》,受益匪浅。这本书核心思想是如何“正确的方法解决问题”,从心理因素、思考方式、...

    11年前   
    11686    0

    用比例解决问题

    用比例解决问题

    4年前   
    1099    0

    解决问题的基本方法

     解决问题的基本方法 — [七 步 成 诗] 如图所示的解决问题的七个步骤]Step 1 Step 2陈述问题 分解问题(树图)Step 3消除非关键问 题(漏斗法)Step 4制定详细的工 作计划

    9年前   
    657    0

    用估算解决问题

    用估算解决问题课题用估算解决问题课型新授课设计说明本节课教学,遵循了知识的迁移效力及学生的认知规律,让学生先独立思考,体会算法的多样化,再师生互动、生生互动、自主探究的活动中了解和掌握新知。1...

    4年前   
    1095    0

    哲学家进餐问题操作系统课程设计报告

    XX学院 《操作系统》课程设计报告题 目: 哲学家进餐问题 班 级: 学 号: ...

    2年前   
    748    0

    用最朴实的情怀解决最现实的问题

    用最朴实的情怀解决最现实的问题(标题提炼得非常精准贴切,很见功力)——重庆奉节县创新驻村帮扶“六个环节”工作法解决“两不愁三保障”突出问题我们深学笃用总书记重要讲话精神,推行驻村帮扶到户看院子...

    4年前   
    678    0

    水泵检修常见问题及解决方法

    培训讲演稿悬臂式水泵我车间主要有;网路疏水泵、锅炉疏水泵、生产返回水泵及4号机伏水泵、射水泵等 悬臂式水泵主要特点;单级、单吸、悬臂式。 容易出现的几个问题;第一、 水泵电流大,泵体内产生磨擦...

    7个月前   
    259    0

    电子印章框架问题以及解决方法汇总

    电子印章框架问题以及解决方法汇总

    6年前   
    6153    0

    关于全市招投标工作的主要成绩、存在的问题及对解决问题方法的建议

    关于全市招投标工作的主要成绩、存在的问题及对解决问题方法的建议 在市委市政府的正确领导和各行政监督部门的共同努力下,我市招投标市场得到了较大的发展,进一步加强了对招投标活动的行政监督,进一步...

    11年前   
    11295    0

    进程调度算法的实现计算机操作系统课程设计

    题目2 进程调度算法的实现2.1 题目的主要研究内容及预期达到的目标(1)设计进程控制块; (2)设计多个进程队列; (3)设计多个进程(≥20); (4)动态生成时间片、执行时间和优先级,...

    3年前   
    580    0

    驱动程序实验报告操作系统课程设计报告

    操作系统课程设计报告班级: 计科 姓名: 学号: 老师: 时间:2012年X月X日一、设计目的操作...

    1年前   
    295    0

    操作系统课程设计磁盘调度算法

    操作系统课程设计磁盘调度算法目 录1 课程设计目的及要求……………………………………………………12 相关知识…………………………………………………………………13 ...

    3年前   
    545    0

    操作系统课程设计银行家算法报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级:计科班 ...

    3年前   
    615    0

    操作系统课程设计银行家算法的模拟实现

    操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期信息工程学院题目: 银行家算法的模拟实现 一、设计目的本课程设计是学习完“操作系统原理”课程后进...

    3年前   
    678    0

    操作系统课程设计磁盘调度算法

    《计算操作系统》课程设计报告 姓名: ...

    3年前   
    460    0

    合工大页面置换算法操作系统课程设计报告

    计算机与信息学院《操作系统综合设计》报告设计题目:页面置换算法学生姓名:学 号:专业班级:计算机科学与技术班2015 年 X月一、设计题目 3二、开发环境与工具 3三、设计原理 31....

    3年前   
    555    0

    《操作系统 银行家算法》课程设计报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级: 计科班 ...

    3年前   
    807    0

    银行家算法《操作系统》课程设计报告

    《操作系统》课程设计报告课题: 银行家算法 专业计算机科学与技术学生姓名班级计算机学号指导教师信息工程...

    3年前   
    692    0

    文档贡献者

    文***享

    贡献于2020-11-29

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档