TCP多進程和多線程并發服務

進程和線程的區別:

詳細的可以參考這樣文檔進程和線程的區別(超詳細)-CSDN博客? ? ? ? ? ? ? ?

核心比喻

  • 進程 = 一個工廠:這個工廠擁有獨立的資源(廠房、原材料、資金、電力)。每個工廠之間是相互隔離的,一個工廠著火不會直接影響另一個工廠。

  • 線程 = 工廠里的工人:多個工人在一個工廠里協同工作,他們共享工廠的所有資源(廠房、原材料)。工人們可以獨立地執行不同的任務(流水線),但他們需要溝通和協調,因為他們在共用同一個空間的資源。


詳細區別對比表

維度進程 (Process)線程 (Thread)
基本定義資源分配的基本單位。一個正在執行的程序實例。CPU調度和執行的基本單位。是進程內部的一個執行流。
資源擁有擁有獨立的系統資源(如內存、I/O設備、文件等)。每個進程都有自己獨立的地址空間。不擁有系統資源,但共享其所屬進程的全部資源。每個線程擁有自己獨立的棧和寄存器。
開銷。創建、銷毀、切換進程需要分配和回收獨立的內存空間、資源表等,開銷較大。。創建、銷毀、切換線程只需分配棧和寄存器,共享同一片內存空間,開銷遠小于進程。
通信方式復雜。進程間通信(IPC)需要借助操作系統提供的機制,如:管道、消息隊列、共享內存、信號量、Socket等。簡單。線程間通信非常方便,因為它們共享進程的全局變量、堆等數據,直接讀寫即可。但需要同步機制(如互斥鎖)來避免沖突。
獨立性。一個進程崩潰后,在保護模式下一般不會影響其他進程。穩定性高,隔離性好。一個線程崩潰會導致整個進程崩潰,從而影響該進程下的所有其他線程。穩定性低,相互影響
性能影響進程間切換涉及地址空間的切換,CPU高速緩存(Cache)失效率高,性能損耗大。線程切換只在同一地址空間內,CPU高速緩存不易失效,性能損耗小。
并發性進程之間可以并發執行。線程之間不僅可以并發執行,甚至可以實現真正的并行(在多核CPU上)。

從操作系統角度理解

操作系統會為每個進程維護一個進程控制塊(PCB),這是一個龐大的數據結構,記錄了進程的所有信息(PID、狀態、優先級、內存指針等)。而線程也有自己的線程控制塊(TCB),但它記錄的信息要少得多(主要是線程ID、寄存器、棧指針等),因為它的大部分資源信息都指向其所屬的PCB。

當進行進程切換時,操作系統需要切換整個地址空間(更換頁表),這是一個相對沉重的操作。而線程切換只需切換線程的私有數據(如棧和寄存器),效率高得多。

總結與聯系

  1. 包含關系一個進程至少包含一個線程(主線程),也可以擁有多個線程。

  2. 設計目的

    • 進程?是為了更好地使多道程序并發執行,提高資源利用率和系統吞吐量。它強調的是“資源分配的獨立性”

    • 線程?是為了減少程序并發執行時的時空開銷,提高操作系統的并發性能。它強調的是“計算執行的并行性”

  3. 如何選擇

    • 需要安全穩定、任務之間隔離要求高時(例如Chrome瀏覽器每個標簽頁是一個獨立進程),用進程

    • 需要極致性能、大量數據共享、頻繁切換時(例如Web服務器同時處理多個請求、視頻解碼、文字處理軟件的后臺保存和打字),用多線程

簡單來說,進程是資源的容器,而線程是CPU執行的單元。線程依托于進程而存在,共享進程的資源,使得同一個應用程序內的多個任務可以更高效地協作。

線程和進程的代碼

