我偶然发现了Bakerys算法的修改版本(当然是一个有缺陷的不完整版本)
我在课堂上被问到以下算法是否会出现饥饿问题:
while(true){
number[me] = max(number[0],...,number[n]) + 1
for (other from 0 to n) {
while(number[other] != 0 && number[other] < number[me]) {
// Wait
}
}
/*CS*/
number[me] = 0
}
我知道死锁是可能的,但是我问这个算法是否没有饥饿?
我认为是这样,因为我可以保证一旦thread A
选择了一个号码,其他线程总会有一个比thread A
更大的号码,因此他最终会被允许进入CS
我的朋友认为该算法不是免费的,因为线程可能会在获取数字(计算max
)的过程中卡住,并可能从他那里获取CPU时间。与此同时,其他线程将启动&amp;完成并且可能重新开始(因为时间是真的),而据说thread A
正在被饿死。
我的问题可以简化为:
原始Bakerys算法中的choosing
数组是否解决了饥饿问题?
答案 0 :(得分:3)
饥饿自由可以定义为:任何尝试进入关键部分的进程最终都会进入关键部分。
计算max
的行不是关键部分的一部分,因此最终将获得cpu时间来进行分配。
当process A
收到id
时,它会等待id
低于其id
的所有其他进程(较低的ID表示优先级较高) 。有时,流程将离开关键部分,并将获得新的process A
。此ID将大于它所拥有的ID,并且在那一刻aside
将进入关键部分。
最后,算法没有饥饿。