Linux系统基础-多线程超详细讲解(1)

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

Linux系统基础-多线程超详细讲解(1)

收录于专栏[Linux学习]
本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 线程的概念 

2. 线程的优缺点

线程的优点 : 

线程的缺点 : 

3. 线程用途

4. Linux进程VS线程 

进程和线程区分

进程和线程关系图解

5. 线程异常  


1. 线程的概念 

1. 在一个程序里面的一个执行路线就叫做线程 (thread). 更准确的定义是 : 线程是 "一个进程内部的控制序列"

2. 一切进程至少都有一个执行线程

3, 线程在进程内部运行, 本质是在进程地址空间内运行

4. 透过进程虚拟空间, 可以看到进程的大部分资源, 将进程资源合理分配给每个执行流, 就形成了线程执行流

总结 :

进程 = 内核数据结构 + 进程代码和数据 进程承担分配系统资源的基本实体!

线程 : 在进程内部运行, 是CPU调度的基本单位 

2. 线程的优缺点

线程的存在带来了一个问题 : 已经有多进程和进程池了, 为什么还需要多线程呢?

这就不得不谈一下线程的优缺点了:

线程的优点 : 

1. 创建一个新线程的代价要比创建一个新进程小的多! 

2. 相比于进程之间的切换相比, 线程之间的切换需要操作系统的工作要少很多

线程通常共享同一进程的内存空间,因此当线程切换时,许多数据和代码仍然在缓存中。这种共享提高了缓存的命中率,减少了从主内存读取数据的需要。

进程切换通常涉及更改整个进程的地址空间。当一个进程切换到另一个进程时,原有的缓存数据往往会被新的进程的缓存替换,这导致了缓存失效(cache misses)。这意味着需要更多的时间去重新加载所需的数据。

3. 线程占用的资源要比进程少很多

4. 能充分利用多处理器的可并行数量

5. 在等待慢速I/O操作结束的同时, 程序可执行其他的计算任务

6. 计算密集型应用, 为了能在多处理器系统上运行, 将计算分解到多个线程中实现

7. I/O密集型应用, 为了能提高性能, 将I/O操作重叠, 线程可以同时等待不同的I/O操作

线程的缺点 : 

1. 性能损失

一个很少被外部事件阻塞的计算密集型线程往往无法于同它线程共享一个处理器, 如果计算密集型线程的数量比可用的处理器多, 那么可能会有比较大的性能损失, 这里的性能损失是额外的同步和调度开销, 而可用资源不变

2. 健壮性降低

编写多线程需要更全面更深入的考虑, 在一个多线程程序里, 因时间分配上的细微偏差或者因共享了不该共享的变量而造成了不良影响的可能性是很大的, 换句话说, 线程之间是缺乏保护的

3. 缺乏访问控制

进程是访问控制的基本粒度, 在一个线程中调用某些OS函数会对整个进程造成影响.

4. 编程难度提高

编写与调试一个多线程程序比单线程程序困难的多

3. 线程用途

并发执行:

线程允许程序在同一进程中同时执行多个任务,提高程序的并发性和响应速度。例如,用户界面线程可以与后台处理线程并行工作,保持应用程序的响应性。

资源共享:

线程在同一进程中共享内存和资源,这使得数据共享更加高效。线程之间的通信和数据传递相比进程间通信(IPC)更简单,减少了数据复制和上下文切换的开销。

提高性能:

在多核处理器上,多个线程可以并行执行,从而充分利用多核的计算能力,提高应用程序的性能。例如,图像处理、数据分析等任务可以通过多线程加速处理。

异步操作:

线程可以用于实现异步操作,使得程序在等待某些耗时操作(如I/O操作、网络请求)时不会阻塞主执行流。例如,网络下载可以在一个线程中进行,主线程仍然可以处理用户输入。

后台处理:

线程适合执行需要长时间处理的任务,而不影响主程序的性能。例如,定期执行的任务(如日志记录、数据备份)可以在后台线程中运行。

简化设计:

在某些应用中,使用线程可以使程序设计更为简单清晰。比如,使用线程池可以管理多个任务并减少资源的管理复杂性。

游戏和图形处理:

