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

    文章

    508

    浏览量

    20768
  • 进程
    +关注

    关注

    0

    文章

    208

    浏览量

    14481
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux多线程对比单线程的优势

    在Linux系统中,线程是操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运行单位。
    发表于 12-01 06:11

    飞凌嵌入式ElfBoard-文件I/O的了解探究之竞争冒险

    竞争冒险(Race Condition)指的是在多线程或多进程环境中,多个线程进程对共享资源进行访问和修改时可能导致的不确定性结果或错误行为。竞争冒险通常发生在多个
    发表于 11-26 15:38

    ALM(应用生命周期管理)解析:了解其概念、关键阶段及Perforce ALM工具推荐

    什么是ALM(应用生命周期管理)?它远不止是SDLC!了解其概念、关键阶段以及如何借助Perforce ALM这类工具,实现端到端的可追溯性、加速发布并保障合规性。
    的头像 发表于 09-19 11:03 1305次阅读
    ALM(应用生命周期管理)解析:<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>其概念、关键阶段及Perforce ALM工具推荐

    【HZ-T536开发板免费体验】—— linux创建线程

    线程进程 进程指的是个正在执行的应用程序,而线程的功能是执行应用程序中的某个具体任务。
    发表于 09-01 21:31

    深入剖析I2C协议

    I2C是由Philips开发的简单的双向两线总线,在深入浅出理解SPI协议中,我们区分了单工,半双工,全双工协议数据流向的区别,根据特征,I2C协议属于半双工协议(即同时刻,数据单向流动)。此外
    的头像 发表于 08-21 15:10 3340次阅读
    <b class='flag-5'>深入</b>剖析I2C协议

    了解电压谐波

    我们经常会听到谐波,到底什么是谐波,怎么定义的?为什么要关注谐波?什么时候关注谐波?谐波如何计算或标准规定的谐波的算法是怎样的?GB关于电压谐波又是如何评估的?带着诸多的问题,我们一起来了解
    的头像 发表于 06-28 17:23 3904次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>电压谐波

    门老师教你快速看懂电子电路图

    本文从最基本的电容电阻开讲,包含模电数电,以及部分电气知识点,深入浅出。 资料介绍: 全文共分7课,以老师授课和师生交流的形式系统地介绍了电子电路识图方面的基本知识和技能,包括电路图的基本概念和要素
    发表于 05-16 15:17

    程序设计与数据结构

    的地址)出发,采用推导的方式,深入浅出的分析了广大C程序员学习和开发中遇到的难点。 2. 从方法论的高度对C语言在数据结构和算法方面的应用进行了深入讲解和阐述。 3. 讲解了绝大多数C程序员开发
    发表于 05-13 16:45

    华为与陕投集团签署深入合作协议

    日前;陕西文化产业投资控股(集团)有限公司(以下简称“陕投集团”)与华为技术有限公司(以下简称“华为”)签署深入合作协议。陕投集团党委书记、董事长黄勇,华为高级副总裁邹志磊见证签约。陕
    的头像 发表于 04-23 17:04 901次阅读

    全面解析新概念模拟电路(建议下载!)

    全文共五册,近50万字,样的风趣幽默,样的social化语言,深入浅出地将枯燥深奥的模电知识讲得简单易学。 《新概念模拟电路》内容包含了《晶体管》、《负反馈和运算放大器》、《运放电路的频率特性
    发表于 04-16 13:37

    深入浅出解析低功耗蓝牙协议栈

    深入Bluetooth LE协议栈各个组成部分之前,我们先看下Bluetooth LE协议栈整体架构。 如上图所述,要实现个Bluetooth LE应用,首先需要个支持Bluet
    的头像 发表于 04-09 14:49 1032次阅读
    <b class='flag-5'>深入浅出</b>解析低功耗蓝牙协议栈

    进程线程、协程傻傻分不清?带你彻底扒光它们的\"底裤\"!

    它们就像程序界的「三国演义」: 进程:曹魏政权(独占资源,稳如老狗) 线程:孙刘联军(共享资源,相爱相杀) 协程:诸葛亮北伐(人带十军,靠的是「空城计」) 第章:
    发表于 03-26 09:27

    《零基础开发AI Agent——手把手教你用扣子做智能体》

    《零基础开发AI Agent——手把手教你用扣子做智能体》是本为普通人量身打造的AI开发指南。它不仅深入浅出地讲解了Agent的概念和发展,还通过详细的工具介绍和实战案例,帮助读者快速掌握
    发表于 03-18 12:03

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了些问题。 具体来说,我有两个任务,
    发表于 03-11 06:57

    深入解析Linux程序与进程

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