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

    文章

    497

    浏览量

    19545
  • 进程
    +关注

    关注

    0

    文章

    196

    浏览量

    13909
收藏 人收藏

    评论

    相关推荐

    一句话让你理解线程进程

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

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

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在一个进程中,可以包含多个线程,这些线程共享相同的进程资源,如内存空间、文件描述
    的头像 发表于 02-02 16:30 491次阅读

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

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

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

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

    mcu线程进程的区别是什么

    MCU线程进程是嵌入式系统中常见的并行执行的概念,它们之间有许多区别,包括线程进程的定义、资源管理、通信机制、执行方式等等。下面将详细介绍MCU
    的头像 发表于 01-04 10:45 380次阅读

    你还是分不清多进程和多线程吗?一文搞懂!

    你还是分不清多进程和多线程吗?一文搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和使用场景略有不同。 1. 多
    的头像 发表于 12-19 16:07 334次阅读

    javascript深入浅出介绍

    JavaScript是一种广泛使用的脚本语言,用于开发互联网应用程序。它非常受欢迎,因为它可以用于网页开发,服务器端开发以及移动应用程序开发。本文将深入浅出地介绍JavaScript的各个方面,包括
    的头像 发表于 12-03 11:09 4.9w次阅读

    进程线程的概念及其区别

    今天浩道跟大家分享一篇关于进程线程之间关联的硬核干货,看看大神如何通过通俗易懂的图文,让大家更加深刻理解进程线程的区别!
    的头像 发表于 11-21 10:50 651次阅读
    <b class='flag-5'>进程</b>和<b class='flag-5'>线程</b>的概念及其区别

    javascript深入浅出

    JavaScript是一种广泛使用的编程语言,常用于Web开发。下面是对JavaScript的深入浅出的解释: JavaScript简介 JavaScript是一种解释型、动态类型、基于原型的语言
    的头像 发表于 11-16 10:34 456次阅读

    Linux系统上多线程和多进程的运行效率

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选
    的头像 发表于 11-10 10:54 640次阅读
    Linux系统上多<b class='flag-5'>线程</b>和多<b class='flag-5'>进程</b>的运行效率

    RTOS中的线程进程和协程详解

    看到有小伙伴在讨论【RTOS任务属于线程还是进程】的话题,这里就来分析一下OS中的线程进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 11-09 12:36 1194次阅读
    RTOS中的<b class='flag-5'>线程</b>、<b class='flag-5'>进程</b>和协程详解

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程
    的头像 发表于 11-06 14:46 426次阅读
    关于Python多<b class='flag-5'>进程</b>和多<b class='flag-5'>线程</b>详解

    个有许多线程进程,如何才能改变其中线程的工作目录?

    个有许多线程进程,我们如何才能改变其中线程的工作目录,而不影响其他?
    发表于 10-17 09:01

    Linux如何证明线程共享进程的地址空间

    所有的书上都说,进程中的所有线程共享进程的地址空间,如上图中的蓝框都在一个进程中。那么该如何证明这个结论呢?
    发表于 08-25 16:22 383次阅读
    Linux如何证明<b class='flag-5'>线程</b>共享<b class='flag-5'>进程</b>的地址空间

    进程线程的区别以及优缺点

    进程线程 1、什么是进程线程,有什么区别? 进程是资源(CPU、内存等)分配的基本单位,线程
    的头像 发表于 07-21 11:02 1039次阅读