这是我第一次使用旋转,我遇到了一个我不理解的错误。我知道进程以它们创建的顺序终止,因此我不明白为什么我在循环中调用的函数的进程不会终止。 这是我的代码的一个非常简化的版本:
int limit;
proctype f() {
limit--;
printm(limit)
run g();
}
proctype g() {
limit++;
}
init {
limit = 5;
do
:: (limit > 0) -> run f();
od
}
创建限制变量,因此同时运行的进程f
不超过5个。流程g
会终止,但f
不会。所以我收到错误:too many processes
我想知道为什么f
没有终止,如果还有其他方法可以做到这一点?
答案 0 :(得分:0)
您的问题基于一个错误的前提:系统中的进程绝不会超过5个,这是不对的。
实际上,可以有任意数量的f()
类型的进程,因为绝对不能保证指令:
limit--;
使用创建进程后立即执行
run f();
进程调度程序可能允许init()
在抢占它之前执行几个(数十,数百,更多......)循环迭代,并为某些f()
执行任何操作提供机会。< / p>
如果创建了流程g()
,那么这可以明确终止。
如果创建了流程f()
,则只有在系统中尚未有255
个进程并且流程f()
具有最高pid
时才会终止此进程1}},这样就不必等待其他进程了。
init()
进程永远不会终止。
作为可能的解决方法,您可能需要尝试查看_nr_pr:
int limit = 5;
proctype f() {
printm(limit)
}
init {
do
:: (_nr_pr <= (limit + 1)) ->
run f();
od
}