在游戏开发中,多个线程可用于处理物理运算、图形渲染和AI计算,使游戏更加流畅和高效。

服务器应用:

在服务器应用中,线程可以用于处理多个并发请求,例如Web服务器通常会为每个请求创建一个线程,以提高处理能力和响应速度。

4. Linux进程VS线程 

进程和线程区分

进程是资源分配的基本单位

线程是调度的基本单位

线程共享进程数据, 但也拥有自己的一部分数据:

线程ID

一组寄存器

error

信号屏蔽字

调度优先级

进程的多个线程共享同一地址空间, 因此Text Segment, Data Segment都是共享的, 如果定义一个函数, 在各个线程中都可以调用, 如果定义一个全局变量在各个线程总都可以访问, 除此之外, 各线程还共享以下进程资源和环境:
1. 文件描述符表

2. 每种信号的处理方式

3. 当前工作目录

4. 用户id和组id 

进程和线程关系图解

进程和线程关系如下图所示:

 

5. 线程异常  

单个线程如果出现除零, 野指针问题导致线程崩溃, 进程也会随着崩溃

线程是进程的执行分支, 线程出现异常, 就类似进程出异常, 进而触发信号机制, 终止进程, 进程终止, 该进程内的所有线程也就随之退出

代码示例:

#include <iostream>
#include <unistd.h>
#include <ctime>int gval = 100;void *threadStart(void *args)
{while(true){sleep(1);int x = rand() % 5;std::cout << "new thread running..." << "pid: " << getpid() << ", gval: " << gval << ", &gal: " << &gval << std::endl;if(x == 0){int *p = nullptr;*p = 100;//野指针}}
} int main()
{srand(time(nullptr));pthread_t tid1;pthread_create(&tid1, nullptr, threadStart, (void *)"thread-new");pthread_t tid2;pthread_create(&tid2, nullptr, threadStart, (void *)"thread-new");pthread_t tid3;pthread_create(&tid3, nullptr, threadStart, (void *)"thread-new");pthread_t tid4;pthread_create(&tid4, nullptr, threadStart, (void *)"thread-new");//主线程while(true){std::cout << "main thread running..." << ", pid: " << getpid() << ", gval: " << gval << ", &gval: " << &gval << std::endl;gval++;sleep(1);}
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github 2024-10-29Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1gpt4free存储库:强大语言模型的集合 创建周期:300 天开发语言:Python协议类型:GNU General Public License v3…

高职院校教学一体化护理实训室建设方案

当前&#xff0c;高职院校在人才培养方面正经历着深刻的变革。教育部明确提出&#xff0c;高职院校在人才培养过程中&#xff0c;必须着重培养学生的专业技能与职业素养&#xff0c;旨在培育出更多出类拔萃的应用型人才&#xff0c;从而全面提升高职院校护理类专业的人才培养质…

【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;LoadBalancer 类型的 Service 允许用户轻松地将应用暴露给外部流量。它自动创建一个云负载均衡器并分配一个外部 IP 地址。然而&#xff0c;在某些情况下&#xff0c;LoadBalancer 类型的 Service 可能未能成功分配 IP 地址&#xff0c;导致外部无…

智慧旅游微信小程序平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

基于SpringBoot实现驻马店市ERP药品管理系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

十、包并发

包&并发 包1. 包1.1 包的基本概念1.2 包的导入1.3 包的导入路径1.4 包的引用格式 2. go mod2.1 项目中使用 并发1. 并发2. Goroutine2.1 使用2.1 GMP 3. runtime包4.Channel4.1 创建channel4.2 channel操作4.3 无缓冲的通道4.4 有缓冲的通道4.6 如何优雅的从通道循环取值4.…

Golang | Leetcode Golang题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; func findMinMoves(machines []int) (ans int) {tot : 0for _, v : range machines {tot v}n : len(machines)if tot%n > 0 {return -1}avg : tot / nsum : 0for _, num : range machines {num - avgsum numans max(ans, max(abs(sum…

简单了解unordered_set和unordered_map底层

目录 1.哈希表(开散列)实现 1.1 介绍模板参数 1.2 代码实现 2.迭代器 3.HASH转整形的类 4.unordered_map简单实现 5.unordered_map简单实现 6.验证 1.哈希表(开散列)实现 1.1 介绍模板参数 //K&#xff1a;关键码 //T&#xff1a;保存数据&#xff0c;unordered_map是一…

[NSSCTF 2nd]php签到 详细题解

知识点: linux文件后缀名绕过 表单文件上传 pathinfo 函数 file_put_contents()函数 命令执行 代码审计: <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION…

《CUDA编程》11.CUDA流

本章将介绍CUDA流 CUDA程序的并行层次主要有两个&#xff1a;一个是核函数内部的并行&#xff0c;一个是核函数外部的并行&#xff0c;核函数外部的并行主要指&#xff1a; 核函数计算与数据传输之间的并行主机计算与数据传输之间的并行不同数据传输之间的并行核函数计算与主机…

操作系统期末|考研复习知识点汇总 - 持续更新

本文将根据个人学习进度对b站王道408课程以及题目考察的知识点进行整合&#xff0c;视频中详细的导图将会直接复用&#xff0c;并且将会对一些重点知识进行扩展以及一些思维导图的补充&#xff0c;(目前第三章内容正在整理中……由于第三章内容繁多且都是重点&#xff0c;习题量…

.NET Core WebApi第3讲:第一个WebApi项目、WebApi开发三种模型

一、.NEt Core 1、运行模板项目 1&#xff09;仍然有controllers&#xff0c;说明WebApi是基于MVC模式的&#xff0c;只是对比之下这里没有MVC中的views。 因为WebApi只会向前台发送数据&#xff0c;不会向前台发送HTML页面。 2、验证模板项目的api 1&#xff09;法1&#xf…

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景&#xff1a;微服务之黑马商城项目-登录拦截器在网关完成用户的校验&#xff0c;并将用户信息&#xff08;用户id&#xff09;存入请求头&#xff0c;假设将购物车里面的商品进行结算就会生成订单并清空购物车&#xff0c;这里涉及到了交易服务模块远程调用购物车模块&…

单细胞数据分析(一):10X数据生成seurat数据对象

文章目录 介绍加载R包数据链接导入数据过滤细胞:移除双重细胞合并所有seurat数据对象输出结果系统信息介绍 在单细胞基因组学研究中,Seurat是一个流行的R包,用于单细胞基因表达数据的分析和探索。以下是如何从10X基因注释数据生成Seurat数据对象,并对该数据进行过滤的步骤…

RHCE的学习(8)

动态网站 lnmp&#xff08;LAMP&#xff09; 解析index.php界面 &#xff08;1&#xff09;预配&#xff0c;确保服务能够被访问 systemctl stop firewalld setenforce 0 &#xff08;2&#xff09;安装nginx服务 mount /dev/sr0 /mnt cat /etc/yum.repos.d/base.repo dnf …

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步&#xff0c;社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前&#xff0c;许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…

UML总结

零&#xff1a;学习链接 UML_哔哩哔哩_bilibili 一&#xff1a;UML概述 二&#xff1a;类图 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;中一种重要的图形表示&#xff0c;用于描述系统中的类及其之间的关系。它是面向对象设计中常…

软件已死,数据永生?

大数据产业创新服务媒体 ——聚焦数据 改变商业 你有没有注意到&#xff0c;你的生活正在被数据所支配&#xff1f; 我们看似在掌控自己的每一次点击、每一次搜索、每一个消费选择&#xff0c;但实际上&#xff0c;背后隐藏着庞大的数据网络。每一个点赞、每一次搜索&#xff…

Java非对称加密:RSA 数据加密与解密、数字签名与验签

Java常用的加密与解密系列文章: 《Java编码方式:Base64 编码与解码》 《Java消息摘要:MD5 验证数据完整性、密码的加密》 《Java消息摘要:SHA 验证数据完整性、密码的加密》 《Java对称加密:DES、3DES 数据加密标准》 《Java对称加密:AES 高级加密标准》 《Java非对称加密…

java质数的判断 C语言指针变量的使用

1. public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入一个值");int num sc.nextInt();boolean flagtrue;for (int i2;i<num;i){if (num%i0){flagfalse;break;}}if (flag){System.out.println(num"是一…