程序池的學習

2021-08-02 02:26:17 字數 2995 閱讀 2117

一   程序的概念主要有兩點:

第一,程序是乙個實體。每乙個程序都有它自己的位址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的**;資料區域儲存變數和程序執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令和本地變數。

第二,程序是乙個「執行中的程式」。程式是乙個沒有生命的實體,只有處理器賦予程式生命時,它才能成為乙個活動的實體,我們稱其為程序。

程序是作業系統中最基本、重要的概念。是多道程式系統出現後,為了刻畫系統內部出現的動態情況,描述系統內部各道程式的活動規律引進的乙個概念,所有多道程式設計作業系統都建立在程序的基礎上。

作業系統引入程序的概念的原因:

從理論角度看,是對正在執行的程式過程的抽象;

從實現角度看,是一種資料結構,目的在於清晰地刻劃動態系統的內在規律,有效管理和排程進入計算機系統主儲存器執行的程式。

程序池是資源程序,管理程序組成的應用

程序池中的應用至少由以下兩部分組成:

1資源程序:預先建立好空閒的程序,管理程序會把工作分配到空閒程序來處理。

2管理程序:負責建立資源程序,把工作交給資源程序處理,**已經處理完的資源程序。

管理程序要有效的管理資源程序,那麼管理程序跟資源程序間必然需要互動,通過ipc,訊號,訊號量,訊息佇列,管道等進行互動。

程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3~10個之間(當然這只是典型情況)。執行緒池中的執行緒數量應該和cpu數量差不多。

程序池中的所有子程序都執行著相同的**,並具有相同的屬性,比如優先順序、pgid等。

當有新的任務來到時,主程序將通過某種方式選擇程序池中的某乙個子程序來為之服務。相比於動態建立子程序,選擇乙個已經存在的子程序的代價顯得小得多。至於主程序選擇哪個子程序來為新任務服務,則有兩種方法:

主程序使用某種演算法來主動選擇子程序。最簡單、最常用的演算法是隨機演算法和round robin(輪流演算法)。

主程序和所有子程序通過乙個共享的工作佇列來同步,子程序都睡眠在該工作佇列上。當有新的任務到來時,主程序將任務新增到工作佇列中。這將喚醒正在等待任務的子程序,不過只有乙個子程序將獲得新任務的「接管權」,它可以從工作佇列中取出任務並執行之,而其他子程序將繼續睡眠在工作佇列上。

當選擇好子程序後,主程序還需要使用某種通知機制來告訴目標子程序有新任務需要處理,並傳遞必要的資料。最簡單的方式是,在父程序和子程序之間預先建立好一條管道,然後通過管道來實現所有的程序間通訊。在父執行緒和子執行緒之間傳遞資料就要簡單得多,因為我們可以把這些資料定義為全域性,那麼它們本身就是被所有執行緒共享的。

多程序併發伺服器**

tcp 併發伺服器的思想是每乙個客戶機的請求並不由伺服器直接處理,而是由伺服器建立乙個子程序來處理。

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv)  

//配置本地網路資訊  

struct sockaddr_in my_addr;  

bzero(&my_addr, sizeof(my_addr));     // 清空     

my_addr.sin_family = af_inet;         // ipv4  

my_addr.sin_port   = htons(port);     // 埠  

my_addr.sin_addr.s_addr = htonl(inaddr_any); // ip  

//2.繫結  

int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));  

if( err_log != 0)  

//3.監聽,套接字變被動  

err_log = listen(sockfd, 10);   

if(err_log != 0)  

while(1) //主程序 迴圈等待客戶端的連線  

;  struct sockaddr_in client_addr;  

socklen_t cliaddr_len = sizeof(client_addr);  

// 取出客戶端已完成的連線  

int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);  

if(connfd < 0)  

pid_t pid = fork();  

if(pid < 0)else if(0 == pid);  

int recv_len = 0;  

// 列印客戶端的 ip 和埠  

memset(cli_ip, 0, sizeof(cli_ip)); // 清空  

inet_ntop(af_inet, &client_addr.sin_addr, cli_ip, inet_addrstrlen);  

printf("----------------------------------------------\n");  

printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));  

// 接收資料  

while( (recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0 )  

printf("client_port %d closed!\n", ntohs(client_addr.sin_port));  

close(connfd);    //關閉已連線套接字  

exit(0);  

}  else if(pid > 0)  

}  close(sockfd);  

return 0;  

}  

python學習 程序池

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果 是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的 pool方法。import multiprocessing import o...

程序池,程序的應用

1,程序池 當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但如果是上百或者上千個目標,手動的動態建立程序工作量大,此時可以用到multiprocessing中的pool方法。初始化pool時,可以指定乙個量大的程序數,當有新的請求交到po...

程序池 執行緒池

程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池 如果沒有特殊宣告 程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3 10個之間 典型情況 執行緒池的數量應該和cpu數量差不多。程序池中的所有子程序都執行者相同的 並具有相同的屬性。因為程序池在伺服器...