当前位置: 首页 > news >正文

Linux操作系统6- 线程1(线程基础,调用接口,线程优缺点)

上篇文章:Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)-CSDN博客

本篇Gitee仓库:myLerningCode/l27 · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)

目录

一. Linux中的线程

1.1 线程的概念

1.2 OS管理线程的方式 

1.3 线程与进程

二. Linux中创建线程 ⭐

1.1 pthread_create系统调用

1.2 线程之间的资源共享

1.3 线程的私有资源⭐

三. 线程的优缺点 ⭐

3.1 线程的优点

3.2 线程的缺点 


一. Linux中的线程

1.1 线程的概念

        进程是OS调度的基本单位,进程 = PCB + 进程对应数据与代码。而线程是进程内的一个执行流。

        对于一个进程来说,进程是通过虚拟内存与页表的映射来访问物理内存的。所以一个进程的虚拟内存决定了这个进程所拥有的资源。

        在linux中,对于一个进程,如果定义多个PCB指向同一个虚拟内存。让后让这些PCB指向不同的物理内存区域,这些PCB就是线程。

        通过虚拟内存和页表的映射,我们对一个进程的资源进行了划分,这样一来,单个PCB的粒度就比整个进程粒度低。

 关系如下图:

 

其中,所有的PCB + 进程虚拟内存 + 页表 + 进程对应数据代码 = 一个进程

              单个PCB + 单个PCB占用的虚拟内存 + 页表 + 线程对应数据代码 = 一个线程

1.2 OS管理线程的方式 

        OS通过PCB来管理进程,同样所有的线程也需要被OS管理。

        如果想要管理线程,首先需要设计特定的内核数据结构来表示线程对象,即设计一个TCB(线程控制块)。

        Windows就是这样设计线程的。不过需要重新设计一个内核数据结构太麻烦了!

         线程和进程有很多资源是一样的,比如id状态,优先级,上下文,页表,虚拟内存,文件描述符...       

        因此Linux工程师使用直接复用进程的PCB,使用PCB来表示线程。而cpu只关心PCB不关心你是线程还是进程

        所以,线程在进程的地址空间中运行,拥有该进程一部分虚拟内存和资源。

1.3 线程与进程

        进程是承担系统分配资源的基本单位(PCB,虚拟内存,页表,代码和数据等资源)

        而线程是CPU调度的基本单位,在linux中称为轻量级进程\

总结:

1 在Linux中,没有严格的线程,只有轻量级进程,使用进程来模拟线程。

2 线程是cpu调度的基本单位,进程是系统分配资源的基本单位

        linux使用轻量级进程模拟线程的好处:降低维护成本,提高效率

        linux使用轻量级进程模型线程的坏处:用户只认线程,不认进程,所以linux需要为轻量级进程和线程之间提供线程库

二. Linux中创建线程 ⭐

1.1 pthread_create系统调用

        使用man手册查看如下:

可以看到,使用这个接口需要在编译的时候带上参数 -pthread

//头文件
#include <pthread.h>
//库名称
pthreadint pthread_creat(pthread_t *thread, const pthread_attr_t *attr, void* (*start_routine)(void*), void *arg)//参数说明
thread    用于定义线程tid的地址,是输入输出型参数,调用后tid获取线程的id
attr      用于控制线程的属性,我们一般设置为0.表示默认属性
start_routine    线程运行函数的指针,即线程的执行流函数。调用后线程就执行该函数内部的代码
arg       线程函数start_routine的参数

测试代码:

makefile文件

test:test.cppg++ -o $@ $^ -lpthread -std=c++11
.PHONY:clean
clean:rm -rf test

        在Linux中,使用线程必须要使用-l pthread用于链接原生线程库

test.cpp

#include <iostream>#include <unistd.h>
#include <pthread.h>void *start_routine(void *args)
{const char *name = static_cast<const char *>(args);while (true){std::cout << "我是新线程,我的名字是" << name << "pid为:" << getpid() << std::endl;sleep(1);}
}int main()
{pthread_t tid;                                                       // 定义线程tidpthread_create(&tid, nullptr, start_routine, (void *)"I am thread"); // 创建线程while (true){std::cout << "我是主线程,我的pid为:" << getpid() << std::endl;sleep(1);}return 0;
}

测试结果如下:

        可以看到,主线程和新线程是并发执行的。

        并且使用 ps axj 命令查看只有一个test进程,二使用 ps -aL查看线程可以看到test进程内有两个线程,它们的pid是由于的而LWP是不一样的!

        CPU调度的时候,使用LWP来标识每一个线程。并且以进程中的主线程的LWP就是这个进程的pid。

1.2 线程之间的资源共享

        线程被创建后,会共享全局变量,函数等资源。

测试代码:

