如果你熟悉基本的C/S結構,就會知道:當多個客戶端同時向服務器端請求服務時,服務器端只能按順序一個一個的服務,這種情況下,客戶端的用戶是無法忍受的。所以需實現併發的服務器端。
併發服務器端的實現方法:
1:多進程服務器端:通過創建多個進程提供服務。
2:多路複用服務器:用過捆綁並統一管理I/O對象提供服務。
3:多線程服務器:通過生成與客戶端等量的線程提供服務。
1.多進程服務器端:
進程:可執行程序的一次執行過程。
在linux下可通過fork()函數創建一個進程。
#include <unistd.h> pid_t fork(void) // 成功返回時父進程返回子進程的id,子進程返回0,失敗時返回-1
通過fork()函數創建進程以後,父進程和子進程擁有完全獨立的內存空間。舉例:
#include <iostream>
#include <unistd.h>
using namespace std;
int g_count = 10;
int main()
{
int l_count = 20;
g_count++;
l_count++;
pid_t pid = fork();
if (pid < 0) {
cout << "fork() failed" << endl;
return 0;
}
if (pid == 0) {
g_count += 5;
l_count += 5;
} else {
g_count -= 5;
l_count -= 5;
}
if (pid == 0) {
cout << "child: " << g_count <<" " << l_count << endl;
} else {
cout << "parent: " << g_count <<" " << l_count << endl;
}
return 0;
}
結果截圖:
2.殭屍進程及孤兒進程:
殭屍進程:子線程執行結束以後,系統資源不會被操作系統回收,需等父進程執行結束時回收,但父進程沒執行結束,此時的子進程就成了殭屍進程。
孤兒進程:父進程已經執行結束,子進程還沒執行結束,這時的子進程成爲孤兒進程。孤兒進程執行結束以後系統資源有pid=1的進程回收。
殭屍進程的系統資源遲遲得不到回收會導致系統資源被耗盡,所以需要避免殭屍進程。孤兒進程不會造成資源不被回收,可不處理。
殭屍進程產生舉例:
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
pid_t pid = fork();
if (pid < 0) {
cout << "fork() failed" << endl;
return 0;
}
if (pid == 0) {
cout << "i am child proc: " << getpid() << endl;
} else {
cout << "i am parent proc: " << getpid() << endl;
sleep(60);
}
return 0;
}
結果截圖: