【Linux】线程的概念理解,从感知理解到全面深入

news2024/9/20 14:22:54

1.初始线程概念

在伟大的”计算机哲学“操作系统这本书中,一般给出线程的概念为:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以,不必特别纠结!下面我将带大家深入理解线程的概念!

2.Linux线程是什么?

2.1由Windows线程到Linux线程

我们一般学过Windows开发的都知道,在Windows中存在单独的线程TCB。但是,Linux中没有专门为线程设计TCB,而是用进程的PCB来模拟线程。

Linux之所以采用这样的设计:不用维护复杂的进程和线程的关系,不用单独为线程设计任何算法,直接使用线程的一套相关方法。OS只需要聚焦在线程间的资源分配上就可以了!

2.2如今的进程VS之前的进程

话不多说,先来上一张图片,加入大家对Linux系统中轻量级进程的理解,如下所示:
在这里插入图片描述
之前的进程,内部只有一个执行流的进程。今天的进程,内部可以具有多个执行流。
创建进程的”成本“非常高,要使用的资源非常多(由1到1)成本:时间+空间。现在有了轻量级进程后,从内核视角来看:进程是承担分配系统资源的基本实体。线程是CPU调度的基本单位,承担进程资源的一部分的基本实体。进程划分资源给线程!

3.Linux线程与接口关系的认识

Linux PCB 小于等于传统意义上的进程PCB。Linux进程即为轻量级进程。在Linux中线程由OS创建,CPU调度

Linux因为是用进程模拟的,所以Linux下不会给我们提供直接操作线程的接口,而是给我们提供,在同一个地址空间内部创建PCB的方法,分配资源给指定PCB的接口。Linux本身不会提供线程操作的接口,这对用户来说操作不是特别友好,所以系统级别的工程师,开发了一套可以让用户直接使用的接口,原生线程库(用户层)

4.再谈线程概念

线程在进程的地址空间内运行!CPU调度的时候只看PCB,每一个PCB曾经被指派过指向方法和数据,CPU可以直接的调度,线程属于进程的一部分。从以下几点理解之句话:

  • 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是”一个进程内部的控制序列。“
  • 一切进程至少都有一个执行线程。
  • 线程在进程内部运行,本质是在进程地址空间内运行。
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

5.线程的优点

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

6.线程的缺点

  • 性能损失: 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低: 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制: 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高: 编写与调试一个多线程程序比单线程程序困难得多

7.线程的异常

  • 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
  • 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

8.线程和进程之间的联系

8.1

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

8.2

进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
1)文件描述符表
2)每种信号的处理方式(SIG_IGN,SIG_DFL或者自定义的信号处理函数)
3)当前工作目录
4)用户id和组id

8.3

在这里插入图片描述

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

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

相关文章

高频交易双柜台系统如何开通?

市面上的量化系统很多,快速通道也很多,但是可以满足双柜台系统的这个确实是很少的。能满足双柜台系统的,那恐怕只有华锐双柜台系统可以!我们先简单来了解下双柜台系统: 华锐双柜台系统(SST)是…

外贸行业怎么跟进客户?

外贸行业怎么跟进客户? 建立一个完善的跟进系统需要人性化关怀和高效的技术支持。 人性化关怀是指以客户为中心,关注客户的需求和情感,建立真诚、个性化的关系;高效的技术支持则是指利用技术和工具来提高跟进效率和服务质量&#…

QT用户管理效果预览

用户管理效果 QT 用户管理 GITHUB网站 QT版本 CMakeList.txt find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED) target_link_libraries(tableView PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)GitHub代码获取链接 GitHub代码获取链接

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情,认为自己就像是一位能够编织魔法的巫师,能够创造出炫酷的虚拟世界。 然而,这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了!所有…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

【GIS】1.什么是空间分析?

新坑!!! 本系列文章主要参考CHICAGO大学的空间数据科学中心的相关课程( ̄∇ ̄)/感谢分享~ 什么是空间分析 空间分析不仅仅是指做一个地图这么简单,而是为这些位置空间添加实际的值,并…

thinkphp商城系统之商品模块表设计

