在早期無作業系統及單道批處理系統時,程式都是按照順序進行執行的。先進入記憶體的先執行,在執行的過程中不能執行其他的程式。程式中的指令也是按照順序執行,一條指令正在執行時不能開始執行另一條指令。所以程式順序執行有以下幾個特點。
處理機的操作,嚴格按照順序執行,前一操作還沒執行完畢,後繼操作則不能繼續執行。
程式是在封閉的環境下執行的。即程式在執行時獨佔全機資源,各資源的狀態只有本程式才能改變。程式一旦開始執行,其結果不受外界的影響。
只要程式的環境和初始條件相同,無論程式執行多少次,執行結果相同。例如乙個加法運算,無論執行多少次,相加的結果都不會發生改變。
程式的併發執行是指在同一時間間隔內執行多個程式。也就是在乙個程式執行結束之前,可以執行其它的程式。對於使用者來說,有多個程式在同時向前推進,但是從微觀上來看,任意時刻cpu上都只有乙個程式在執行。在多道程式系統和分時系統都允許程式併發執行,程式的併發執行有以下幾個特點。
程式在併發執行時,因為要共享資源,但是資源往往都少於正在執行的程式數,所以會存在資源搶占的問題。因而,每個程式在cpu上執行,都是時斷時續的。當乙個資源被占用時,其他需要該資源的程式不得不暫停,待資源被釋放時方可執行。
程式正在併發執行時,由於它們共享資源或者合作完成同一項任務,系統的狀態不再受其中乙個程式的控制和改變,所以就失去了封閉性。比如**賣商品,每賣出一件庫存都要減去1,而進貨又可以對庫存進行增加,所以庫存已經不是某個程式特有的了。偽**如下:
<?php
//賣出商品
sentproduct('商品1');
$stock--; //庫存減一
//進貨
purchase('商品1');
$stock += 10; //庫存加10
?>
因為程式在併發執行時失去了封閉性,所以任何乙個程式都有可能對系統的狀態進行改變,這也意味著程式執行的結果可能會不相同。例如兩個程式同時往乙個檔案追加內容,在執行數次之後,每個檔案所展現出的內容可能各不相同。
<?php
//程式a往檔案追加1
for ($i = 0; $i < 5; $i++)
//程式b往檔案追加2
for ($i = 0; $i < 5; $i++)
?>
同時執行兩次的結果:
1212121212 //結果1
1122122121 //結果2
四 程式的併發執行
巨集觀上看是多個程式同時執行,微觀上看是多個程式分時占用cpu。這種程式的執行方式為併發執行。方法執行時的新特徵 間斷性 程式在比併發執行時,由於它們共享系統資源,以及為完成同一項任務而相互合作,致使在這些併發執行的程式之間形成了相互制約的關係。當圖中c1已經資料處理完畢時,i2還沒有輸入那麼c2就...
程式的順序執行與併發執行
是指記憶體一次只能裝載乙個程式執行,在這次程式執行結束前,其他程式不允許使用記憶體。這是早期的作業系統所使用的技術。是現代作業系統普遍使用的,它可以允許多個程式進駐記憶體,系統通過某種排程策略交替執行程式.所有多道程式設計作業系統都建立在程序的基礎上。單核cpu 單核cpu較為死腦,在通電時該cpu...
OS 關於程式併發執行的例題
1 作圖如下 2 cpu有空閒等待,在計算完程式b後的50ms內,即100ms到150ms之間處於空閒等待。由於ab程式都在不同的裝置上進行暫時不需要用到cpu,所以會有空閒等待。3 程式a無等待現象,程式b在執行時有等待現象,在b程式使用完輸入機後等待cpu將a程式計算完,即在 180ms 到 2...