Linux多线程(一):什么是线程?

news2024/9/22 19:28:54

文章目录

    • 一、前言
    • 二、什么是线程?
    • 三、线程是如何实现的?
    • 四、基本概念梳理
    • 五、后记

一、前言

什么是线程?操作系统书籍上可能会给你这样的解释与定义:

  • 线程是在进程内部运行的执行流
  • 线程比进程的执行力度更细,线程的调度成本更低
  • 线程是CPU调度的基本单位

 显然这些话放诸四海皆准,对于任何的操作系统都是适用的。讲的太过于概括,真是“听君一席话,如听一席话”,对于线程还是没有一个明晰的认识。但在这篇博客里,我们不谈什么高大上的东西,我将用最浅显的语言让大家理解Linux下的线程是什么样的,以及我们应该如何创建、控制多线程

二、什么是线程?

 在学习线程之前,大家想必都学习过进程。在进程中,我们可以使用fork()函数来创建子进程(如下)。父子进程间代码和数据是共享的(不对数据做修改的话),我们通过if判断语句让父子进程分别执行不同的代码,因此我们可以初步形成以下认识:可以对不同的执行流划分同一块空间,使其执行不同的代码

int main()
{
    pid_t pid = fork();
    if(pid == 0){
        // 子进程代码
    }
   else {
        // 父进程代码
    }
}

 基于这样的认识,我们不禁思考,能否对一个进程的进程地址空间进行划分呢?线程本质上就是 “轻量级进程” ,即只执行一个进程的部分代码,占用部分的进程地址空间,占用部分的物理内存。

三、线程是如何实现的?

 不同于Windows操作系统,Linux并没有真正意义上的线程。Linux中线程本质上复用的就是进程的数据结构——我们同样创建 task_struct,但是不独立分配进程地址空间和页表,因此各个线程看到同一份进程地址空间,但是只执行部分代码,使用部分物理空间。
 CPU调度的基本单位就是 PCB(Linux中就是task_struct) ,当CPU调度进程的时候,看到的是一个PCB;当CPU调度线程的时候,看到的仍然是一个PCB,并且使用的是同一块进程地址空间。从CPU的角度看,这有区别吗?这没有任何区别,在Linux中,没有线程与进程的区别,只有执行流的区别。只不过基于我们上面对于“轻量级进程”的阐述,你不难理解,线程的 task_struct 背后挂靠的进程地址空间和页表,必然是曾经进程地址空间和页表的一小部分。
 CPU可以轮流调度各个 task_struct, 由此让原本串行的代码得以在同一时间段内同时得以推进,这种解决方案就叫做线程。
在这里插入图片描述
 Linux复用PCB(process control block)来模拟实现TCB(thread control block),因此Linux中TCB就是PCB,这是一种非常优雅的设计方案,这里给大家列举几个优势:

  • 不用单独设计TCB
  • 不用维护TCB和PCB之间的关系
  • 不用单独编写TCB的调度算法
  • ……

我们重新认识一下什么是进程什么是线程:

  • 内核的角度看,进程就是承担分配系统资源的基本实体
  • 线程是调度的基本单位

四、基本概念梳理

我们再来理解之前提到的课本上对于线程解释与分析:

  1. 线程是在进程内部运行的执行流
    【理解】:因为线程是在进程的进程地址空间内部运行的,所以是在进程内部执行的
  2. 线程比进程的执行力度更细
    【理解】:因为线程只是执行进程的部分代码,访问进程的部分数据
  3. 线程的调度成本更低
    【理解】:线程间共用同一套进程地址空间,因此线程切换时,不需要切换进程地址空间和页表,只需要切换上下文数据即可
  4. 线程是CPU调度的基本单位
    【理解】:CPU在调度的时候只看PCB。一个PCB就对应着一个线程

五、后记

 线程有什么优点和缺点呢?光谈理论想必大家也难以理解,之后会逐步给大家呈现。如何创建线程、使用线程呢会在下篇博客里为大家深度剖析

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

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

相关文章

年底无情被裁,我面试大厂的这几个月…

2022年接近尾声,“金九十”今年也变成了“铜九铁十”。 大厂不断缩招,不容忽视的疫情影响,加上不断攀升的毕业生人数,各种需要应对的现实问题让整个求职季难上加难。 在这个异常残酷的求职季,很多人的困惑、面临的问…

VM系列模块基本信息

外形尺寸: VM501/604/608 30.0mmX26.0mmX4.3mm 贴插封装-20 VM511/614/618 60.0mmX36.0mmX4.8mm 直插-22 VM704 30.0mmX26.0mmX6.0mm 直插-20 VM704S 32.0mmX32.0mmX15.0mm 直插-20 数字接口:UARTI2C UART:TTL/R…

03-SpringBoot进阶

知识回顾 知识目标 1、SpringBoot单元测试【掌握】 2、SpringBoot 整合 MybatisPlus【重点】 3、SpringBoot添加分页插件【掌握】 4、SpringBoot定义拦截器【掌握】 5、SpringBoot使用类型转换器【掌握】 6、文件上传【掌握】 7、SpringBoot异常处理【掌握】 8、SpringBoot定…

