首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux笔记(17)| 线程基础

Linux笔记(17)| 线程基础

作者头像
飞哥
发布于 2020-11-25 02:12:35
发布于 2020-11-25 02:12:35
4440
举报

读者朋友们大家好,今天和大家分享的是Linux中的线程。线程有时也称为轻量级进程,是执行程序流的最小单元。

之前我们讲过Linux中的进程,那么线程和进程有什么联系和区别呢?如果是去面试Linux软件开发的岗位,很有可能会被问到这个问题,看你对进程和线程的了解。

有一句话叫做进程是资源分配的最小单位,线程是系统调度的最小单位。在操作系统里面,可以认为是有很多个任务(task)在“并行”执行,从宏观上来看是并行的,但是从微观上来看其实还是串行的,当然,这是对于单核来说。之前我们的单片机开发,写好代码之后就一直执行里面的代码,里面所有的代码都是按顺序依次执行的(当然,中断另当别论),比如我们有三件事情要做,那么肯定是先做第一件事,再做第二件事,最后做第三件事。

如果第一件事要花费的时间很长,那么就会一直占用CPU,导致另外两件事得不到及时响应。而在操作系统中是不一样的,由操作系统进行调度,每件事或者说每个任务只会执行一小段时间,可能是几个毫秒,然后CPU被分配给了其他任务,在快速切换中,看起来就像是几个任务在同时运行一样,而且各个任务可以很好地得到响应。当然,具体是怎么调度的这是一件比较复杂的事情,需要具体去分析。

讲了这么多,是想说其实线程和进程都是一个个任务(task),所以在操作系统看来,没有什么区别,在Linux当中,并没有严格区分进程和线程。但是他们还是有区别的。其中一个区别就是对于各个进程他们的资源是独立的,而各个线程之间资源是共享的。

比如说先定义了一个全局变量,然后调用fork函数创建一个子进程,然后在子进程里面对这个全局变量进行修改,然后分别在父进程和子进程中打印这个全局变量的值,就会发现在父进程里面还是原来的值,而子进程里面就是修改后的值。

之所以是这样,是因为刚开始fork出来的子进程确实和父进程几乎是一样的,子进程继承了父进程的东西,如果在子进程中只是访问原来父进程的资源,是没什么影响的,但是如果子进程企图修改父进程中原来的东西,那么就会发生写时拷贝(Copy On Write,简称cow),子进程拷贝一份副本,然后在副本上修改,也就是说不会修改原来父进程里的东西。从效果上来看,可以认为子进程刚开始和父进程一样,但是后来做的所有修改都和父进程没有关系,他们是相对独立的两个进程。

而线程不一样,主线程创建一个子线程后,子线程和父线程资源是共享的,其实是在他们的task_struct结构体里面,指针指向了同样的数据,因此,在一个线程里进行了数据的修改,在其他线程中访问的也是修改后的数据。

这就是进程和线程的一大区别。

总的来说呢,就是进程也好,线程也好,他们都是一个个的task_struct,对于操作系统调度来讲,它只管这个结构体,因此,操作系统并不是很区分进程和线程,它只是在各个task_struct之间调度。但是因为进程与进程之间资源不是共享的,线程与线程之间资源是共享的,我们可以根据这一点来选择使用多进程还是多线程来处理问题。

当然,他们还有一些区别,比如说从系统开销来说,fork是一个开销很大的系统调用,启动一个新的进程必须分配给其独立的地址空间。进程之间的通信比较麻烦,需要依靠一定的手段。线程在这些方面有一些优势。