線程:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<strings.h>
#include<unistd.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>
#include<pthread.h>
#define SERV_PORT 8000
#define MAXLINE 80//打印報錯信息
#define prrexit(msg){ \perror(msg); \exit(1); \}//子線程
void *up_server(void *arg){//獲取自己的線程id,自我釋放pthread_detach(pthread_self());//進行安全的類型轉換int connfd=(int)(intptr_t)arg;char buff[MAXLINE];int n,i;while(1){n=read(connfd,buff,MAXLINE);if(n<=0){perror("read error  or connections closed");break;}write(1,buff,n);if(strncmp(buff,"quit",4)==0){break;}for(i = 0; i < n ; i++)buff[i]=toupper(buff[i]);write(connfd,buff,n);}close(connfd);//正常退出return (void *)0;
}int main(){struct sockaddr_in serveraddr,claddr;int listenfd, connfd;socklen_t  claddr_len;// char buff[MAXLINE];char str[INET_ADDRSTRLEN];int n,i;listenfd =socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){prrexit("socket");}//服務器ip地址,端口初始化bzero(&serveraddr,sizeof(serveraddr));serveraddr.sin_family=AF_INET;serveraddr.sin_port = htons(SERV_PORT);serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(listenfd,(struct  sockaddr *)&serveraddr,sizeof(serveraddr))<0)prrexit("bind");if(listen(listenfd,3)<0)prrexit("listen");printf("Accepting connections...\n");while(1){claddr_len= sizeof(claddr);connfd=accept(listenfd,(struct sockaddr *)&claddr,&claddr_len);if(connfd<0)prrexit("accept");printf("received from %s:%d\n",inet_ntop(AF_INET,&claddr.sin_addr,str,sizeof(str)),ntohs(claddr.sin_port));/*多進程pid_t pid= fork();if(pid<0){prrexit("fork");}//父進程 :等待 創建連接if(pid > 0){close(connfd);//回收進程資源while(waitpid(-1,NULL,WNOHANG)>0){ };continue;}close(listenfd);*///多線程pthread_t  tid;pthread_create(&tid,NULL,up_server,(void *)(intptr_t)connfd);printf("new thread is %#lx\n",tid);}return 0;
}

補充一下,因為實現線程時候調用了pthread庫的函數,所以需要額外鏈接上 -lpthread庫用以實現。

進程:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<strings.h>
#include<unistd.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>#define SERV_PORT 8000
#define MAXLINE 80//打印報錯信息
#define prrexit(msg){ \perror(msg); \exit(1); \
}int main(){struct sockaddr_in serveraddr,claddr;int listenfd, connfd;socklen_t  claddr_len;char buff[MAXLINE];char str[INET_ADDRSTRLEN];int n,i;listenfd =socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){prrexit("socket");}//服務器ip地址,端口初始化bzero(&serveraddr,sizeof(serveraddr));serveraddr.sin_family=AF_INET;serveraddr.sin_port = htons(SERV_PORT);serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(listenfd,(struct  sockaddr *)&serveraddr,sizeof(serveraddr))<0)prrexit("bind");if(listen(listenfd,3)<0)prrexit("listen");printf("Accepting connections...\n");while(1){claddr_len= sizeof(claddr);connfd=accept(listenfd,(struct sockaddr *)&claddr,&claddr_len);if(connfd<0)prrexit("accept");printf("received from %s:%d\n",inet_ntop(AF_INET,&claddr.sin_addr,str,sizeof(str)),ntohs(claddr.sin_port));pid_t pid= fork();if(pid<0){prrexit("fork");}//父進程 :等待 創建連接if(pid > 0){close(connfd);//回收進程資源while(waitpid(-1,NULL,WNOHANG)>0){ };continue;}close(listenfd);    //讀,寫,返回while(1){n=read(connfd,buff,MAXLINE);if(n<=0){perror("read error  or connections closed");break;}write(1,buff,n);if(strncmp(buff,"quit",4)==0){break;}for(i = 0; i < n ; i++)buff[i]=toupper(buff[i]);write(connfd,buff,n);}close(connfd);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95580.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機畢業設計springboot基于Java+Spring的疫苗接種管理系統的設計與實現 基于Spring Boot框架的疫苗接種信息管理系統開發與應用 Java與Spring技術驅動的疫苗接種管理

計算機畢業設計springboot基于JavaSpring的疫苗接種管理系統的設計與實現69geq9 &#xff08;配套有源碼 程序 mysql數據庫 論文&#xff09; 本套源碼可以在文本聯xi,先看具體系統功能演示視頻領取&#xff0c;可分享源碼參考。隨著信息技術的飛速發展&#xff0c;計算機技術在…

