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