0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文深入浅出了解进程和线程

如意 来源:CSDN 作者:Peter盼 2020-06-20 10:45 次阅读

No.1

执行流

这里先说一说执行流,有助于线程的理解。

程序计数器中的下一条指令地址组成的轨迹称为程序的执行流。执行流是逻辑上独立的指令区域,是人为给处理器安排的处理单元。指令指导处理器的执行方向,从处理器的角度看,执行的指令形成一条路径,称为执行流。执行流可大可小,可以是整个程序文件,也可以是一个函数。

一个代码段想要突然去执行另外一个代码段的指令,比如call指令或者因中断去执行中断处理程序,只要先将调用前或中断前的上下文环境保存好就可以在iret或中断返回后继续执行原代码段的指令。所以说当我们为任何一段指令提供它所需要的上下文环境,那么这段指令就可以在独立的上CPU运行,也就是说这段指令成为了一个单独的执行流。这里说的上下文环境指的是指令所使用的寄存器映像、栈、内存等资源。可以独立在CPU上运行的代码段,哪怕被中断也可以返回继续执行,因为它所需要的资源得到了维护。

在任务调度器的眼里,执行流是调度单元,即处理器上运行的每个任务都是调度器分配的执行流。换句话说,实现任务调度,就是换不同的执行流在CPU上运行。我们要说的线程就是一个执行流。进程和线程有很多相似的地方,当一个进程中只有一个线程时,我们称之为单线程进程,它比线程就只多了处理的资源。我们可以认为线程和进程都是由执行流实现的。

No.2

线程

回想创建线程的过程,我们先声明并定义一个函数作为线程的处理函数,该函数的返回值为void*参数也是void*,然后调用pthread_create()函数创建线程。可以理解为线程就是去执行一个函数,但线程和普通的函数的区别在于线程拥有独立的上下文环境成为了独立的执行流,也就成为了独立的调度单元,可以独立在CPU上运行。在一般的函数调用中,函数随着程序的执行流被顺便执行。给每个执行流分配的时间是有限的,一个普通函数要等到该它运行的时候才可以在CPU上运行,前面有再多的函数它都要等着,还没有到它运行的时候可能该执行流就被换下CPU了。而线程则因为成了单独的执行流,可以独自享用分配的CPU时间,这才是线程真正优势的地方。

只有理解了线程的优势,在使用线程的时候才能恰到好处,现在再回想自己写的多线程程序是否真的需要使用多线程。将要处理的单独一类事件放在一个执行流等待就好了,没有必要写成多线程,在调度器调度的时候反而会花费额外的时间。

线程是一套机制,给一段代码块构建它依赖的上下文环境,从而让代码块称为单独的执行流,也就成为了调度器的调度单元可以直接在CPU运行。

线程中调用的函数让所运行的函数以调度单元的身份独立运行在CPU上,当函数运行时,可以让程序中多个函数(执行流)以伪并行的方式运行,为程序提速。

No.3

线程与进程

进程是运行中的程序。对于处理器来说,进程是执行流的集合,至少包含一个执行流,执行流之间相互独立,但它们共享进程的所有资源。

Linux早期版本(Linux 0.11),其中并没有操作系统书籍说到的有关线程的代码,比如thread_info结构体和创建线程的函数。那时CPU调度的单元是进程,进程就是各个执行流(调度单元),这里想说明的是进程和线程都是概念上的。在线程出现之前依然能够实现并发处理,线程在进程的基础上实现了二次并发,目的是提高效率。进程与线程的区别,一个是上面所说的进程中可以有多个线程。第二个就是线程没有自己的资源,没有自己的地址空间,必须要依附于进程的地址空间中才可以运行。

No.4

进程线程的状态

上面说了进程和线程是概念上的,真正实现时都是人为创造的代码块,因此执行流的状态也是人为划分的。比如因为有的线程在读写磁盘时需要等待,那么就需要该线程为阻塞状态,当线程可以上CPU运行时该线程就叫就绪态,在CPU运行时就称为运行态。在有其他需求的时候可能还会由别的状态出现,只要合理就可以,说明状态都是因为某种需求而出现的,然后当状态满足后就说明线程符合了某些条件,比如线程由阻塞态变为就绪态说明现在线程可能正在等待的资源已经等到了可以上CPU运行了。

No.5

程序控制块PCB

PCB(Process Control Block)是进程的身份证,记录了与进程相关的所有信息,比如进程状态、PID、优先级等。每个进程都有自己的一个PCB。所有PCB放到一张表格中维护,就是进程表,调度器根据这张表选择上处理器运行的进程。PCB的内容取决于操作系统功能的复杂程度。PCB可以确定处理器要执行的任务,记录程序运行时所需要的数据资源、给任务分配的时间大小、上下文信息的存储地址、进程状态、进程地址空间等信息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 线程
    +关注

    关注

    0

    文章

    505

    浏览量

    19703
  • 进程
    +关注

    关注

    0

    文章

    203

    浏览量

    13964
