操作系统:进程管理——与时间有关的错误

进程之间的相互影响

并发进程相互之间可能是无关的,也可能是有交往的

  • 一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,则这些并发进程相互之间是无关的。
  • 一个进程的执行可能影响其他进程的执行结果,则说这些并发进程相互之间是有交往的,是有关的。

有哪些原因使得一个进程的执行可能影响其他进程的执行结果?

  • 有交往的并发进程一定共享某些资源
  • 进程执行与时间有关的错误

进程执行与时间有关的错误

进程的执行的速度不能由自己来控制,对于有交往的并发进程来说,可能有若干并发进程同时使用共享资源。即一个进程一次使用尚未结束,另一个进程已经开始使用,形成交替使用共享资源的现象,如果不加以控制的换,可能出现与时间有关的错误,在共享资源(变量)时就会出现错误,得到不正确的结果。

假设火车站售票系统有两个终端,运行进程T1和T2。
Aj表示公共数据的余票数

void Ti(int i){
    int xi;
    // 按照旅客订票要求找到Aj
    xi=Aj;
    if(xi>=1){
        xi=xi-1;
        Aj=xi;
        // 输出一张票
    }
    else{
        // 票已经售完
    }
}

如果
x1=Aj;
x2=Aj;
当一个用户同时要买票,当还没有付款的时候,也就是票数并没有减去。另一个用户要买票,此时的余票数仍然是一开始的数值,这样两个用户买完票之后,票数最后只减了1。出现了问题

另一个例子

主存管理问题
两个并发进程borrow和return分别负责申请和归还主存资源
x表示现有的空闲主存容量,B表示申请或者归还的主存量。

int x=1000;
cobegin

void borrow(int B){
    if(B>x){
        // 申请进程进入等待队列等主存资源
    }else{
        x=x-B;
        // 修改主存分配表,申请进程获得主存资源
    }
}

void return(int B){
    x=x+B;
    // 修改主存分配表
    // 释放等主存资源的进程
}

coend;

运行过程中,发现B>x,但是还没有进入下一步,就运行了return
于是此时还没有进程进入等待,return成了空操作,以后调用borrow时候,已经没有其他进程来归还主存资源了。

从以上的例子可以看出,由于并发程序的随机性,一个进程对另一个进程的影响是不可预测的。由于他们共享了资源,在不同时刻交替访问资源的时候可能造成结果的不正确。

posted @ 2021-05-04 11:41  Zeker62  阅读(392)  评论(0编辑  收藏  举报