美文网首页人生苦短我用python
计算机主线程和子线程先后退出问题

计算机主线程和子线程先后退出问题

作者: 前端无聊 | 来源:发表于2019-04-24 12:01 被阅读47次

    在网上看了很多,总觉得哪里有问题,很多人都会认为主进程不用等待子进程完全退出后就可以退出,对于我一个懂汇编的人来说是完全不可理喻的!刚开始的时候我以为真的以为是我学错了,但是我真的无法相信会有这种结论,你知道,对于高级语言来说,有时候有些总结是真的让懂计算机底层的人无法理解透彻,下面我们看下百度百科然后来分析:


    1.png

    不可置疑的是,windows开始执行程序的时候创建主进程(事实上并不存在主进程,cpu执行的时间切片是基于线程的,进程的概念的出现仅仅是为了区分内存段,不同的内存段中的代码决定了是否是同一个进程,一般来说,不同的进程不会在同一个段,也就是你们所说的进程数据不共享的意思,而线程与线程之间是同一个内存段的,也就是你们所说的线程数据共享,因为同一个进程下的所有线程是在同一片内存空间,或者你也可以说是同一内存段),子线程的存在是依赖主线程的!但是对于cpu来说,cpu可以执行哪些线程(或者说哪段代码)是由你控制的,但是你可以决定哪些线程去相互竞争cpu,在python中,假如你想让主线程不去竞争cpu,那么你可以设置threading.join(),那么主线程也就不参与cpu的竞争,也就是不和其他的线程抢cpu,暂停了主线程(你也可以说阻塞了主线程,你知道,高级语言的各种词语都是总结词语,不同的人不同的词语,对于我来说我不想纠结于这些),当然如果你在主线程的代码中不设置threading.join(),那么也就是同意了将主线程参与了cpu的竞争行列中去,也就是主线程会不阻塞,cpu拿到主线程后也会执行它,那么是不是就是意味着主线程可以先于子线程结束呢?对于计算机底层来说,当且仅当计算机执行到return后主进程才会执行完整,注意这里说的return并不是高级语言中的return,而是汇编底层里面的return,这个return你是在代码中无法使用的,他是程序和系统级别才能调用的,这也是很多不懂计算机底层的人无法理解的,当然像我也是无法理解高级语言的人为什么总说主线程或者主进程可以先于子线程或者主进程退出,说实话,我最开始学汇编的时候学的是8086单核cpu同时也是单线程,这种cpu不存在这种问题,在8086cpu上面执行的程序的代码都是一条线的,从上往下,后来才出现了多核多线程,我没认真学过多核cpu的工作原理,所以刚开始学python时候看到主线程可以先于子线程退出这个知识点的时候是真的蒙蔽,我以为时代变了,自己老了(捂脸),后来不服气的我搜索遍了博客和官网文档,说实话找到有用的东西不多,但是我多次调试和分析x64和x32位的程序代码(无论是dephi还是c,c++,或者vb,bc++程序,java是基于c写的不做讨论),总结如下:

    0.假如cpu有四个核心,核A,核B,核C,核D,接着我们创建一个进程P1(假设仅有一个主线程),那么A,B,C,D都有权利去执行P1,这就看哪个CPU核心有空并且系统调度谁先抢到了,执行P1就本质是执行里面的线程(进程对于cpu来说非实体,对人类来说才是实体存在),假设P1有多个线程也一样原理。。。

    1.程序的执行现在可以不是一条线的,可以多条线(路径)同时执行(并行,必须基于多核cpu,单核cpu还是单条线的)

    2.多线程可以放到多个cpu执行,但是对于python来说,无论何时,一个核都只有一个线程在执行,所以在python可以采用多进程来实现真正的并行,每个进程都包含至少一个线程:主线程,每个主线程可以开启多个子线程,由于GIL锁机制的存在,每个进程里的若干个线程同一时间只能有一个被执行;但是使用多进程就可以保证多个线程被多个CPU同时执行,但是问题是‘多个线程’必须分布在不同的进程,同一进程下的2个或者2个以上的线程无法同时执行,无论这台机器是多少个核心的cpu(这里讨论的都是基于python语言,其他语言是可以同时执行的!!!!切记!!!)

    3.python解释器生成主线程来执行一切你写的代码,无论何时,主线程都不会先于子线程而退出去,因为无论对于单核cpu还是多核cpu来说,主线程和子线程都存在着调用与被调用的关系,无论这个子线程给cpu的哪个核执行,那都不关和不影响主线程和子线程的相互关系-------调用与被调用关系,在子线程执行完后一般会返回到主线程中去做最后的垃圾处理和程序关闭,除非在子线程中执行了关闭整个程序的指令,这样的话就不会返回主线程了,而是直接关闭了整个程序!但是很少的程序会这样写,也有,但是一般是检测到异常就会这样做,比如一个加密的软件,他不希望被别人调试他的代码(你明白什么意思么?),于是开启了一个进程或者子线程来进行对系统程序环境的检测,一旦检测到有人在调试自己的软件,或者检测到调试的程序出现,那么 我就调用系统的中断指令来中断我的整个程序的执行,这样的话就达到了反调试的效果,直接在另外一个进程或者子线程中直接就执行了整个程序退出的代码(或者指令)
    如图:

    2.png

    --------在学习的路上总会有些偏见,欢迎批评!

    相关文章

      网友评论

        本文标题:计算机主线程和子线程先后退出问题

        本文链接:https://www.haomeiwen.com/subject/fcwwgqtx.html