进程和线程的区别:

详细的可以参考这样文档进程和线程的区别(超详细)-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),用于处理特定事件。其中第二小节中提到了事件过滤器生命周期管理。本文将详细解析事件过滤器生命周期管理这一部分的内容。 (关注不迷路哈!…