数字说明,解决饿死的方法
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函数调用
读者优先和上述类似