操作系统实验(线程同步)附完整代码

  • 实验目的

掌握信号量的实现与应用

FAQ

二、实验内容

互斥:EPOS运行于单CPU的计算机上,内核可以用开关中断实现互斥。中断的开关由EFLAGS中的IF位决定,使用指令sti令IF=1,中断打开,指令cli令IF=0,中断关闭。但一般不直接用sti/cli,而是用函数save_flags_cli(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保护。

信号量的实现:编辑文件kernel/sem.c,实现四个函数int sys_sem_create(int value)、int sys_sem_destroy(int semid)、int sys_sem_wait(int semid)、int sys_sem_signal(int semid),把这四个函数做成系统调用,分别是sem_create/destroy/wait/signal。

具体步骤如下:

  • Step1:实现信号量并做成系统调用
  • Step2:模拟实现生产者和消费者,在图形模式下将屏幕沿垂直方向分成N份,作为N个缓冲区。其次,创建两个线程,其中一个是生产者,负责生成随机数并填到缓冲区中;另一个线程是消费者,负责把缓冲区中的随机数进行排序。生产者生成随机数后,要画到缓冲区,消费者完成排序之后,要清除缓冲区。
  • Step3:创建一个控制线程,用键up/down控制生产者的优先级,用键right/left控制消费者的优先级,把控制线程的静态优先级设置到最高,以保证控制效果,在屏幕上用进度条动态显示生产者和消费者的静态优先级
  • Step4:在main.c文件中测试上述功能是否实现。

三、使用仪器、材料

编译器、链接器、调试器

GCC、LD、GDB

PC模拟器(虚拟机)

Qemu

 

四、实验过程原始记录(数据、图表、计算等)

  • Step1实现信号量并做成系统调用
    • 在“kernel.h”文件中,编写信号量结构体,并声明四个函数int sys_sem_create(int value)、int sys_sem_destroy(int semid)、int sys_sem_wait(int semid)、int sys_sem_signal(int semid)

    • 在文件“sem.c”中实现int sys_sem_create(int value)函数编写

    • int sys_sem_destroy(int semid)函数编写

    • int sys_sem_wait(int semid)函数编写

    • int sys_sem_signal(int semid)函数编写

    • include/syscall-nr.h中,定义系统调用号码

    • kernel/machdep.c的函数syscall中,增加“case ”分支

    • userapp/lib/syscall-wrapper.S末尾,加入汇编语言接口

    • userapp/include/syscall.h中,加入C语言声明函数

  • Step2模拟实现生产者和消费者
    • 生产者线程的实现

    •  消费者线程的实现

    •  其中的drawsort函数和wipe函数

  • Step3创建控制线程

          

  • Step4测试上述功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值