重庆大学生软件测试大赛,重庆大学操作系统实验三(线程同步)

《重庆大学操作系统实验三(线程同步)》由会员分享,可在线阅读,更多相关《重庆大学操作系统实验三(线程同步)(9页珍藏版)》请在人人文库网上搜索。

1、重 庆 大 学学 生 实 验 报 告实验课程名称 操作系统原理 开课实验室 重庆大学DS1501 学 院 软件工程 年级 2013 专业班 学 生 姓 名 学 号 开 课 时 间 2015 至 2016 学年第 一 学期总 成 绩教师签名洪明坚重庆大学软件学院制操作系统原理实验报告开课实验室:DS1501 2016 年 1月 7 日学院软件学院年级、专业、班姓名成绩课程名称操作系统原理实验项目名 称线程同步指导教师教师评语教师签名:年 月 日 实验目的(软件需求文档)掌握信号量的实现与应用二、实验原理(软件设计文档)互斥的实现 一般不直接用sti/cli,而是用 save_flags_cli(。

2、flags)保存EFLAGS的值到一个变量flags中,然后IF=0 restore_flags(flags)把变量flags的值恢复到EFLAGS中线程的睡眠和唤醒 睡眠 void sleep_on(struct wait_queue *head) 参数head是睡眠队列的头指针的指针 唤醒 void wake_up(struct wait_queue *head, int n) 参数n表示要唤醒的线程个数 n小于0表示唤醒该队列中的所有线程 sleep_on和wake_up必须在关中断环境中运行 用save_flags_cli/restore_flags保护实现信号量编辑文件epos/se。

3、m.c,实现如下四个函数void *sys_sem_create(int value)value是信号量的初值分配内存要用kmalloc,不能用malloc!成功返回信号量句柄hsem,否则返回NULLint sys_sem_destroy(void *hsem)释放内存要用kfree,不能用free!成功返回0,否则返回-1int sys_sem_wait(void *hsem)P操作,要用save_flags_cli/restore_flags和函数sleep_on成功返回0,否则返回-1int sys_sem_signal(void *hsem)V操作,要用save_flags_cli/。

4、restore_flags和函数wake_up成功返回0,否则返回-1把这四个函数做成系统调用,分别是sem_create/destroy/wait/signal解决实验(二)中的花屏现象在graphics.c中,定义一个表示信号量的全局变量static void *hsem = NULL;分别在函数initGraphics和exitGraphics中创建和销毁信号量hsem在函数setPixel中,用信号量hsem保护下面的临界区switchBank(HIWORD(addr);*p = getBValue(cr);*(p+1) = getGValue(cr);*(p+2) = getRVal。

5、ue(cr);实现生产者/消费者生产者生成随机数后,要画到缓冲区消费者排序后,要清空缓冲区三、使用仪器、材料(软硬件开发环境)Notepad+expenv四、实验步骤(实现的过程)/定义信号量结构体struct semaphoreint value;/*processes blocked by this semaphore*/struct wait_queue *wq_kbd;sem.c:void *sys_sem_create(int value)struct semaphore *hsem;char *p;p = (char *)kmalloc(sizeof(struct semaphor。

6、e);hsem = (struct semaphore *)p;hsem-value=value;/赋初值hsem-wq_kbd = NULL;/!非常重要!if(hsem=NULL)return NULL;else return (struct semaphore *)hsem;/成功返回信号量句柄hsemint sys_sem_destroy(void *hsem)kfree(hsem);return 0;int sys_sem_wait(void *hsem)uint32_t flags;save_flags_cli(flags);(struct semaphore*)hsem)-val。

7、ue-;/P操作if(struct semaphore*)hsem)-value wq_kbd);restore_flags(flags);return 0;int sys_sem_signal(void *hsem)uint32_t flags;save_flags_cli(flags);(struct semaphore*)hsem)-value+;/V操作if(struct semaphore*)hsem)-valuewq_kbd), 1);/等待队列中唤醒一个线程restore_flags(flags);return 0;把这四个函数做成系统调用 sem_create/destroy/。

8、wait/signalgraphics.c中/定义一个表示信号量的全局变量static void *hsem = NULL;hsem=sem_create(1);/创建信号量sem_destroy(hsem);/销毁信号量以及sem_wait(hsem);/用信号量hsem保护画点临界区switchBank(HIWORD(addr);*p = getBValue(cr);*(p+1) = getGValue(cr);*(p+2) = getRValue(cr);sem_signal(hsem);main.c:声明信号量:# define arrayNumber 50 #define N 4 /。

9、缓冲区数static void* mutex = NULL; /互斥信号量 static void* full = NULL; /已生产产品数static void* empty = NULL; /空闲数int startposition = 0; /生产者缓冲区坐标static int count = 0; /消费者缓冲区坐标int temp450 = 0 ;int arrayNarrayNumber;生产者消费者函数:void tsk_producer(void *pv)while (1)int i = 0;srand(unsigned)time(NULL);sem_wait(empty)。

10、;/是否有空闲位置?sem_wait(mutex);for (i = 0; i = arrayNumber - 1; i+)arraystartpositioni = random() % 200;draw(i * 10, startposition * 230, startposition * 230 + arraystartpositioni);DELAY();startposition = (+startposition) % N;sem_signal(mutex);sem_signal(full);/有产品生产好task_exit(0);void tsk_consumer(void *。

11、pv)while (1)sem_wait(full);/还有产品么?sem_wait(mutex);int i;for (i = 0; i = arrayNumber - 1; i+)tempcounti = arraycounti;sem_signal(mutex);/让出临界区使生产与消费并行sort_m(tempcount, arrayNumber, count * 230); /冒泡排序resetAllBK(tempcount, arrayNumber, count * 230); /清空该缓冲区count=(+count)%N;sem_signal(empty);/消费完一个产品ta。

12、sk_exit(0);主函数:int value = 1;mutex = sem_create(value);value = 0;full = sem_create(value);value = N;empty = sem_create(value);initGraphics(0x0118);unsigned char *stack_producer = (unsigned char*)malloc(1024 * 1024);unsigned char *stack_consumer = (unsigned char*)malloc(1024 * 1024);int tid_producer 。

13、= task_create(stack_producer + 1024 * 1024, tsk_producer, (void *)0);int tid_consumer = task_create(stack_consumer + 1024 * 1024, tsk_consumer, (void *)0);int setResult1 = setpriority(tid_producer, 2);int setResult2 = setpriority(tid_consumer, 2);五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)empty = sem_cre。

14、ate(value);initGraphics(0x0118);unsigned char *stack_producer = (unsigned char*)malloc(1024 * 1024);unsigned char *stack_consumer = (unsigned char*)malloc(1024 * 1024);int tid_producer = task_create(stack_producer + 1024 * 1024, tsk_producer, (void *)0);int tid_consumer = task_create(stack_consumer + 1024 * 1024, tsk_consumer, (void *)0);int setResult1 = setpriority(tid_producer, 2);int setResult2 = setpriority(tid_consumer, 2);五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)通过互斥量保护Setpixel解决了实验二优先级调度的花屏现象通过做本实验,我对书本上信号量概念有了实践性的理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值