Linux之多线程概念

news2024/11/23 22:40:10

目录

线程概念 

线程共享的资源

线程独有的资源 

线程优点

线程缺点 


在之前,我们已经学习了进程相关的知识点,如进程的基本概念和基本操作,本期我们将开始进行线程的学习,探索线程和进程的关系。

线程概念 

在学习线程之前,我们先来回顾一下进程的相关概念。图示如下。

 上图为进程的内核结构,运行可执行程序时,可执行程序的代码和数据被加载到内存之后,操作系统生成了进程相关的数据结构,如进程控制块(task_struct),进程地址空间(mm_struct)和页表,我们把进程相关的数据结构和加载到内存中的代码的数据统称为进程,CPU通过调度进程去运行从物理内存中映射到地址空间的代码,最终进程完成了可执行程序的执行。

但是线程和进程又有什么关系呢? 

其实,可以这样理解,线程就是进程内部的一个执行流,之前我们认识的进程我们一直以为这个进程就只有一个执行流,但是在今天以及以后,我们在谈论进程时,我们一般默认认为进程内部有多个执行流。通过图示为大家展示。

以往的学习,我们认为进程内部就只有一个执行流也就以为只有一个pcb,但是实际上,一个进程内部可以有多个执行流,可以拥有多个pcb,一个pcb其实就是一个线程,多个pcb整体称为一个进程。所以我们也称线程为轻量级进程。 

通过线程,我们可以将代码进行分割,以往一个pcb执行的代码此时由多个pcb进行执行,可以大大的提升代码执行的效率。

由上图可以看出,所有的pcb都是共享一个进程地址空间的,那么是不是可以理解为进程中所有的资源都是共享的呢?当然不是,线程大部分的资源都是共享的,少部分的资源是独有的。

线程共享的资源

纵使线程内部有着很多的线程,但是这些线程本质上都是继承了主线程的pcb,所以也继承了父进程中相关的数据,如struct files_struct*指指针。线程共享的资源有四种。

  • 文件描述符表。因为所有的线程其实本质上都是基于主线程产生的,继承了主线程的数据。所以所有线程共享同一文件描述符表。
  • 信号的处理方式,因为信号是给进程发的,信号的处理是以进程为单位的,所以与线程是无关的,即每个线程对信号的处理方式都是相同的。
  • 当前的工作目录。
  • 用户id和组id。

线程独有的资源 

线程再运行时,一定会产生自己的临时数据,这些临时数据是存储在栈中的,而且每个线程的调度时间都是根据时间片进行调度的,所以一定有自己的上下文数据。

  • 线程id。
  • 栈。
  • 一组寄存器,用于存放上下文数据。 
  • 调度的优先级,每个线程的调度的先后是不同的。

在Linux中一定会存在大量的线程,既然存在大量的线程,操作系统一定会对线程进行管理,按照以往的方式,应该是先描述,后组织,但是Linux操作系统的做法是,Linux并不会为线程创建专门的结构体进行描述和管理,而是会复用进程的结构体去创建线程,从而去复用进程的相关接口,所以可以理解为线程其实就是进程的复用。但是同时Linux操作系统同时为用户提供了原生线程库(第三方库pthread),供用户对线程进行相应的操作。怎么验证,线程是复用进程的呢?通过一段代码为大家解释。

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>


void* thread_run(void* args)
{
  const char* name=(const char*)args;
  while(1)
  {
    printf("我是%s线程\n",name);
    sleep(1);
  }

}

int main()
{
  pthread_t tid;
  pthread_create(&tid,NULL,thread_run,(void*)"thread 1 ");
  while(1)
  {
    printf("我是主线程\n");
    sleep(1);
  }

  return 0;
}

 运行结果如下。运行是因为是使用了第三方库,所以要在编译时添加-pthread选项。

使用ps -aL可以查看正在运行的线程。

在代码中有两个线程,一个主线程,一个使我们创建的线程,我们发现这两个线程的pid是相同的也意味着,这两个线程同属与一个进程,但是其LWP是不同的,LWP可以理解为线程的id,且CPU在调度时是以LWP为最小单位进行调度的。也即CPU在调度是是以线程为基本单位进行调度的。

此时我们可以给出线程的概念。

