线程的概念

news2024/10/7 14:28:42

在这里插入图片描述

文章目录

  • 1. Linux线程概念
    • 1.1 什么是线程
  • 2. 页表
  • 3. 线程的优点
  • 4. 线程的缺点
  • 5. 线程用途
  • 6.进程和线程
  • 7. 线程异常

1. Linux线程概念

1.1 什么是线程

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

这是什么意思,大家可能都不理解,下面画图说明:
在这里插入图片描述
这是前面说过的创建进程的样子,如果此时我们想再创建一个进程,OS就会帮我们再创建一个虚拟地址和页表进行映射。那么线程是什么样子的呢
在这里插入图片描述
线程和进程一样会创建task_struct,但是它没有创建单独的虚拟地址和页表,它和父进程用的是同一个虚拟地址和页表,并且线程执行的是进程一小部分代码和数据。

从上图可以看出,线程:进程=n : 1的关系,那么线程也需要描述和管理。在windows系统认为进程和线程在执行流层面是不一样的。所以windows系统中会创建单独的tcb来描述线程

但是在Linux认为线程和进程在概念上没有区分,只有一个。叫做执行流。Linux的线程是用进程的PCB来模拟的

那么我们就需要重新定义进程,内核视角:向系统申请资源的基本单位

那么之前的概念我们又该如何理解呢
在这里插入图片描述
内部只有一个执行流的进程——单执行流进程
在这里插入图片描述
内部多个执行流的进程——多执行流进程

CPU看到的所有task_struct都是一个执行流
在Linux中没有真正意义上的线程,而是用进程task_struct模拟实现的,并且Linux下的"进程"<=其它操作系统进程的概念。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化,所以Linux中的线程也叫做轻量化进程。

那么我们如何证明:Linux下的线程是用进程来模拟的呢
Linux没有真正意义上的创建线程的接口,但是有原生线程库:
在这里插入图片描述
第一个参数是:线程id,是一个输出型参数。
第二个参数是:线程属性,我们暂时不管,我们先设置成null。
第三个参数是:是一个函数指针,是线程调用代码的函数入口。
第四个参数是:指定传递给 start_routine 函数的实参,当不需要传递任何数据时,将 arg 赋值为 NULL 即可

返回值:成功返回0;失败返回错误码

在这里插入图片描述
这个是线程的等待。第一个参数是:你要等哪个线程,第二个是退出的结果。

代码演示
在这里插入图片描述
这个类型是线程原生库提供给我们的,其实就是一个无符号长整型。
在这里插入图片描述
下面我们就需要创建线程:
在这里插入图片描述
callback是回调函数,thread 1和thread 2是创建线程的名字。
在这里插入图片描述
这里的运行结果,我们可以看到会有三个线程。
在这里插入图片描述
这里在编译的时候我们需要加上-pthread
在这里插入图片描述
从这里可以看出它是一个动态库,是用户级调用。

运行结果
在这里插入图片描述
我们可以看到有三个执行流一起执行,并且它们的pid都是一样的,因为它们是三个线程,同一个进程。

那么我们如何查看线程呢
在这里插入图片描述
LWP叫做轻量级进程id,也就是线程id。当LWP和PID是相等的,就是主线程。

2. 页表

在这里插入图片描述
页表不仅仅具有映射功能,还有是否命中功能。
是否命中的意思是:你访问的空间是否在物理内存里,在物理内存里就叫命中,不在就不命中,不命中进程就不会被调度。

这里的U/K的意思是:这个进程执行的是用户级代码还是内核态代码。

3. 线程的优点

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

4. 线程的缺点

1.性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。

2.健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。

3.缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

5. 线程用途

1.合理的使用多线程,能提高CPU密集型程序的执行效率。
2.合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)。

6.进程和线程

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

4.线程共享进程数据,但也拥有自己的一部分数据:
1.线程ID
2.一组寄存器
3.线程栈
4.errno
5.信号屏蔽字
6.调度优先级

7. 线程异常

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

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

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

相关文章

(2022,实体迁移)GAN 的通用 one-shot 域自适应

Generalized One-shot Domain Adaptation of Generative Adversarial Networks 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 基础 4. 方法 4.1 总览 4.2 风格固定与范例重建 4.3 内部分布学习&#xff08;Internal distribution learning&#xff0…

计算机硬件(1)

1.4 计算机硬件 电脑硬件是计算机系统中最基本的部分&#xff0c;可理解成看得见、摸得着的实物。一台电脑是由许多的零部件组成&#xff0c;只有这些零部件组合在一起协调工作&#xff0c;才能称之为电脑。一般计算机的硬件可以简单分为以下部件&#xff1a; 主机&#xff08…

sql比赛复习

systemctl start mysqld create database if not exit; 导入数据 编码、分割符号 alter更 http://172.19.100.21:9000/#!/auth 导入数据 简单插叙 创建视图 disti

嵌入式保温箱温湿度监测解决方案

无论是生鲜还是水果&#xff0c;在运输过程中都要保持恒温以保食材新鲜&#xff0c;这不仅需要强大的冷链运输车来实现&#xff0c;还需要搭配冷链保温箱。 传统的冷链是通过保温箱蓄冷剂&#xff0c;使用快递进行配送。由于市面保温箱功能不一&#xff0c;不同货品又对温度及保…

