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

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

3天内不再提示

要弄懂多线程,这就要牵涉到多进程?

GReq_mcu168 来源:玩转单片机 2020-08-04 17:20 次阅读

多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。

(1)单CPU下的多线程

在没有出现多核CPU之前,我们的计算资源是唯一的。如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理。什么规则呢?可以是一些简单的调度方法,比如说

1)按照优先级调度

2)按照FIFO调度

3)按照时间片调度等等

当然,除了CPU资源之外,系统中还有一些其他的资源需要共享,比如说内存、文件、端口、socket等。既然前面说到系统中的资源是有限的,那么获取这些资源的最小单元体是什么呢,其实就是进程。

举个例子来说,在Linux上面每一个享有资源的个体称为task_struct,实际上和我们说的进程是一样的。我们可以看看task_struct(linux 0.11代码)都包括哪些内容,

1.structtask_struct{

2./*thesearehardcoded-don'ttouch*/

3.longstate;/*-1unrunnable,0runnable,>0stopped*/

4.longcounter;

5.longpriority;

6.longsignal;

7.structsigactionsigaction[32];

8.longblocked;/*bitmapofmaskedsignals*/

9./*variousfields*/

10.intexit_code;

11.unsignedlongstart_code,end_code,end_data,brk,start_stack;

12.longpid,father,pgrp,session,leader;

13.unsignedshortuid,euid,suid;

14.unsignedshortgid,egid,sgid;

15.longalarm;

16.longutime,stime,cutime,cstime,start_time;

17.unsignedshortused_math;

18./*filesysteminfo*/

19.inttty;/*-1ifnotty,soitmustbesigned*/

20.unsignedshortumask;

21.structm_inode*pwd;

22.structm_inode*root;

23.structm_inode*executable;

24.unsignedlongclose_on_exec;

25.structfile*filp[NR_OPEN];

26./*ldtforthistask0-zero1-cs2-ds&ss*/

27.structdesc_structldt[3];

28./*tssforthistask*/

29.structtss_structtss;

30.};

每一个task都有自己的pid,在系统中资源的分配都是按照pid进行处理的。这也就说明,进程确实是资源分配的主体。

这时候,可能有朋友会问了,既然task_struct是资源分配的主体,那为什么又出来thread?为什么系统调度的时候是按照thread调度,而不是按照进程调度呢?原因其实很简单,进程之间的数据沟通非常麻烦,因为我们之所以把这些进程分开,不正是希望它们之间不要相互影响嘛。

假设是两个进程之间数据传输,那么需要如果需要对共享数据进行访问需要哪些步骤呢

1)创建共享内存

2)访问共享内存->系统调用->读取数据

3)写入共享内存->系统调用->写入数据

要是写个代码,大家可能就更明白了,

1.#include

2.#include

3.

4.intvalue=10;

5.

6.intmain(intargc,char*argv[])

7.{

8.intpid=fork();

9.if(!pid){

10.Value=12;

11.return0;

12.}

13.printf("value=%d ",value);

14.return1;

15.}

上面的代码是一个创建子进程的代码,我们发现打印的value数值还是10。尽管中间创建了子进程,修改了value的数值,但是我们发现打印下来的数值并没有发生改变,这就说明了不同的进程之间内存上是不共享的。

那么,如果修改成thread有什么好处呢?其实最大的好处就是每个thread除了享受单独cpu调度的机会,还能共享每个进程下的所有资源。要是调度的单位是进程,那么每个进程只能干一件事情,但是进程之间是需要相互交互数据的,而进程之间的数据都需要系统调用才能应用,这在无形之中就降低了数据的处理效率。

(2)多核CPU下的多线程

没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务在n个核上运行。我们可以编写一个简单的open mp测试一下,如果还是一个核,运行的时间就应该是一样的。

1.#include

2.#defineMAX_VALUE10000000

3.

4.double_test(intvalue)

5.{

6.intindex;

7.doubleresult;

8.

9.result=0.0;

10.for(index=value+1;index< MAX_VALUE; index +=2 )  

11.result+=1.0/index;

12.

13.returnresult;

14.}

15.

16.voidtest()