收藏 人收藏

    评论

    相关推荐

    深入解析Linux程序与进程

    什么是程序 组计算机能识别和执行的指令,用于指导计算机执行特定任务或解决特定问题。程序通常由代码、数据和资源文件组成,涉及语法、算法和数据结构。为二进制文件 什么是进程个具有独立功能的程序
    的头像 发表于 12-18 11:01 99次阅读
    <b class='flag-5'>深入</b>解析Linux程序与<b class='flag-5'>进程</b>

    深入浅出RISC-V调试

    、JTAG简介 目前RISC-V官方支持的调试方式是JTAG(Joint Test Action Group),而ARM支持的调试方式有JTAG和SWD(Serial Wire Debug)这两种
    发表于 11-28 22:00

    socket 多线程编程实现方法

    是指在同进程中运行多个线程,每个线程可以独立执行任务。线程共享进程的资源,如内存空间和文件句
    的头像 发表于 11-12 14:16 386次阅读

    搞懂Linux进程的睡眠和唤醒

    。通过PPID,可以追踪进程的来源,并了解进程之间的关系。 在PCB中记录的进程状态,不过是些整数,这个整数是多少就代表
    发表于 11-04 15:15

    Python中多线程和多进程的区别

    Python作为种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之。在本文中,我们将探讨Python中多线程
    的头像 发表于 10-23 11:48 415次阅读
    Python中多<b class='flag-5'>线程</b>和多<b class='flag-5'>进程</b>的区别

    CPU线程和程序线程的区别

    CPU的线程与程序的线程在概念、作用、实现方式以及性能影响等方面存在显著差异。以下是对两者区别的详细阐述,旨在深入探讨这威廉希尔官方网站 话题。
    的头像 发表于 09-02 11:18 1061次阅读

    深入浅出系列之代码可读性

    原创声明:该文章是个人在项目中亲历后的经验总结和分享,如有搬运需求请注明出处。 这是“深入浅出系列”文章的第篇,主要记录和分享程序设计的些思想和方法论,如果读者觉得所有受用,还请“
    的头像 发表于 08-09 16:00 270次阅读

    深入浅出谈TDR阻抗测试

    、脉宽、时序、抖动或噪声内容的任何事物都会影响整个系统的性能和可靠性。为保证信号完整性,必须了解和控制信号经过的传输环境的阻抗。阻抗不匹配和不连续会导致反射,增加系
    的头像 发表于 06-06 08:28 5942次阅读
    <b class='flag-5'>深入浅出</b>谈TDR阻抗测试

    句话让你理解线程进程

    今天给大家分享一下线程进程,主要包含以下几部分内容:一句话说明线程进程操作系统为什么需要进程为什么要引入
    的头像 发表于 06-04 08:04 1229次阅读
    <b class='flag-5'>一</b>句话让你理解<b class='flag-5'>线程</b>和<b class='flag-5'>进程</b>

    怎么理解负频率呢?射频人眼中的负频率

    说实话,我对负频率这个概念,也是有点凌乱。不过,最近不是正在看“深入浅出通信原理”嘛,看了些相关概念。
    的头像 发表于 03-05 16:10 3298次阅读
    怎么理解负频率呢?射频人眼中的负频率

    pcb应变测试有多重要?了解

    pcb应变测试有多重要?了解
    的头像 发表于 02-24 16:26 1118次阅读

    RTThread中main线程有个循环,如果main线程异常退出了,有什么办法可以监测到?

    RTThread中main线程有个循环,如果main线程异常退出了,有什么办法可以监测到?
    发表于 02-22 08:15

    线程是什么的基本单位 进程线程的本质区别

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在进程中,可以包含多个线程,这些线程共享相同的
    的头像 发表于 02-02 16:30 953次阅读

    深入浅出了解高边驱动在汽车应用中的挑战

    随着汽车电子威廉希尔官方网站 发展,电动化,轻量化与智能化需求带动了车规级高边驱动(High-side Driver, HSD)在车身负载驱动中的大规模应用。
    的头像 发表于 01-23 10:05 5431次阅读
    <b class='flag-5'>深入浅出了解</b>高边驱动在汽车应用中的挑战

    【年度精选】2023年度top5榜单——电机控制资料

    推荐理由: 这是份关于PID闭环控制算法的解析资料,内容深入浅出,易于理解。通过这份资料,你可以全面了解PID控制算法的工作原理、参数调整技巧以及在实际应用中的注意事项。无论你是初学者还是有
    发表于 01-16 14:34