我們以三個使用者程序(str1、str2、str3)為例,來看看多個程序是如何執行的,他們又是如何切換的。
程序的源**如下,str1、str2、str3三者**一樣。
#include int foo(int n)
}int main(int argc, char **argc)
1、假設現在建立(fork)了三個程序,並執行(execve)對應的程式,他們的程序號是5、6、7,它們的線性位址空間的位置應該依次是4*64 ~ 5*64mb,5*64 ~ 6*64mb,6*64 ~ 7*64mb。假設三個程序此時都處於就緒態,也就是如下圖:
圖 1
2、假設現在輪到str1程序執行。str1開始執行foo函式呼叫,就需要壓棧(這是從彙編的角度看的,區域性變數需要壓棧),於是產生了缺頁中斷。在缺頁中斷中,核心為str1程序申請了空閒物理頁面,並將其對映到str1程序的線性位址空間。之後程序再對text陣列進行設定,內容就被寫在了剛分配的物理頁面上了。執行效果如下圖:
圖 2
3、str1在執行過程中,無輪在0特權級還是3特權級,每10毫秒就會產生一次時鐘中斷,會呼叫do_timer,這樣就會消減它的時間片,直到消減到0,如果此時程序處於3特權級,就執行schedule。
do_timer如下:
void do_timer(long cpl)
我們假設切換到str2程序,程序str2也執行同樣邏輯的程式,值得注意的是,當設定text陣列時,螢幕列印的邏輯位址與當時程序str1的位址相同。但他們的執行緒位址不同,物理記憶體中程序str2也並沒有於str1重疊。如下圖:
圖 3
4、str2無輪在0特權級還是3特權級,每10毫秒就會產生一次時鐘中斷,會呼叫do_timer,這樣就會消減它的時間片,直到消減到0,如果此時程序處於3特權級,就執行schedule,切換到str3執行,它也要壓棧,str3開始執行,執行的**於程序str2相同,也是壓棧,並設定text。str3程式執行壓棧的效果如下:
圖 4
5、str3執行一段時間後,時間片也用完了。這樣三個使用者程序雖然還需要繼續執行,但時間片都用完了。當再發生時鐘中斷時,do_timer()函式呼叫schedule()函式進行程序切換,這時,核心會為他們重新分配時間片。
核心從task的末端開始重新給當前系統的所有程序(包括處於睡眠的程序,但程序0除外)分配時間片,時間片的大小為couter/2 + priority。priority是程序的優先順序,所以程序的優先順序越高,分配到的時間片就越多。然後根據此時時間片的情況重新選擇程序執行,如此反覆。
執行的**如下:
void schedule(void)
if (c) break;
for(p = &last_task ; p > &first_task ; --p)
if (*p)
(*p)->counter = ((*p)->counter >> 1) +
(*p)->priority;
} switch_to(next);
}
三個程式執行一段時間後,壓入他們各自的棧中的資料在主記憶體中的分布如下圖:
圖 5
通過FreeSwitch同時呼叫多個使用者
通過freeswitch可以對多個終端進行呼叫,依據振鈴順序不同,可以分為 同振 和 順振 同振是指多個終端同時振鈴 順振是指多個終端順序振鈴。下面實現如下應用,某使用者撥叫 2000 這個接入號碼,希望 1000 和 1001 同時振鈴,其中任乙個接聽來話,另乙個停止振鈴。1 在 conf dia...
linux中fork同時建立多個子程序的方法(二)
fork 同時建立多個子程序方法 第一種方法 驗證通過 特點 同時建立多個子程序,每個子程序可以執行不同的任務,程式 可讀性較好,便於分析,易擴充套件為多個子程序 int main void pid t p2 fork if p2 0 int st1,st2 waitpid p1,st1,0 wai...
同時啟動多個Tomcat
一台pc機上同時啟動多個tomcat 環境 兩個tomcat7.0.20,使用乙個jvm,jdk7,win7 64位系統。系統環境變數裡的catalina home已經刪除,根據catalina.bat裡的 來看,應該走的是自己設定的臨時環境變數。兩個startup.bat最前面加上一句set ca...