【Linux】:线程概念

news2024/11/29 15:08:04

朋友们、伙计们,我们又见面了,本期来给大家带来线程概念相关代码和知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

​ 

目录

​编辑​ 

1. 线程的概念

2. 线程的理解

3. 线程的优缺点 

4. 重谈地址空间

4.1 虚拟地址的转化 

5.5 进程和线程


1. 线程的概念

关于线程有两种概念:

  • ① 线程是比进程更加轻量化的一种执行流 / 线程是进程内部执行的一种执行流;
  • ② 线程是CPU调度的基本单位 / 进程是承担系统资源的基本实体。

那么为什么要有线程呢?

我们创建进程就是要让它执行我们的代码,但是进程的创建到运行这个阶段需要做很多事情(从磁盘加载可执行、由虚拟到物理的转化等等),如果我们只是想单纯的运行代码,那么有很多个可执行需要运行的话,通过创建进程的方式来运行就有点太麻烦了,所以需要有一种比进程更加轻量化的去执行我们的代码。

因为地址空间是进程的“资源窗口”,所以进程可以这个窗口来进行资源的获取,所以为了减少成本,只创建PCB,然后指向同一个虚拟地址空间,实现共享,简单的理解就是将虚拟地址空间中的代码区、数据区、堆栈区进行划分为多个小块,此时多个PCB指向虚拟地址空间只参与资源的分配任务。

那么既然有线程,OS也需要对这些线程进行管理,那么怎么管理呢?先描述、再组织,如果重新设置一套对于线程的管理方法那么实在太麻烦了,线程和进程很相似,所以直接采用管理进程的那一套方案即可,直接复用。

2. 线程的理解

CPU是调度执行流来运行的,那么在了解完线程之后,CPU获取到一个执行流大小是小于等于进程。这该怎么理解呢?我们如何看待现在的进程呢?内部包含多个执行流的进程!

进程 = 内核数据结构 + 代码和数据,现在所说的进程就是包含进程PCB、虚拟地址空间、页表、代码和数据。

其中不只包含一个执行流,而是有多个执行流(在一个地址空间有多个PCB)。

我们之前看待进程其中里面只有一个执行流,所以CPU在调度的时候,如果调度的进程只有一个执行流,那么就是进程,如果有多个执行流,那么就调度其中一个执行流,就叫做线程,所以CPU在调度执行流的大小总是小于等于进程! 

所以线程是CPU调度的基本单位,而进程是承担系统资源的基本实体。

所以创建线程只需要创建PCB,所以线程也叫做轻量级进程。

所以可以得出:

  • 1. 线程的创建相比进程更加简单;
  • 2. 线程在进程的地址空间中运行。

接下来我们通过代码的方式先直观的看一下线程,其中关于线程控制的代码会专门解释,先观察代码运行结果:

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