C/C++圣誕樹①

寫在前面 圣誕節將至&#xff0c;我總想用代碼做點什么&#xff0c;來表達對這個溫馨節日的敬意。于是&#xff0c;我決定用C語言在控制臺中繪制一幅充滿節日氣氛的圣誕樹畫面。它不僅有閃爍的雪花、五彩的燈光&#xff0c;還有一顆顆精心雕琢的心形圖案&#xff0c;仿佛把整個…

【小白入】顯示器核心參數對比度簡介

對比度是一個非常核心的顯示器參數。下面我們來了解一下。一、核心定義&#xff1a;什么是對比度&#xff1f;顯示器的對比度&#xff08;Contrast Ratio&#xff09;是指其最亮狀態&#xff08;白色&#xff09;與最暗狀態&#xff08;黑色&#xff09;之間的亮度比值。簡單來…

【項目】多模態RAG必備神器—olmOCR重塑PDF文本提取格局

【項目】多模態RAG必備神器—olmOCR重塑PDF文本提取格局&#xff08;一&#xff09;olmOCR是什么&#xff1f;&#xff08;二&#xff09;olmOCR 的核心技術&#xff08;1&#xff09;文檔錨定技術&#xff08;2&#xff09;微調 7B 視覺語言模型&#xff08;三&#xff09;olm…

解決Android Studio查找aar源碼的錯誤

我又來給大模型貢獻素材了&#xff01; 問題 在更新了Android Studio Narwhal Feature Drop | 2025.1.2 Patch 1版本之后&#xff0c;遇到了一個問題&#xff0c;很煩人&#xff01;AS每次更新都能搞出點新毛病&#xff0c;真的服了。使用離線依賴aar包引入某個庫之后&#xff…

華為HCIP、HCIE認證:自學與培訓班的抉擇

大家好&#xff0c;這里是G-LAB IT實驗室。 在追求個人職業發展的道路上&#xff0c;取得華為的HCIP或HCIE認證是許多IT從業者的重要目標之一。 但在備考過程中&#xff0c;我們常常面臨一個選擇&#xff1a;是自學還是報名參加培訓班&#xff1f;本文將針對這個問題&#xff0…

空調噪音不穿幫,聲網虛擬直播降噪技巧超實用

虛擬主播團隊負責人來吐槽&#xff01;實時互動是核心&#xff0c;可主播回應慢半拍、動作表情跟不上語音&#xff0c;用戶立馬覺得假&#xff0c;嘩嘩流失。之前方案端到端延遲 700ms&#xff0c;互動總慢一步。直到接入商湯日日新大模型和聲網合作方案&#xff0c;延遲壓到 5…

Spark和Spring整合處理離線數據

如果你比較熟悉JavaWeb應用開發&#xff0c;那么對Spring框架一定不陌生&#xff0c;并且JavaWeb通常是基于SSM搭起的架構&#xff0c;主要用Java語言開發。但是開發Spark程序&#xff0c;Scala語言往往必不可少。 眾所周知&#xff0c;Scala如同Java一樣&#xff0c;都是運行…

智能高效內存分配器測試報告

一、項目背景 這個項目是為了學習和實現一個高性能、特別是高并發場景下的內存分配器。這個項目是基于谷歌開源項目tcmalloc(Thread-Caching Malloc)實現的。tcmalloc 的核心目標就是替代系統默認的 malloc/free&#xff0c;在多線程環境下提供更高效的內存管理。C/C的malloc雖…

吱吱企業通訊軟件以安全為核心,構建高效溝通與協作一體化平臺

隨著即時通訊工具日益普及&#xff0c;企業面臨一個嚴峻的挑戰&#xff1a;如何在保障通訊數據安全的前提下&#xff0c;提升辦公效率&#xff1f;為解決此問題&#xff0c;吱吱企業通訊軟件誕生&#xff0c;通過私有化部署和深度集成的辦公系統&#xff0c;為企業打造一個既可…

校企合作| 長春大學旅游學院副董事長張海濤率隊到訪卓翼智能,共繪無人機技術賦能“AI+文旅”發展新藍圖