进程是参与系统资源分配的基本单位,线程是CPU调度的基本单位。线程在进程的地址空间中运行。

线程优点

  • 线程创建的代价比进程小很多,因为线程的创建只需创建对应的pcb一个数据结构体即可,只参与进程地址空间中资源的分配;而进程的创建要创建大量的结构体,task_struct,mm_struct,页表,除此之外,还要维护进程地址空间和物理内存的映射关系,相当复杂。
  • 线程占用的资源比进程少很多,因为进程的资源是被线程分配的。
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现,提升计算效率。计算密集型应用主要是加密和大数据运算等,主要使用CPU资源。
  • I/O密集型应用,为了提高性能,将I/O等待操作重叠。线程可以同时等待不同的I/O操作。I/O密集型应用主要是网络云盘,在线下载,看电影等等,主要使用内存和外设的I/O资源。

线程缺点 

  • 性能损失。在计算密集型应用中,当线程的数量大于CPU数量时,会导致CPU调度线程时来回切换,线程的来回切换也是需要消耗资源的,所以会造成计算机性能的损失。
  • 健壮性降低。当一个线程发生异常时,操作系统发现异常会向对应的进程发送信号,导致进程异常退出,进程异常退出,所有的线程也就异常退出了。
  • 缺乏访问控制。因为在进程内部,线程数量较多时,无法确保有效的访问某一个进程。
  • 编程难度提高。多线程的代码的编写和调试难度极高。

 以上便是线程概念的相关内容,本期内容到此结束^_^

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

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

相关文章

镭速助力构筑ICT安全高效的大文件传输

在数字化浪潮的推动下&#xff0c;信息通信技术&#xff08;ICT&#xff09;行业正以惊人的速度发展&#xff0c;随之而来的是跨国、跨区域文件传输需求的激增。然而&#xff0c;传统的大文件传输方法已难以满足当前ICT行业的需求&#xff0c;面临着诸多挑战&#xff0c;如跨国…

多用户B2B2C商城源码+短视频直播+APP+小程序+H5

店铺管理 店铺列表&#xff0c;新店铺审核&#xff0c;地址管理&#xff0c;服务管理&#xff0c;运费模版&#xff0c;品牌管理 订单监管 视频订单&#xff0c;拼团订单&#xff0c;评论管理&#xff0c;退款管理 装修商城 模版管理&#xff0c;页面管理&#xff0c;全局…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…

涨幅超过了90%,心动网络股价成V字后,TapTap找到流量源了吗?

心动公司发布了截至2024年6月30日止六个月的中期业绩。 在2024年上半年&#xff08;24H1&#xff09;&#xff0c;公司实现总营收22.21亿元&#xff0c;较去年同期增长了26.7%。归属于母公司的净利润达到2.05亿元&#xff0c;同比激增127.4%。经调整后&#xff0c;归属于母公司…

Linux下使用crontab配置定时任务

文章目录 Linux使用crontab安装crontab启动crontab查看定时任务创建定时任务配置案例配置语法位置含义符号含义 注意 取消定时任务 Linux使用crontab crontab为Linux下的计划任务程序&#xff0c;对应的服务为crond。crond是一个守护进程&#xff0c;每分钟会定期检查是否有要…

OZON秋季爆款新品推荐,OZON秋季爆款

Top1 吸顶灯 Светильник влагозащищенный 15W IP65 6500К (155х37) круг светодиодный настенно-потолочный герметичный для использования в сухих а так-же вла…

自闭症儿童的语言障碍:理解、接纳与干预

自闭症&#xff0c;这个在现代社会中逐渐受到关注的神经发育障碍&#xff0c;给许多家庭带来了挑战与希望并存的旅程。其中&#xff0c;自闭症儿童的语言障碍是尤为显著且复杂的问题之一。 自闭症儿童的语言障碍表现为多种形式&#xff0c;包括语言发育迟缓、语言形式或内容异常…

如何修复软件中的BUG

笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线&#xff0c;已经成型的产品&#xff0c;该如何解决存在的bug呢&#xff1f;这是本文要阐述的内容。 在这里&#xff0c;首先说一下bug的种类及bug严重程度分类&…

echarts图表标题,层级,view表格,机型适配

