(操作系统实验)第四次说明

数字说明,解决饿死的方法

allnum 和readnum代表的含义是一样的,都是最多可以读取的数量

2 3 3 3 4

  • A

    • 如果谁都不休息的话,此时 **A B C **会一直连续不断的读,发生饥饿

    • 当A结束的时候

    • 1 12

  • 一个一个读的时候,当A结束,此时当B读取第一个的时候,2+3+3+4=12

  • 两个一起读的时候,当A结束,B,C一起读的时候,2+3+4=9

  • 当三个一起读的时候,当A结束,B,C一起读的时候,3+4=7

  • B

    • 当B结束的时候
    • 1
      • 一个一个的读的时候,当C读取第一个的时候,2+3+4=9
      • 两个一起读的时候,当C读取读取第二个的时候 1+3 +4=8
      • 三个一起读的时候,当D开始写的时候,2+4=6
  • C

    • 当C结束的时候

    • 1

      • 一个一个的读的时候,当C结束,此时为3+4-1=6

      • 两个两个读的时候,C结束,此时为6

      • 三个一起读的时候,此时为6

global.c文件

  • 修改了 task_table,将自己写的进程和标识写进了task_table
  • 删除了一些自己用不到的东西
// 0 get_tick
// 1 my_sleep
// 2 print
// 3 p
// 4 v

main.c

  • 修改了kernel_main()方法

    • 将自己所写的进程进行初始化,8个进程进行pao_table的ticks和priority的初始化
    • 加入了自己的关于进程初始化的东西,包括正在读写数量,以及读写的标识,还有允许一起读的数量
  • 删除了testA

  • 删除了testB

  • 删除了testC

  • 增加了testZ

    • 进行我们PV操作的初始化,并且运行我们的程序
  • 增加了A进程

  • 增加了B进程

  • 增加了C进程

  • 增加了D进程

  • 增加了E进程

    • A-E进程进行了自己的读写进程的调用和执行
  • 增加了F进程

    • 作用:每隔一个时间片(5000)进行当前进程打印

    • 如果是读者

      • 通过数字来查看,一共是有多少个人现在正在读
    • 如果是写者,就直接打印正在写

    • 没有其他的状态

proc.c

  • 修改了schedule函数

  • 增加了系统调用sys_MyPrint()

  • 增加了系统调用sysy_MySleep()

  • 增加了系统调用P

  • 增加了系统调用V

  • 增加了信号量的初始化函数

  • 增加了打印进程状态函数

    • printA
    • printB
    • printC
    • printD
    • printE
  • 增加了让进程睡眠的函数(为了避免饿死)

    • sleepAToNoDeadClock
    • sleepBToNoDeadClock
    • sleepCToNoDeadClock
    • sleepDToNoDeadClock
    • sleepEToNoDeadClock
  • 增加了读写的函数

    • READA
    • READB
    • READC
    • WRITED
    • WRITEE

syscall.asm

  • 增加了导出符号 P V Sleep print
  • 增加了sleep,P,V,print的C函数调用

读者优先和上述类似

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值