【Linux】:线程(一)概念

线程概念

  • 一.线程
    • 1.简单理解
    • 2.一些疑问
    • 3.简单说一下优缺点,异常和用途
  • 二.进程VS线程
    • 1.进程和线程的联系和区别
    • 2.phread线程库(创建)
    • 3.线程的LWP
    • 4.线程等待
    • 5.线程终止
  • 三.C++11里的线程
  • 四.创建线程最底层接口

一般教程里定义线程:是进程内的一个执行分支。线程的执行粒度要比进程细。实际上这更是线程的一个特征而不是它的根本。

一.线程

1.简单理解

前面我们说过每一个进程都具有独立性,它们有自己独立的PCB,地址空间,页表…如果我们创建一个"进程",只创建它的PCB,让它指向上一个进程的地址空间呢?像这种能与上一个进程共享地址空间的“进程”被称为线程。

在这里插入图片描述

2.一些疑问

疑问一

线程为什么要在进程的地址空间里运行?

因为任何执行流要执行,都需要有资源,而地址空间就是资源的窗口。如果它在独立的地址空间里运行,那么它就是新的进程。如果它在其他进程的地址空间里运行,那么它就是线程。这是人为的定义。

疑问二

线程为什么执行粒度比进程更细?

显而易见,线程的资源与其他执行流共享,所以当然更细。

疑问三

原来我们理解进程是进程=内核数据结构(task_struct)+代码和数据,那么这里出现了多个PCB又该怎么理解呢?

重新理解进程:进程是承担分配系统资源的基本实体。也就是说上图里,一大堆执行流,地址空间,页表,物理内存分配的空间…统称为进程。

疑问四

如何将以前的概念和现在的概念联系起来呢?

以前创建进程,我们为它分配地址空间,页表,内存…资源,但只有一个执行流。现在依然为它分配资源,但有多个执行流,本质没有区别。如果要区分,就是原来的情况是进程的特殊情况,现在是一般情况。

疑问五

操作系统需要对线程进行管理吗?

答案是肯定的,先描述后组织。在大部分操作系统里确实有一个struct_tcb来描述线程,但在Linux里为了简便,直接使用进程来模拟线程。

疑问六

线程如何进行资源分配?

线程目前进行资源分配的本质就是进行地址空间的分配。

疑问七

常说线程比进程更轻量化,体现在哪呢?

1.创建和释放更轻量化。(不需要额外创建地址空间…)
2.切换更轻量化。(不需要重写catch里的数据)

3.简单说一下优缺点,异常和用途

优点

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

缺点

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

异常

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

用途

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

二.进程VS线程

1.进程和线程的联系和区别

一些概念

1进程是资源分配的基本单位。
2.线程是调度的基本单位。
3.线程共享进程数据,但也拥有自己的一部分数据。

线程独有的

1.线程ID
2.一组寄存(重要)
3.栈(重要)
4.errno
5.信号屏蔽字
6.调度优先级
7.........

共享

进程的多个线程共享 同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

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

在这里插入图片描述

2.phread线程库(创建)

因为Linux是用进程模拟线程,所以Linux里并没有很明确线程的概念。它被称为轻量级进程。也就是说Linux不会提供线程的系统调用,而是提供轻量级进程的系统调用!

但是我们需要线程的接口。所以程序员创建了一个pthread线程库,在应用层对轻量级进程接口进行封装。为我们用户提供直接线程的接口。

简单认识

在这里插入图片描述

第一个参数:pthread_t是一个输出型参数。它会把线程id带出。


第二个参数:是线程属性。一般不用管设置成NULL即可。


第三个参数:是函数指针。指向你需要的执行的函数,当线程执行时,它就会从该指针指向的函数的地址开始执行。


第四个参数:创建线程成功,新线程回调线程函数时,如果需要参数,这个参数就传给线程函数。不需要就设在成NULL。


返回值:如果成功就返回0,否则就返回错误码。

在这里插入图片描述

简单使用

由于我们需要使用第三方库,所以在编译时需要手动连接。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到两个线程的pid是一样的,所以说明它们是同一个进程里的两个执行流。

在这里插入图片描述

3.线程的LWP

查看轻量级进程个数

在这里插入图片描述

PID毫无疑问是进程标识符,而LWP就是轻量级进程标识符。再仔细观察,有一个线程的LWP就等于进程PID,这个线程就叫做主线程。

我们给任意一个线程发送信号,其他线程都会收到信号,所以我们认为信号是发送给进程的。

获取线程ID

前面说过函数的第一个参数是输出型参数,就是用来获取线程ID。

在这里插入图片描述

pthread_ create函数会产生一个线程ID,存放在第一个参数指向的地址中。该线程ID和前面说的线程ID不是一回事。
前面讲的线程ID属于进程调度的范畴。因为线程是轻量级进程,是操作系统调度器的最小单位,所以需要一个数值来唯一表示该线程。
pthread_ create函数第一个参数指向一个虚拟内存单元,该内存单元的地址即为新创建线程的线ID,
属于NPTL线程库的范畴。线程库的后续操作,就是根据该线程ID来操作线程的。

我们也可以使用函数在该线程内部获取它的ID

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.线程等待

在这里插入图片描述

第一个参数很明显是线程的id。

第二个参数是一个二级指针,它指向的其实就是该线程函数的返回值。因为线程函数执行完毕后要求返回void*类型指针,所以接收就需要使用二级指针。

在这里插入图片描述

在这里插入图片描述

5.线程终止

前面我们学过进程终止可以使用exit,那么线程可不可以呢?很明显是不可以的,因为exit不仅退出了当前线程,更退出了该进程里的所有线程。退出线程有专门的函数。