1.主标题和副标题在同一行上 在副标题当中设置itemGap:0 title: [{text: ,left: left,textStyle: {fontSize: adjustSize(0.7),fontWeight: 400,color:#333,}},{subtext: ,left: right,itemGap: 0, subtextStyle: { //设置字体样fontSize: adjustSize(0.7),fontFamily: sans-s…

Linux查看jar包错误日志及持久化运行jar包

一、查看jar包运行信息命令&#xff1a;ps -ef | grep java 如图&#xff0c;给出了所部署jar包的环境变量&#xff0c;服务名称&#xff0c;服务端口信息。 这样便能得到部署的jar包是否在服务器成功运行及基本信息。 二、查看日志 启动信息无误&#xff0c;查看日志是否有报错…

机器人5GCPE模块参数的获取与上报设计

目录 1. 5GCPE模块参数功能的获取 2. 5GCPE模块参数功能的上报 3. 5G与WIFICPE运行效果 1. 5GCPE模块参数功能的获取 根据5G皮带机器人新需求&#xff0c;需要增加5GCPE信息的获取与上报参数的需求&#xff0c;以供上位机进行信号强度等信息的展示&#xff0c;所获取的ip地址…

十一、对象池

转载对象池链接&#xff1a;http://t.csdnimg.cn/YnwKL 一、理念 创建一个对象池代码&#xff08;通用版代码&#xff09; 注&#xff1a;对象池是2021之后才有的功能 创建对象池代码&#xff1b;引入命名空间&#xff1b; 公开变量&#xff0c;传入生成的哪个模型 创建对…

11 C语言先序方式创建二叉树

这个代码是使用占位符的方式创建二叉树 #include "stdio.h" #include "stdlib.h"typedef struct node {char data;struct node *lchild;struct node *rchild; } Node;Node *create_node(char value) {Node *node (Node *) malloc(sizeof(Node));if (node…

weblogic漏洞——CVE-2020-14882

一、基本信息 靶机&#xff1a;IP&#xff1a;192.168.100.40 二、攻击过程 进入 vulhub 靶场相关目录&#xff0c;并启动环境 cd master/weblogic/CVE-2020-14882 docker-compose up -d 绕过登录验证 http://192.168.100.40:7001/console/css/%252e%252e%252fconsole.por…

软件测试学习笔记丨Linux-Bash编程语法

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32091 一、Bash编程基础 1.1 变量 1.1.1 语法 Variable_namevalue 1.1.2 变量定义的规则 变量名区分大小写&#xff0c;a和A为两个不同的变量&#xff1b;变量名可以使用大小写字母混编的…

陷抄袭风波 《黑神话:悟空》该如何应对

都说人红是非多&#xff0c;国产首部3A游戏《黑神话&#xff1a;悟空》在爆火的同时&#xff0c;一些问题也随之出现。一方面《黑神话&#xff1a;悟空》陷入抄袭风波&#xff1f;另一方面该游戏也被很多黑灰产盯上了。 8月23日&#xff0c;“塞上李云中”发布微博&#xff0c;…

【WRF安装编译问题解决】Linux中gcc和gfortran降级方法

Linux中gcc和gfortran降级方法 准备&#xff1a;gcc和gfortran版本查找1 查看gcc和gfortran安装版本2 gcc版本降级2.1 gcc版本降级至9.5.0-通过下载源码编译安装2.2 gcc版本降级至9.1.0-通过下载源码编译安装 3 gfortran版本降级参考 在安装编译WRF环境时&#xff0c;无法成功编…

【Python报错已解决】`WebDriverException: Message: invalid session id`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

Kubernetes精讲之环境搭建

目录 一 Kubernetes 简介及部署方法 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.4.1 K8S各个组件用途 1.4.2 K8S 各组件之间的调用关系 1.4.3 K8S 的 常用名词感念 1.4.4 k8s的分层架构 二 K8S集群环境搭建 2.1 k8s中容器的管…

每日一题,力扣leetcode Hot100之118.杨辉三角

解题思路就是动态规划&#xff0c;确定好边界值和要动态传递的值 边界值就是每一排的第一个和最后一个肯定是1 动态传递值就是除了边界值每一个都等于他的左上加右上 class Solution:def generate(self, numRows: int) -> List[List[int]]:ret list()for i in range(num…