使用HbuilderX3.8.3_把开发的小程序发布为Html5页面上传到_免费托管空间---uniapp_小程序开发工作笔记009

首先使用hbuider开发完程序,然后,再去,点击发型,然后选择 上传网站到服务器,然后选择 选择新建,然后点击 新建以后然后这里点击新建服务空间,然后再去 这里选择免费服务空间,然后 然后点击立即购买,然后 点

基于AT89C52单片机的简易电子琴设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87853299?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 本设计是基于51系列的单片机进行的设计&#xff0c;利用所给键盘的八个键&#xff0c;能够发出…

基于单片机的红外光控灯系统

摘要 随着时代的飞逝&#xff0c;人们对更加先进、更加环保、更加节约资源、更加可持续地满足自身需要&#xff0c;高科技的运用正变成当今时代发展的动力&#xff0c;其对电子行业有着重要影响。近年来&#xff0c;智能化技术被广泛运用到各种家庭设备上&#xff0c;如智能洗衣…

如何分析OOM文件

一、下载dump文件。 需联系运维同事获取dump文件。dump文件的生成&#xff0c;需在jvm启动时通过添加启动参数&#xff1a;-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath。因此直接到设置的目录文件下下载下来即可。后缀名一般为hprof。有些为dump后缀&#xff0c;改为hpro…

国际儿童节

节日由来 国际儿童节儿童作品画(11张) 国际儿童节的设立&#xff0c;和发生在二战期间一次屠杀——利迪策惨案有关。1942年6月10日&#xff0c;德国法西斯枪杀了捷克利迪策村16岁以上的男性公民140余人和全部婴儿&#xff0c;并把妇女和90名儿童押往集中营。村里的房舍、建筑物…

MySQL中字符串查询效率大比拼

背景 最近有个同事对字符串加索引&#xff0c;加完后&#xff0c;发现多了个奇奇怪怪的数字 执行的SQL如下&#xff1a; alter table string_index_test add index idx_name (name) USING BTREE;这个奇怪数字就是191&#xff0c;它很是疑惑&#xff0c;也没指定索引的长度 通…

SYSU程设c++(第十四周)函数模板、类模板

函数模板 在函数前加template<typename T1,typename T2,typename T3....>&#xff0c;T1,T2,T3叫模板形参 函数形参中的类型必须涵盖所有模板形参&#xff0c;不然报错 此时dv1,dv2只要相同类型就可以Swap (dv1, dv2); 但如果dv1,dv2不同类型就需要显示转换 Swap <dou…

五款电脑上的小众软件,简洁干净,功能强悍,值得收藏

电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 1.系统优化——Dism Dism是一款用于优化和维护Windows系统的工具。它可以让你对系统进行清理,备份,还原,更…

二叉树和堆详解

一、树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.2树的相关基本概念 空集合也是树&#…

macOS Ventura 13.5beta2 (22G5038d)发布

系统介绍 黑果魏叔 6 月 1 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;22G5038d&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、Fac…

数据结构--不带头的单向链表

不带头的单向链表 链表的结构注意点&#xff08;贯穿于整个链表的注意事项&#xff09;结点类型的定义申请新结点函数链表的打印链表的尾插链表的头插链表的尾删链表的头删链表的查找和修改在pos之前插入在pos位置删除在pos之后插入&#xff08;通过交换值&#xff0c;达到在po…

SpringBoot集成XXL-JOB

一、调度中心 首先下载XXL-JOB GitHub&#xff1a;https://github.com/xuxueli/xxl-job GitEE&#xff1a;https://gitee.com/xuxueli0323/xxl-job 项目使用2.3.1版本&#xff1a; https://github.com/xuxueli/xxl-job/releases/tag/2.3.1 使用IDEA打开项目 xxl-job-admin&…

Nginx网站服务详解(Nginx服务的主配置文件 ——nginx.conf)

目录 一、全局配置的六个模块简介 二、Nginx配置文件的详解 1&#xff09;全局配置模块 2&#xff09;I/O 事件配置 3&#xff09;HTTP 配置 4&#xff09;web服务监听设置 5&#xff09;其他设置 location常见配置指令&#xff1a;“root、alias、proxy_pass 对比&a…

【高危】Windows LDAP 服务远程代码执行漏洞

漏洞描述 LDAP (Lightweight Directory Access Protocol)是一个建立在TCP/IP协议栈上的目录访问协议&#xff0c;支持Active Directory服务的Windows服务器通常也支持LDAP协议。 Windows 10至11、Windows Server 2008至2022版本存在远程代码执行漏洞。当目标服务器开启LDAPS时…

PointNet、PointNet++代码解析

最远点采样FPS代码解析 注意&#xff1a;一般深度学习框架中都会使用批操作&#xff0c;来加速收敛。 因此采样函数的输入输出应当也要包含批。 def farthest_point_sample(xyz, npoint):"""Input:xyz: pointcloud data, [B, N, C]npoint: number of samplesR…

2023-6-1-Qt是什么

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…