Linux下的程序池 1

2021-09-10 12:27:21 字數 4058 閱讀 3136

基於linux的程序池的實現,併發程序池有多種實現模式,在這裡統一進行分析。首先給出客戶端的測試**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

const

int clientnum =10;

// 建立使用者個數

const

int nloop =

100;

// 每個使用者動態建立連線個數

static

int cnt =0;

void sig_handler (

int sig)

pid_t pid;

while

((pid = waitpid (-1

,null

, wnohang)

)>0)

if(cnt >= clientnum)

}int main (

int argc,

char

* ar**)

int port = atoi (ar**[2]

);if(port <

1024

|| port >

65535

)struct sockaddr_in serv;

bzero (

&serv,

sizeof

(serv));

if(inet_pton (af_inet, ar**[1]

,&serv.sin_addr)==-

1)serv.sin_family = af_inet;

serv.sin_port = htons (port)

;struct sigaction sa;

bzero (

&sa,

sizeof

(sa));

sa.sa_handler = sig_handler;

sa.sa_flags = sa_restart;

if(sigaction (sigchld,

&sa,

null

)<0)

for(

int i =

0; i < clientnum;

++i)

if(connect (fd,

(struct sockaddr*

)&serv,

sizeof

(serv)

)<0)

const

char

* buf =

"hello world !\n"

;for

(int j =

0; j < nloop;

++j)

close (fd)

; printf (

"client %d end...\n"

, i)

; exit (0)

;}}while

(true

) exit (0)

;}

這裡介紹的是使用不帶鎖的accept結構的程序池。原理是:如果有多個accept函式等待監聽核心中同乙個fd,那麼沒有資料時都阻塞。如果有資料,那麼所有的都會被喚醒,但是只能有乙個程序獲取fd,其餘的喚醒後接著休眠。這種結構簡單,但是出現執行緒池「驚群」現象,這裡的喚醒和休眠會浪費大量的時間,併發度高的時候,更是如此。但是對於少量併發的情況,還是比較合適的,給出**實現:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

const

int max_process_number =15;

const

int max_buffer_size =

1024

;bool stop_server =

false

;pid_t* pids =

nullptr

;int processnum =0;

void sig_int (

int signo)

;// 終止整個執行緒池

void process (

int fd)

;// 子程序處理連線

pid_t child_make (

int fd)

;// 產生新的子程序

void child_main (

int fd)

;// 子程序的主要操作

int main (

int argc,

char

* ar**)

int port = atoi (ar**[1]

);if(port <

1024

|| port >

65535

) processnum = atoi (ar**[2]

);if(processnum <

0|| processnum > max_process_number)

struct sockaddr_in serv;

bzero (

&serv,

sizeof

(serv));

serv.sin_family = af_inet;

serv.sin_port = htons (port)

; serv.sin_addr.s_addr = htonl (inaddr_any)

;int listenfd = socket (af_inet, sock_stream,0)

;if(listenfd <0)

if(bind (listenfd,

(struct sockaddr*

)&serv,

sizeof

(serv)

)<0)

if(listen (listenfd,32)

<0)

struct sigaction sa;

// 註冊終止訊號

bzero (

&sa,

sizeof

(sa));

sa.sa_handler = sig_int;

sa.sa_flags = sa_restart;

if(sigaction (sigterm,

&sa,

null

)<0)

pids =

new pid_t[processnum]

;for

(int i =

0; i < processnum;

++i)

while

(!stop_server)

exit (0)

;}void sig_int (

int signo)

for(

int i =

0; i < processnum;

++i)

if(pids !=

nullptr

) stop_server =

true;}

pid_t child_make (

int fd)

child_main (fd);}

void child_main (

int fd)

puts (

"accept data");

process (connfd)

; close (fd);}

}void process (

int fd)

printf (

"%s"

, buf);}

}

Linux 程序池實現

程序池在伺服器應用中有很多很多 下面是半同步半非同步程序池的實現 ifndef processpool h define processpool h include include include include include include include include include inc...

程序,執行緒與執行緒池(1)

傳統方法 建立乙個新的執行緒,由該執行緒執行任務,任務執行完畢後執行緒退出 即時建立,即時銷毀 如果提交給執行緒的任務是執行時間較短,執行次數頻繁,那麼不斷銷毀和不斷建立的開銷則是不可忽略的。執行緒池採用預建立技術,在應用程式啟動之後,立即建立一定數量的執行緒,放入空閒佇列中,這些執行緒處於阻塞狀態...

linux下的程序

在我們linux的學習中,有乙個很重要的概念就是程序,程序就是 程式的乙個執行例項,是擔當分配資源的實體,是資源競爭的最小單位。簡單來說就是正在執行的程式。我們在學習linux的時候,會發現有乙個規律就是管理者先將被管理者進行描述在組織起來。對於程序來說,linux用一種來存放關於乙個程序的描述資訊...