当前位置: 首页 > 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时都是针对该索引库进行增删改查。...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...