#include <iostream>#include <unistd.h>
#include <pthread.h>// 全局变量
std::string name = "线程基础";// 全局函数
inline void f()
{std::cout << "调用全局函数" << " 读取全局变量:" << name << std::endl;
}void *start_routine(void *args)
{const char *name = static_cast<const char *>(args);while (true){std::cout << "我是新线程,我的名字是" << name << "pid为:" << getpid();f();sleep(1);}
}int main()
{pthread_t tid;                                                       // 定义线程tidpthread_create(&tid, nullptr, start_routine, (void *)"I am thread"); // 创建线程while (true){std::cout << "我是主线程,我的pid为:" << getpid();f();sleep(1);}return 0;
}

测试结果:

可以说明:线程能够调用全局函数,也可以读写全局变量。这说明两个线程之间如果想要进行通信是非常简单的。不像进程间通信需要通过OS创建资源,然后让两个进程看到同一份资源

 线程之间共享 虚拟内存的代码区,全局变量区,堆区,文件,信号处理

1.3 线程的私有资源⭐

        线程之间共享全局资源,每一个线程也有着自己独立的资源。

1 线程是CUP调度的基本单位,每一个线程有着自己的PCB,有自己独立的id,优先级

2 线程有着自己的上下文结构,这体现线程切换的动态属性。上下文是指线程切换的时候,cpu寄存器中的值,PCB的状态,PCB对应的堆栈结构。

3 每一个线程都有自己独立的栈结构。这个栈结构位于共享区

三. 线程的优缺点 ⭐

3.1 线程的优点

        1 线程的创建消耗比进程低很多

        2 线程切换与进程切换相比,需要OS工作更少,消耗低

为什么线程切换比进程切换开销小?

        1 进程切换需要切换进程的虚拟内存,页表,切换所有的PCB和上下文

        2 线程切换只需要切换一个PCB和线程自己的上下文

        3 线程切换不太用更新catch,进程切换需要更新所有的catch。catch是高速缓存,CPU通过catch与内存交流,一个稳定的进程,会缓存很多热点数据,这样一来,catch的命中率高,线程切换不怎么影响catch的命中率。

        如果切换了进程,需要全部更新catch,这个需要消耗较多的时间

3.2 线程的缺点 

        1 如果创建的线程过多,会造成一定的性能损失

        2 线程会导致代码的健壮性降低,因为一个线程异常退出了,会导致整个进程退出,线程崩溃了,整个进程会崩溃

        3 线程之间共享资源,需要考虑访问控制和同步互斥问题

相关文章:

Linux操作系统6- 线程1(线程基础,调用接口,线程优缺点)

上篇文章&#xff1a;Linux操作系统5- 补充知识&#xff08;可重入函数&#xff0c;volatile关键字&#xff0c;SIGCHLD信号&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l27 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一.…...

每周一个网络安全相关工具——MetaSpLoit

一、Metasploit简介 Metasploit&#xff08;MSF&#xff09;是一款开源渗透测试框架&#xff0c;集成了漏洞利用、Payload生成、后渗透模块等功能&#xff0c;支持多种操作系统和硬件平台。其模块化设计&#xff08;如exploits、auxiliary、payloads等&#xff09;使其成为全球…...

MAC-禁止百度网盘自动升级更新

通过终端禁用更新服务(推荐)​ 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 ​步骤: ​1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 ​2.删除自动更新配置文件 打开终端…...

【C语言】自定义类型:结构体,联合,枚举(上)

前言&#xff1a;在C语言中除了我们经常使用的数据(int&#xff0c;float&#xff0c;double类型)等这些类型以外&#xff0c;还有一种类型就是自定义类型&#xff0c;它包括结构体&#xff0c;联合体&#xff0c;枚举类型。为什么要有这种自定义类型呢&#xff1f;假设我们想描…...

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面&#xff0c;简化了数据库的创建、编辑、查询和维护&#xff0c;适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括&#xff1a; 免费开源&#xff0c;可…...

Mysql配置文件My.cnf(my.ini)配置参数说明

一、my.cnf 配置文件路径&#xff1a;/etc/my.cnf&#xff0c;在调整了该文件内容后&#xff0c;需要重启mysql才可生效。 1、主要参数 basedir path # 使用给定目录作为根目录(安装目录)。 datadir path # 从给定目录读取数据库文件。 pid-file filename # 为mysq…...

聊天模型集成指南

文章目录 聊天模型集成指南Anthropic聊天模型集成PaLM2聊天模型PaLM2API的核心功能OpenAl聊天模型集成聊天模型集成指南 随着GPT-4等大语言模型的突破,聊天机器人已经不仅仅是简单的问答工具,它们现在广泛应用于客服、企业咨询、电子商务等多种场景,为用户提供准确、快速的反…...

