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