这里只粗略的讲了线程的一些概念,以及和进程的关系和区别。到下一节里再来讲解一下线程里的更详细的一些知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子技术研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大名鼎鼎的 Linux —— 进程,线程,协程
Linux 作为当今服务端最流行的操作系统,是每个后端工程师应当熟练使用和理解的。本篇文章会详细讲述 Linux 系统中的一些基础概念:进程、线程,以及后面由各编程语言所实现的协程。
玖柒的小窝
2021/12/09
9210
大名鼎鼎的 Linux —— 进程,线程,协程
传统功夫这叫化劲儿 --- 多线程系列(一)
大家好,我是谢顶道人老李,多日不写文字显得颇为生疏、显得颇为江郎才尽、显得颇为文案匮乏。
老李秀
2021/06/17
4610
C++多线程-单CPU下的多线程
多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。
cwl_java
2020/01/15
1.1K0
大碰撞!当Linux多线程遭遇Linux多进程
廖威雄,目前就职于珠海全志科技股份有限公司从事linux嵌入式系统(Tina Linux)的开发,主要负责文件系统和存储的开发和维护,兼顾linux测试系统的设计和持续集成的维护。
Linux阅码场
2019/08/27
2.2K0
大碰撞!当Linux多线程遭遇Linux多进程
【Linux】线程概念和线程控制
什么是线程呢?下面我们直接说定义,再理解。线程就是进程内的一个执行分支,线程的执行粒度要比进程细。
YoungMLet
2024/03/01
4270
【Linux】线程概念和线程控制
18 Python 基础: 重点知识点--进程和线程讲解
本文首发于腾讯云+社区,也可关注微信公众号【离不开的网】支持一下,就差你的关注支持了。
野原测试开发
2019/07/24
7870
18 Python 基础: 重点知识点--进程和线程讲解
进程控制块PCB结构 task_struct 描述
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念
s1mba
2018/01/03
1.9K0
进程控制块PCB结构 task_struct 描述
Python学习笔记(十)·进程和线程
很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。
公爵
2022/09/28
5740
Python学习笔记(十)·进程和线程
【linux】进程理解
在计算机科学中,进程是操作系统中的一个基本概念,代表了计算机程序的一次执行实例。进程不仅包括正在执行的程序代码,还包括程序的当前活动,包括程序计数器的当前位置、处理器的寄存器和变量的值。简而言之,进程是一个具有自己独立功能的程序在某个数据集上的运行过程,它可以分配和管理资源。
用户11029103
2024/10/12
2700
【linux】进程理解
【Linux】进程初步理解
电脑里面的硬件不是随便就能构成计算机,这些硬件是按照一定的规则去组装电脑的。 计算机的核心工作就是通过一定的输入设备,把数据交给计算机cpu,而cpu经过一定的设备再显示出结果。 计算机的构成遵循冯诺依曼体系结构:
zxctscl
2024/04/10
1260
【Linux】进程初步理解
Linux 线程浅析
关于linux线程 在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体. 为了让进程完成一定的工作, 进程必
小小科
2018/05/04
4.5K0
Linux 线程浅析
Linux的进程线程及调度
操作系统中的经典定义: 进程:资源分配单位。 线程:调度单位。 操作系统中用PCB(Process Control Block, 进程控制块)来描述进程。Linux中的PCB是task_struct结构体。
叶余
2019/04/02
4.3K0
Linux的进程线程及调度
你需要了解的 Linux 进程管理
对于一个操作系统来说,提供运行程序的能力是其本质,而在 Linux 中,轻量、相应快速的进程管理也是其优良特性之一。我会分两篇文章介绍 Linux 进程。这是第一篇,重点在于 Linux 进程的描述和生命周期,下一篇将介绍 Linux 下的进程调度。
CS实验室
2021/03/22
6550
你需要了解的 Linux 进程管理
【Linux】深入理解进程管理与高效运用
        进程是正在运行的程序实例,在Linux内核中,进程被称为任务,例如内核线程与用户线程等。
小文要打代码
2025/03/18
2580
Linux线程-概念和控制
注:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了
用户9645905
2022/11/30
1.3K0
Linux线程-概念和控制
Linux 是否有 zombie thread?源码探究分析
系统编程课上遇到的一个问题:Linux下,如果一个 pthread_create 创建的线程没有被 pthread_join 回收,是否会和僵尸进程一样,产生“僵尸线程”?
Miigon
2022/11/25
1.8K0
操作系统-多进程和多线程-python
在学习廖雪峰老师的python教程,学习了多进程和多线程,记录下核心的思路和方法。
十四君
2019/11/24
1.3K0
主线程异常会导致 JVM 退出?
上周线程崩溃为什么不会导致 JVM 崩溃在其他平台发出后,有一位小伙伴留言说有个地方不严谨
kunge
2022/09/02
1.5K0
主线程异常会导致 JVM 退出?
Linux进程状态与优先级
在普遍的操作系统中,我们所遇到的进程状态有:运行、新建、就绪、挂起、阻塞、停止、挂机、死亡…等等,但是我们并不懂它们(学了等于没学),因为这是操作系统层面的说法,它的理论放到哪个操作系统中都对。所以我们要学习一个具体的操作系统来理解进程状态,而这里我们使用的当然就是Linux!
利刃大大
2023/04/12
3K0
Linux进程状态与优先级
【Linux内核】进程管理
进程是Unix操作系统最基本的抽象之一。一个进程就是处于执行期的程序(目标码存放在某种存储介质上)。但进程并不仅仅局限于一段可执行程序代码(Unix称其为代码段(textsection))。通常进程还要包含其他资源,像用来存放全局变量的数据段(text section)、打开的文件、挂起的信号等,当然还包含地址空间及一个 或几个执行线程(threads of execution)。
看、未来
2020/08/25
1.9K0
【Linux内核】进程管理
相关推荐
大名鼎鼎的 Linux —— 进程,线程,协程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档