Navicat 16 和表空间 | 第 一 部分

优点 你知道 Navicat 16 支持表空间吗?表空间是表(以及索引、大型对象和长数据)的存储结构,它将数据库中的数据组织成与在文件系统上存储数据的位置相关的逻辑存储组。它的主要功能是联接物理存储层和逻辑存储层。通过将表分配给表…

c盘空间怎么扩大?

电脑系统主要存储在C盘,用户还可能会将一些软件、文件夹存储在C盘,所以电脑C盘必须拥有足够充足的空间,为了大家更好地使用电脑,这里小编带来的就是电脑扩大C盘空间的教程。 1、右击桌面的计算机图标,然后选择管理! 2、…

过滤器的使用

过滤器的使用过滤器介绍过滤器的使用配置过滤器过滤器路径的配置规则前置、后置、环绕过滤器过滤器链过滤器的优先级过滤器介绍 过滤器(Filter)是位于客户端与服务器资源之间的一道过滤技术,可以在客户端请求到达目标资源之前进行预处理业务。 过滤器作用 执行多个…

【Java实战】系统设计需要注意的细节

目录 一、前言 二、设计规约 1.【强制】存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档。 2.【强制】在需求分析阶段,如果与系统交互的 User 超过一类并且相关的 UseCase 超过 5 个,使用用例图来表达更加清晰的结构化需求。…

小说电子书阅读系统毕业设计,小说电子书阅读系统设计与实现,毕业设计论文源码开题报告需求分析

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的电子书阅读系统,整个网站项目使用了B/S架构,基于java的springboot框架下开发;管理员通过后台录入信息、管理信息,设置网站信息,管理会…

4款游戏开发引擎优缺点分析

随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例,它便是我们常常所说的小游戏。 游戏和小游戏的区别 要盘点小游戏开发引擎之前,我们得先来了解下游戏…

vue3+ts 实现文件在线预览

一、背景 企业微信自建项目中要求PC端也能进行文件预览,但是企业微信提供的接口只能在移动端使用,通过查阅资料修改成贴合项目的方法。参考:https://blog.csdn.net/w_t_y_y/article/details/115767747 kkFileView官方文档 二、preview-file…

浅析能源物联网技术在校园能耗监测系统中的应用与研究

摘要:绿色环保已成为时代的主题,与此同时,节能减排也成为我国蓝天保卫战的重要措施。我国大型公共建筑年耗电量约占全国城镇总耗电量的22%,每平方米年耗电量是普通居民住宅的10~20倍,是欧洲、日本等发达国家同类建筑的…

《四》多线程基础——Java线程生命周期及转换

Java并发编程系列文章 《一》多线程基础——Java线程与进程的基本概念 《二》多线程基础——Java线程入门类和接口 《三》多线程基础——Java线程组和线程优先级 《四》多线程基础——Java线程生命周期及转换 《五》多线程基础——Java线程间的通信(互斥与协作&…

Git统计代码行数;Java实现统计代码行数,忽略空行、注释行

前言 某天,产品叫我算下某个项目的代码行数,我一愣,这怎么统计?总不可能一个文件一个文件算吧?后面我找了下,git是可以统计提交到仓库的所有的代码的,不过有个问题,就是假如有些文件…

在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh

一、移植环境: 开发环境:Keil MDK 5.33 硬件平台:STM32F103C8T6 RT_Thread版本:RT-Thread Nano V3.1.5 二、在RT-Thread Nano V3.1.5添加uart控制台 1.需要在rtconfig.h开启以下两个宏 1)#define RT_USING_CONSO…

ITK (1)窗宽窗位的意义与设置

背景与意义 医学图像与传统可视化图像相比,其具有更大的“灰度”范围。如,普通图像(灰度图像)的灰度范围一般是256级(即图像中最亮的点的灰度值定义为0,最亮的定义为255,也就是2^8,…

【图像处理OpenCV(C++版)】——2.1 深入理解OpenCV之Mat类及相关成员函数

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

【论文阅读31】《OptCuts: Joint Optimization of Surface Cuts and Parameterization》

目录 一些疑惑 0 引言 1 introduction 2 related work 2.1 parameterization with fixed connectivity 2.2 Separate Cut Computation 3 problem statement ​编辑​ 3.1 数学形式1 3.2 数学形式2 3.3 能量函数 3.3.1 接缝线长度(归一化)&am…

程序员们,你会考虑使用中文编程吗?

众所周知,编程语言有一条无形的“鄙视链”。 Java和C#相互不服,并且看不起写Python的,Python看不起PHP,PHP看不起前端。而中文编程就在这个语言“鄙视链”的底端艰难生存。 有人对中文编程嗤之以鼻,相比于“人生苦短…

免费网课题库系统接口

免费网课题库系统接口 本平台优点:免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库:题库后台http://daili.jueguangzhe.cn/ 题…

[附源码]计算机毕业设计JAVA职业中介信息管理系统

[附源码]计算机毕业设计JAVA职业中介信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…