在这里插入图片描述

这里参数的含义和上面进程等待retval的含义一样,都是带出值。

在这里插入图片描述

在这里插入图片描述

三.C++11里的线程

在C++11里,也支持多线程,实际上就是对系统调用接口进行了一系列的封装。

在这里插入图片描述

在这里插入图片描述

四.创建线程最底层接口

上面说过Linux是用进程模拟的线程,所以没有直接的线程接口。我们使用第三方库来进行封装后,让我们调用简便。那么Linux最底层的接口是什么呢?

在这里插入图片描述

clone接口就是专门用来创建轻量级进程的,可以看出它很麻烦,我们一般不使用。

第一个参数:函数指针,线程进入的函数。

第二个参数:自定义栈。

第三个参数:是否实现地址空间共享。

其他参数................

第三方库的封装

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PicoScope 7 软件报警功能可实现自动保存和循环捕捉

最近很多用户提到,怎么让虹科Pico示波器采集信号到缓冲区满了之后自动保存在电脑里,然后清出缓存空间继续采集,如此循环工作。这里不得不向大家介绍一下PicoScope软件的强大功能之一:报警功能! 报警在软件的工具菜单下…

盘点最近两个世纪那些搞怪又精彩的专利

人类的创新是无止境的,下面收集的就是最近两个世纪全球那些奇怪搞笑、精彩的6项专利。 小胡子卫士 (1876) 这款“胡须防护罩”由 VA.Gates 于 1876 年获得专利,是在节日盛宴期间保护胡须的巧妙解决方案。“弯曲和凹形的护罩,可以由硫化橡胶、…

visual c++ 2019 redistributable package

直接安装下面包只有24M Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://aka.ms/vs/16/release/VC_redist.x64.exe ———————————————— 版权声明:本文为CSDN博主「kpacnB_Z」的原创文章…

堆排序(C语言)

前言 在上一篇内容:大小堆的实现(C语言),我们实现了关于创建大小堆的各函数与实现。但是如果突然要使用一个堆排序但是此时并没有一个现成的堆,这就需要花费时间去新建实现堆的插入删除这些操作从而实现一个堆&#xf…

Oracle-CDB容器数据库修改service_names踩坑

前言: 最近在对一套Oracle容器数据库进行迁移测试时,为了保持新环境与旧环境的服务名一致,需要在新环境添加旧环境的服务名,在CDB的根容器通过service_name参数添加旧环境的服务名之后,发现数据库PDB的服务名全部被注销&#xff0…

今日思考 -- 创新领导力(CIO)读后感

收获3个观点: 1 ,IT DT 商业,才是未来IT人的出路之一 ! 2 ,在CXO中,CIO像CEO一样,具备了整个企业的业务全视角 ,同时也更具解决 ‘’系统性‘’问题的能力 ! 3 &…

go并发编程(中)

目录 一、并发安全性 1.1 变量并发安全性 1.2 容器并发安全性 二、多路复用 三、协程常见的面试题 3.1交替打印奇数偶数 一、并发安全性 1.1 变量并发安全性 这个和C中并发安全是一样的,主要是多个线程对临界资源的同时访问,最经典的就是 n操作…

网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

openmmlab环境搭建及模拟kitti数据集跑pointpillars模型

点云训练—openmmlab环境搭建及模拟kitti数据集跑pointpillars模型 1 环境搭建 在我的 linux 服务器上,基于ubuntu20.04 参见:开始你的第一步 — MMDetection3D 1.3.0 文档 1.1 本地环境已安装anaconda. anaconda的安装参见博文:DS6.1-Y…

Linux 基本语句_14_信号灯实验

原理: Send进程通过建立共享内存区域,并向其中写入数据,Recive通过与共享内存连接读取其中的数据。 但是如果进程进行读取操作的时候其他进程再次写入会产生数据丢失,产生竞态,为了确保在某段时间内只有一个操作&…

Leetcode—1038.从二叉搜索树到更大和树【中等】

2023每日刷题(四十九) Leetcode—1038.从二叉搜索树到更大和树 算法思想 二叉搜索树的中序遍历(左根右)结果是一个单调递增的有序序列,我们反序进行中序遍历(右根左),即可以得到一…

基于Java SSM框架实现母婴儿用品网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现母婴儿用品网站系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品网站,主要的模块包括管理员;主页、个人中心、用户管理、商品分…

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深,对于数据如何作用于经济发展,数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候,把眼镜拿给老板他几分钟就搞定眼镜清洗的,是的没有错,那个机器叫超声波清洗机,不需要自己动手就可把眼镜清洗干净的一款智能清洁工具,它的出现可以说是方便了我…

计算机网络扫盲(4)——时延

一、概述 在这里,我们考虑分组交换网的情况,因特网可以被看成是一种基础设施,该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下,我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

软信天成:数据泄露日趋严重 “资产”保护何去何从

随着数据应用的逐渐深入,越来越多的企业意识到:数据作为信息的载体,可以成为企业知识产权、收益流和具备竞争优势的基础资产。然而,当包含大量敏感信息的数据被视作资产时,亦将直面信息被“窃取”、“泄露”和“滥用”…

CrapApi部署手册( maven+tomcat+idea)

目录 一、本章节所用到的资源共享,嫌麻烦的可以直接下载本地配置好运行使用二、idea maven tomcat启动,我的maven和tomcat的配置三、遇到的问题四、项目运行后效果图转载请标明出处,写作不易如果有用请给个赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代,数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而,在数据流通的过程中,我们经常会遇到各种难题和挑战,尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

基于Java SSM框架实现人才小区公寓社区物业管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人才小区公寓社区物业管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人才公寓管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xff…
最新文章