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

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

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

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

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...