程序的併發執行

一、程序的順序執行

在早期無操作系統及單道批處理系統時,程序都是按照順序進行執行的。先進入內存的先執行,在執行的過程中不能執行其他的程序。程序中的指令也是按照順序執行,一條指令正在執行時不能開始執行另一條指令。所以程序順序執行有以下幾個特點。

1.1、順序性

處理機的操作,嚴格按照順序執行,前一操作還沒執行完畢,後繼操作則不能繼續執行。

1.2、封閉性

程序是在封閉的環境下運行的。即程序在運行時獨佔全機資源,各資源的狀態只有本程序才能改變。程序一旦開始運行,其結果不受外界的影響。

1.3、可再現性

只要程序的環境和初始條件相同,無論程序執行多少次,執行結果相同。例如一個加法運算,無論執行多少次,相加的結果都不會發生改變。

二、程序的併發執行

程序的併發執行是指在同一時間間隔內運行多個程序。也就是在一個程序運行結束之前,可以運行其它的程序。對於用戶來說,有多個程序在同時向前推進,但是從微觀上來看,任意時刻CPU上都只有一個程序在執行。在多道程序系統和分時系統都允許程序併發執行,程序的併發執行有以下幾個特點。

2.1、間斷性

程序在併發執行時,因爲要共享資源,但是資源往往都少於正在執行的程序數,所以會存在資源搶佔的問題。因而,每個程序在CPU上運行,都是時斷時續的。當一個資源被佔用時,其他需要該資源的程序不得不暫停,待資源被釋放時方可執行。

2.2、失去封閉性

程序正在併發執行時,由於它們共享資源或者合作完成同一項任務,系統的狀態不再受其中一個程序的控制和改變,所以就失去了封閉性。比如淘寶賣商品,每賣出一件庫存都要減去1,而進貨又可以對庫存進行增加,所以庫存已經不是某個程序特有的了。僞代碼如下:

<?php
    //賣出商品
    sentProduct('商品1');
    $stock--;   //庫存減一

    //進貨
    purchase('商品1');
    $stock += 10;   //庫存加10
?>

2.3、不可再現性

因爲程序在併發執行時失去了封閉性,所以任何一個程序都有可能對系統的狀態進行改變,這也意味着程序執行的結果可能會不相同。例如兩個程序同時往一個文件追加內容,在執行數次之後,每個文件所展現出的內容可能各不相同。

<?php
    //程序a往文件追加1
    for ($i = 0; $i < 5; $i++) {
        file_put_contents('/tmp/test.txt', 1, FILE_APPEND);
    }

    //程序b往文件追加2
    for ($i = 0; $i < 5; $i++) {
        file_put_contents('/tmp/test.txt', 2, FILE_APPEND);
    }
?>

同時執行兩次的結果:

1212121212  //結果1
1122122121  //結果2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章