// 新线程
void *ThreadRoutine(void *arg)
{
    const char *threadname = (const char *)arg;
    while (true)
    {
        std::cout << "I am a new thread: " << threadname << ", pid: " << getpid() << std::endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    // 创建线程
    pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread 1");

    // 主线程
    while (true)
    {
        std::cout << "I am main thread" << ", pid: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}

这段代码首先会创建一个新的线程,然后一个执行流去执行新线程的代码,紧接着往下走就是主线程的代码,代码结果就是会有两个循环在一直执行:

使用指令 ps -aL可以查看线程:

可以看出线程的调度区分并不是用PID来区分,而是LWP,并且主线程的LWP和PID一样。

3. 线程的优缺点 

优点:

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

缺点:

  • 健壮性降低,多线程在运行时,各个线程之间不相互独立,一个线程的异常很有可能导致其它线程出现异常,换句话说线程之间是缺乏保护的
  • 缺乏访问控制,在一个线程中调用某些OS函数有可能会对整个进程造成影响
  • 调试难度比较高,多线程程序比单线程程序调试更为复杂

4. 重谈地址空间

我们的可执行程序被编译好之后以ELF的格式存储在磁盘上,当要执行时会先加载的内存,在之前文件系统部分了解到文件系统IO的基本单位大小是4KB,即使我们所要修改的数据只有1比特位,也需要一次性加载4KB,所以为了统一和方便,将物理内存以4KB划分为多个小块,每一个块被叫做一个页框,磁盘文件中的文件以4KB分为多个小块,每一块被叫做一个页帧,这样子每一次加载磁盘文件时,就根据4KB很容易的将数据加载进来。

以32位4GB的机器来计算,页框的数量有10万多个页框,所以OS也需要将这些页框给管理起来,所以就需要先描述再组织,为页框构建描述结构体的对象(包含页框的属性、使用情况、标志位等等),然后用数组将这些结构体管理,对页框的管理就变成了对数组的增删查改。

4.1 虚拟地址的转化 

通过上面对物理内存以4KB进行划分,所以虚拟地址到物理地址的转化不只只通过页表来转化,虚拟到物理的转化其实是在CPU内部转化的,在我们的CPU中的eip寄存器保存的是虚拟地址,当CPU拿到一个虚拟地址时会通过MMU从虚拟到物理的转化:

例如:虚拟地址32个比特位

1111 1111 1110 0000 0000 0000 0000 0001 

  • 前10个比特位可以找到对应的页目录;
  • 次10个比特位可以找到页表,通过页表可以找到页框;
  • 页框起始地址 + 低12个比特位可以找到页内偏移;

通过整个的虚拟地址就可以访问到物理地址上的数据内容。

可以看到其实划分页表的本质就是划分地址空间。

5.5 进程和线程

进程是资源分配的基本单位
线程是调度的基本单位
线程共享进程数据,但也拥有自己的一部分数据:
  • 线程ID
  • 一组寄存器
  • errno
  • 信号屏蔽字
  • 调度优先级

简单的每个线程都有自己独立的硬件上下文数据与栈结构。

各线程还共享以下进程资源和环境:

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGNSIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!   

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

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

相关文章

Oracle T5-2 ILOM配置

ILOM管理口ip地址配置 连接控制器&#xff08;SP&#xff09;串口&#xff08;RJ45)&#xff0c;进行系统设置 (缺省&#xff1a;9600&#xff0c;8-n-1&#xff0c;root/changeme) …………………. ORACLESP-AK02566506 login: root Password: Detecting screen size; pl…

CSS3 动画相关属性实例大全(1)(@keyframes ,background属性,border 属性)

CSS3 动画相关属性实例大全&#xff08;1) (CSS 中有动画效果的属性图例大全) 本文目录&#xff1a; 零、时光宝盒 一、CSS3 动画基本概念 &#xff08;1&#xff09;、CSS3的动画基本属性 &#xff08;2&#xff09;、keyframes 规则和所有动画属性 二、CSS 中有动画效果…

SQLI LABS | Less-1 GET - Error based - Single Quotes - String

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-1/ 靶场提示 …

CyberRT通信介绍与基于Reader、Writer的通信实践(apollo9.0)

目录 数据通信场景 CyberRT中的通信方式 ​编辑 通信模式 话题通信 服务通信 参数通信 protobuf protobuf简介 protobuf文件编写 topic通信实验 实验环境 实验准备 代码编写 定义消息格式 发送消息 接收消息 定义编译规则 程序编译 运行程序 数据通信场景 …

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么&#xff1f; Modbus协议&#xff0c;从字面理解它包括Mod和Bus两部分&#xff0c;首先它是一种bus&#xff0c;即总线协议&#xff0c;和…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

使用HIP和OpenMP卸载的Jacobi求解器

Jacobi Solver with HIP and OpenMP offloading — ROCm Blogs (amd.com) 作者&#xff1a;Asitav Mishra, Rajat Arora, Justin Chang 发布日期&#xff1a;2023年9月15日 Jacobi方法作为求解偏微分方程&#xff08;PDE&#xff09;的基本迭代线性求解器在高性能计算&#xff…

Java实现油画滤镜效果【参数可调】

油画滤镜的基本原理 油画滤镜的基本思想是通过改变图像的像素&#xff0c;将每个像素用周围随机选择的像素来代替&#xff0c;从而产生类似油画笔触的效果。这种处理方式可以模糊图像的细节&#xff0c;使得图像的色块更加连贯&#xff0c;从而模仿油画的艺术效果。 核心步骤…

后台管理员登录实现--系统篇

我的小系统后台原来就有一个上传图片的功能还夹带个删除图片的功能&#xff0c;还嵌到了一个菜单里面。之前效果如下 那么现在为了加大安全力度&#xff0c;想增加一个登录页面。通过登录再到这个页面。看着貌似很简单&#xff0c;但是听我细细说来&#xff0c;要新增些什么东西…

OpenLayers:构建现代Web地图应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 OpenLayers&#xff1a;构建现代Web地图应用 文章目录 OpenLayers&#xff1a;构建现代Web地图应用1. 简介2. 为什么选择 OpenLa…

Redis 高可用:从主从到集群的全面解析

目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

C#的小数位保留以及四舍五入

C#使用Math.Round("数值","保留位","保留方式")进行小数位保留以及四舍五入 //1.MidpointRounding.ToEven(四舍六入五成双) //当保留小数位后一位为0~4时&#xff0c;舍去末位 var x1 Math.Round(1.124, 2, MidpointRo…

立仪科技:光谱共焦传感器精准测量玻璃

光谱共焦测量技术作为一种创新的光学检测方法&#xff0c;近年来在工业领域引起了广泛关注。 它以其高精度、非接触式的特点&#xff0c;特别适用于透明或半透明材料如玻璃的厚度和表面形貌测量。 接下来&#xff0c;立仪科技小编将深入探讨光谱共焦技术在玻璃测量上的应用及其…

计算机毕业设计Hadoop+Hive+Spark+Flink广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 专业 小四号宋体 班级 小…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件&#xff1a;PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型&#xff0c;满怀期待的检测成果时发现一点长进都…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew&#xff0c;例如使用&#xff1a;$ brew install git命令&#xff0c;如果电脑没有按照brew&#xff0c;则会提示&#xff1a;zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/&#xff0c;复制…

动态规划一>下降路径最小和

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; /**1.创建dp表2.初始化3.填表4.返回值*/public int minFallingPathSum(int[][] matrix) {int n matrix.length;int[][] dp new int[n1][n2];int minNum Integer.MAX_VALUE; for(int i 1; i < n; i) dp[i][0]…

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…

简单说说 spring是如何实现AOP的(源码分析)

在spring生命周期流程中&#xff0c;有一个过程是执行BeanPostProcessor的后置方法 BeanPostProcessor 是一个接口&#xff0c;其实现有 aop实现的核心类是AbstractAutoProxyCreator&#xff0c;其位于spring-aop包下&#xff0c;实现了BeanPostProcessor //BeanPostProcesso…