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

    文章

    10816

    浏览量

    210944
  • 操作系统
    +关注

    关注

    37

    文章

    6707

    浏览量

    123160
  • 多线程编程
    +关注

    关注

    0

    文章

    17

    浏览量

    6684

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

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

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

    Python中多线程多进程的区别

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

    多线程设计模式对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 260次阅读
    从<b class='flag-5'>多线程</b>设计模式<b class='flag-5'>到</b>对 CompletableFuture 的应用

    一句话让你理解线程进程

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

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序
    的头像 发表于 03-14 16:55 557次阅读

    python中5种线程锁盘点

    线程安全是多线程多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个
    发表于 03-07 11:08 1460次阅读
    python中5种<b class='flag-5'>线程</b>锁盘点

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是自己做互锁。
    发表于 03-01 08:22

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

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

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

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

    mcu线程进程的区别是什么

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

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

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

    redis多线程还能保证线程安全吗

    是单线程的,多个客户端请求会按序执行,每个请求使用一个线程完成,这样可以避免多线程之间的竞争条件和锁等带来的开销。但是,由于Redis是存储内存中的数据的,当多个客户端同时对同一个数据进行读写操作时,就会存在
    的头像 发表于 12-05 10:28 1654次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 1390次阅读

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步的问题,即保证多个
    的头像 发表于 11-17 14:22 1132次阅读

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的访问。下面将介绍几种常见的
    的头像 发表于 11-17 14:16 1114次阅读