17.{

18.intindex;

19.inttime1;

20.inttime2;

21.doublevalue1,value2;

22.doubleresult[2];

23.

24.time1=0;

25.time2=0;

26.

27.value1=0.0;

28.time1=GetTickCount();

29.for(index=1;index< MAX_VALUE; index ++)  

30.value1+=1.0/index;

31.

32.time1=GetTickCount()-time1;

33.

34.value2=0.0;

35.memset(result,0,sizeof(double)*2);

36.time2=GetTickCount();

37.

38.#pragmaompparallelfor

39.for(index=0;index< 2; index++)  

40.result[index]=_test(index);

41.

42.value2=result[0]+result[1];

43.time2=GetTickCount()-time2;

44.

45.printf("time1=%d,time2=%d ",time1,time2);

46.return;

47.}

(3)多线程编程

为什么要多线程编程呢?这其中的原因很多,我们可以举例解决

1)有的是为了提高运行的速度,比如多核cpu下的多线程

2)有的是为了提高资源的利用率,比如在网络环境下下载资源时,时延常常很高,我们可以通过不同的thread从不同的地方获取资源,这样可以提高效率

3)有的为了提供更好的服务,比如说是服务器

4)其他需要多线程编程的地方等等

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

    关注

    68

    文章

    10412

    浏览量

    206475
  • 操作系统
    +关注

    关注

    37

    文章

    6266

    浏览量

    121842
  • 多线程编程
    +关注

    关注

    0

    文章

    15

    浏览量

    6662

原文标题:多核CPU下的多线程编程原来是这么回事...

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    线程进程多线程多进程和多任务之间有何关系?

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
    的头像 发表于 01-11 13:39 173次阅读
    <b class='flag-5'>线程</b>、<b class='flag-5'>进程</b>、<b class='flag-5'>多线程</b>、<b class='flag-5'>多进程</b>和多任务之间有何关系?

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

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

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

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

    进程线程多进程多线程的优缺点

    1、进程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。 举例说明进程: 想
    的头像 发表于 11-08 15:18 297次阅读
    <b class='flag-5'>进程</b>、<b class='flag-5'>线程</b>、<b class='flag-5'>多进程</b>与<b class='flag-5'>多线程</b>的优缺点

    关于Python多进程多线程详解

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

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

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

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。
    的头像 发表于 09-30 17:07 608次阅读

    BAT面试必备:多线程多进程、协程如何选择及线程池如何最高效 - 第20节

    模块程序多线程代码
    充八万
    发布于 :2023年08月17日 13:21:49

    BAT面试必备:多线程多进程、协程如何选择及线程池如何最高效 - 第14节

    程序多线程代码
    充八万
    发布于 :2023年08月17日 13:16:48

    BAT面试必备:多线程多进程、协程如何选择及线程池如何最高效 - 第13节

    程序多线程代码
    充八万
    发布于 :2023年08月17日 13:15:58

    BAT面试必备:多线程多进程、协程如何选择及线程池如何最高效 - 第12节

    程序多线程代码
    充八万
    发布于 :2023年08月17日 13:15:08

    BAT面试必备:多线程多进程、协程如何选择及线程池如何最高效 - 第8节

    程序多线程代码
    充八万
    发布于 :2023年08月17日 13:11:47

    浅谈Linux网络编程中的多进程多线程

    在Linux网络编程中,我们应该见过很多网络框架或者server,有多进程的处理方式,也有多线程处理方式,孰好孰坏并没有可比性,首先选择多进程还是多线程我们需要考虑业务场景,其次结合当
    发表于 08-08 16:56 395次阅读
    浅谈Linux网络编程中的<b class='flag-5'>多进程</b>和<b class='flag-5'>多线程</b>

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

    在执行,多核 CPU 可以同一时间点有多个进程在执行。 2、多进程多线程的优缺点 一个进程进程控制块、数据段、代码段组成,
    的头像 发表于 07-21 11:02 825次阅读

    Python多进程学习

    Python 多进程 (Multiprocessing) 是一种同时利用计算机多个处理器核心 (CPU cores) 进行并行处理的技术,它与 Python 的多线程 (Multithreading
    的头像 发表于 04-26 11:04 352次阅读