為積極響應國務院《關于深入實施“人工智能”行動的意見》&#xff08;國發〔2025〕11號&#xff09;號召&#xff0c;扎實推進學校“旅游”與“人工智能”雙輪驅動的學科發展戰略&#xff0c;加快無人機技術在文旅領域的創新應用&#xff0c;近日長春大學旅游學院副董事長張海…

為什么要用 MarkItDown?以及如何使用它

在處理大量文檔時&#xff0c;尤其是在構建知識庫、進行文檔分析或訓練大語言模型&#xff08;LLM&#xff09;時&#xff0c;將各種格式的文件&#xff08;如 PDF、Word、Excel、PPT、HTML 等&#xff09;轉換為統一的 Markdown 格式&#xff0c;能夠顯著提高處理效率和兼容性…

LVGL9.3 vscode 模擬環境搭建

1、git 克隆&#xff1a; git clone -b release/v9.3 https://github.com/lvgl/lv_port_pc_vscode.git 2、cmake 和 mingw 環境搭建 cmake&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139186681?spm1011.2415.3001.5331 mingw&#xff1a; https://bl…

投影矩陣:計算機圖形學中的三維到二維轉換

投影矩陣是計算機圖形學中的核心概念之一&#xff0c;它負責將三維場景中的幾何數據投影到二維屏幕上&#xff0c;從而實現三維到二維的轉換。無論是游戲開發、虛擬現實&#xff0c;還是3D建模&#xff0c;投影矩陣都扮演著不可或缺的角色。本文將深入探討投影矩陣的基本原理、…

10.2 工程學中的矩陣(2)

十、例題 【例3】求由彈簧連接的 100100100 個質點的位移 u(1),u(2),...,u(100)u(1),u(2),...,u(100)u(1),u(2),...,u(100), 彈性系數均為 c1c 1c1, 每個質點受到的外力均為 f(i)0.01f(i)0.01f(i)0.01. 畫出兩端固定和固定-自由這兩種情形 u 的圖形。 解&#xff1a; % 參數設…

Mysql主從復制之延時同步

1.延時同步概念通過人為配置從庫和主庫延時N小時可以實現延時同步&#xff0c;延時同步可以解決數據庫故障出現的數據丟失問題(物理損壞如直接使用rm刪除數據庫數據和邏輯損壞如使用drop命令刪除數據庫)2.延時同步實操2.1先配置從庫延時同步&#xff0c;并且設置sql線程300秒后…

【QT特性技術講解】QPrinter、QPdf

前言 QT對打印和PDF應用場景&#xff0c;做了簡單的封裝&#xff0c;復雜的功能還是得用第三方庫&#xff0c;打印功能簡單的文本可以不用PDF&#xff0c;涉及圖形的基本都要用到PDF。 Linux打印 隨著國產信創項目替換基于Linux的桌面系統國產信創系統&#xff0c;Linux桌面系…

【大數據技術實戰】Flink+DS+Dinky 自動化構建數倉平臺

一、背景&#xff1a;企業數倉建設的現狀與挑戰在數字化轉型進入深水區的今天&#xff0c;數據已成為企業核心生產要素&#xff0c;而實時數倉作為 “數據驅動決策” 的關鍵載體&#xff0c;其建設水平直接決定企業在市場競爭中的響應速度與決策精度。根據 IDC《2024 年全球大數…

Python開篇:撬動未來的萬能鑰匙 —— 從入門到架構的全鏈路指南

Python&#xff1a;撬動未來的萬能鑰匙——從入門到架構的全鏈路指南 在技術的星空中&#xff0c;Python 是那顆永不隕落的超新星——它用簡潔的語法點燃創造之火&#xff0c;以龐大的生態鋪就革新之路。無論你身處哪個領域&#xff0c;這把鑰匙正在打開下一個時代的大門。2024…

【QT隨筆】事件過濾器(installEventFilter 和 eventFilter 的組合)之生命周期管理詳解

【QT隨筆】事件過濾器(installEventFilter 和 eventFilter 的組合)之生命周期管理詳解 上一章節中提到事件過濾器(Event Filter),用于處理特定事件。其中第二小節中提到了事件過濾器生命周期管理。本文將詳細解析事件過濾器生命周期管理這一部分的內容。 (關注不迷路哈!…