5.后台商品模块 商品模块是商城项目最核心的模块,也是最复杂的。如果说你能掌握这个模块,那对你来说绝对是获益匪浅,这模块会涉及到以下知识点: 聊聊电商领域中的SPU和SKU表的设计,告诉你为什么要这么设计复杂的查询…

实现 wsl ssh 自启动

目录 一、wsl 端操作1.1 创建并编辑 /etc/init.wsl,加入如下内容,并保存1.2 对文件 /etc/init.wsl 添加执行权限1.3 编辑sudoers,避免输入密码 二、windows 端操作2.1 新建 startservice.vbs 文件,并保存如下内容2.2 实现脚本 sta…

前端使用XLSX导出excel表格

1 单个sheet page.js(页面中的导出方法) import { exportExcel } from ../../../utils/exportExcel.js; leadOut() {const arr [{ id: 1, name: 张三, age: 14, sex: 男 },{ id: 2, name: 李四, age: 15, sex: 女 },{ id: 3, name: 王五, age: 16, sex: 男 },];const allR…

MySQL数据恢复之binlog2sql的安装和使用,很详细

MySQL数据恢复之binlog2sql的安装和使用,很详细 一、前言二、binlog2sql的介绍三、安装binlog2sql1、安装git(已安装可以跳过)(1)、正常安装(2)、编译安装报错①、安装libcurl (2&am…

Win11专业版,eNSP启动失败,错误代码40 解决方法

微软Win11系统默认开启的 Virtualization-based Security (VBS)“基于虚拟化的安全性”会导致游戏、跑分性能下降。VBS 基于虚拟化的安全性,通常称为内核隔离。使用硬件虚拟化在内存中创建安全区域,为其他安全功能提供了一个安全平…

DNSLog漏洞探测(五)之XXE漏洞实战

DNSLog漏洞探测(五)之XXE漏洞实战 本文我们来学习如何利用DNSLog平台探测目标网站是否存在RCE漏洞,接下来我们还是利用Pikachu的靶场作为演示。首先我们先进入Pikachu靶场的XXE漏洞界面。 如果此时网站的界面存在着无回显的XXE漏洞,这种情况下&#xff…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名,密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…

美团P3-2大佬写给初中级前端的《高级进阶面试指南》

都说金9银10,节前自己也去面试了几家公司,幸而都收到了offer。如今已经入职美团两月有余,最近闲来有空,整理一番,希望对各位找工作有帮助。 说在前面,我的答案仅供参考。答案有不全或有偏颇之处&#xff0…

Linux 搭建 gitlab

目录 前言安装依赖项添加GitLab存储库安装GitLab CE创建新存储目录编辑GitLab配置文件,例如更改默认域名或端口:重新配置并启动GitLab服务以应用更改:前言 centos搭建gitlab代码仓库 安装依赖项 在安装GitLab之前,您需要先安装一些必要的依赖项: yum install -y curl …

Clique expension和star expension

Clique expension(团扩展),也叫连通分量扩展。 其含义是:将超边中所有顶点都连接在一起,比如有3个顶点的超边,扩展成普通图时两两相连就会有3条边。以此类推。连接和n个顶点的超边拓展后有条边。同一个超边…

keil生成bin文件(通用型)

有些时候需要在keil里面生成bin文件,但找到的各种方式五花八门,特别是要填写文件路径等没有通用性,搞个不同的工程就得改下,找到这个跟路径无关的代码,进行记录下。 首先还是点开keil的设置: 按照上面的图…

前沿技术|张磊:RR22 Blazing Fast PSI 实现介绍

“隐语”是开源的可信隐私计算框架,内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择,提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow ​ 11月25日,「隐语开源社区 Meetup西安站」顺利举…

node 版本管理与镜像源

工作中使用node,不同的前端项目可能依赖不同的版本,就需要对node进行版本管理,我们可以使用n来进行node版本的管理,而且n也可以用于安装指定版本的node。 在安装n之前,我们先来确定一下我们的npm是否配置有国内镜像源…

当 Sealos 遇上区块链

当 Sealos 遇上区块链 拿着区块链技术不一定是去发币,很多业务系统也适合用这些技术,比如做个统一支付系统,积分系统等,可以做为一家公司的金融基础设施,或支付中台。拿链的技术去做有很多好处: 高可用&a…