搭建农产品管理可视化,助力农业智能化

利用图扑 HT 搭建农产品管理可视化平台&#xff0c;实现从生产到销售的全流程监控。平台通过物联网传感器实时采集土壤湿度、温度、光照等数据&#xff0c;支持智慧大棚的灌溉、施肥、病虫害防治等功能。同时&#xff0c;农产品调度中心大屏可展示市场交易数据、库存状态、物流…...

tee命令

tee 是一个在 Unix/Linux 系统中常用的命令&#xff0c;它用于读取标准输入&#xff08;stdin&#xff09;&#xff0c;并将其内容同时输出到标准输出&#xff08;stdout&#xff09;和文件中。它常用于将命令的输出保存到文件的同时&#xff0c;也显示在终端屏幕上。 基本语法…...

国自然面上项目|基于海量多模态影像深度学习的肝癌智能诊断研究|基金申请·25-03-07

小罗碎碎念 今天和大家分享一个国自然面上项目&#xff0c;执行年限为2020.01&#xff5e;2023.12&#xff0c;直接费用为65万元。 该项目旨在利用多模态医学影像&#xff0c;通过深度学习技术&#xff0c;解决肝癌诊断中的难题&#xff0c;如影像的快速配准融合、海量特征筛选…...

「勾芡」和「淋明油」是炒菜收尾阶段提升菜品口感和观感的关键操作

你提到的「勾芡」和「淋明油」是炒菜收尾阶段提升菜品口感和观感的关键操作&#xff0c;背后涉及食品科学中的物理化学变化。以下从原理到实操的深度解析&#xff1a; 一、勾芡&#xff1a;淀粉的“精密控温游戏” 1. 科学原理 淀粉糊化&#xff08;Gelatinization&#xff0…...

ROS云课三分钟-差动移动机器人导航报告如何撰写-及格边缘疯狂试探

提示词&#xff1a;基于如上所有案例并结合roslaunch teb_local_planner_tutorials robot_diff_drive_in_stage.launch和上面所有对话内容&#xff0c;设计一个差速移动机器人仿真实验&#xff0c;并完成报告的全文撰写。 差速移动机器人导航仿真实验报告 一、实验目的 验证 T…...

应用案例 | 精准控制,高效运行—宏集智能控制系统助力SCARA机器人极致性能

概述 随着工业4.0的深入推进&#xff0c;制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题&#xff0c;尤其在现有工厂改造项目中&#xff0c;如何在有限空间内实现高效自动化成为一大挑战。 此次项目的客户需要在现有工厂基础上进行…...

蓝桥备赛(16)- 树

一、树的概念 1.1 树的定义 1&#xff09;树型结构&#xff08;一对多&#xff09;是⼀类重要的非线性数据结构 2 &#xff09;有⼀个特殊的结点&#xff0c;称为根结点&#xff0c;根结点没有前驱结点 3&#xff09;除了根节点外 &#xff0c; 其余结点被分成 M&#xff08;M…...

黑马测试mysql基础学习

视频来源&#xff1a;软件测试工程师所需的MySQL数据库技术&#xff0c;mysql系统精讲课后练习_哔哩哔哩_bilibili 环境准备&#xff1a; 虚拟机Linux服务器安装mysql数据库。本机安装Navicat。使Navicat连接虚拟机的数据库。&#xff08;麻烦一点的是Navicat连接虚拟机的数据…...

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…...

C++指针的基本认识

1.数组做函数参数 首先,所有传递给函数的参数都是通过传值方式进行的,传递给函数的都是参数的一份拷贝。 接着,当传递的参数是一个指向某个变量的指针时,函数将对该指针执行间接访问操作(拷贝指针,并访问所指向的内容),则函数就可以修改指向的变量。 2.一维数组 数组名…...

TypeScript系列06-模块系统与命名空间

1. ES 模块与 CommonJS 互操作性 1.1 模块解析策略 TypeScript 提供多种模块解析策略&#xff0c;每种策略针对不同的运行环境和开发场景优化&#xff1a; // tsconfig.json {"compilerOptions": {"moduleResolution": "node16", // 或 "…...

Linux(Centos 7.6)命令详解:zip

1.命令作用 打包和压缩(存档)文件(package and compress (archive) files)&#xff1b;该程序用于打包一组文件进行分发&#xff1b;存档文件&#xff1b;通过临时压缩未使用的文件或目录来节省磁盘空间&#xff1b;且压缩文件可以在Linux、Windows 和 macOS中轻松提取。 2.命…...

es-使用easy-es时如何指定索引库

在对应的实体类中&#xff0c;通过注解IndexName指定。 如上图&#xff0c;指定的索引库就是problems&#xff0c;那么之后我使用easy-es时都是针对该索引库进行增删改查。...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...