本文共 2279 字,大约阅读时间需要 7 分钟。
我发现我之前对线程的理解是错误的,对,是错误的,导致之前听课没有很好理解,和CPU的流水线作业混淆了起来,导致你没有很好地理解进程,
你是真的弄混了。
我看了华清的线程(5.3.1)的视频之后,里面举了形象的例子,才对线程有了比较好的理解,再去写线程就比较自然了。像QQ就是一个进程,这个windows里面你也看得到,但是QQ里面有很多中功能,每一个功能你就可以划分成一个线程,感觉就像是一个更小单位的进程,有点像docker,每个容器里面执行一个单一的功能。这每一个小功能,你可以用一个函数去实现,所以创建线程的时候你还得写一个函数。
所以linux不区分进程和线程。
所以之前看Linux的哲学的时候,里面有一个就是linux由许多功能单一的小程序组合而成,我感觉这可能就是说的线程。
你之前是跟流水线混淆了以为切分到那种程度,所以你之前看那些线程的视频不理解。
线程本质上就是执行一段函数嘛,函数执行完了是否会自动退出?
是的,就从这个角度去理解,本质就是执行一段函数嘛,CPU一次只能执行一个指令顺着执行。
这个理解了很多一下子就理解了,再去看线程那些函数,真的一下子就明白了。线程结束函数就是写在线程执行的那个函数的最末尾。
就把进程/线程理解为一个待执行的函数,执行函数的过程就是完成对应任务的过程,函数执行完了线程或者进程就结束了。
理解了这个你就能够很自由自在地去写自己需要的进程和线程以实现自己想要的功能。
看这下面写的,执行线程,说到底就是执行线程函数。《linux c与c++一线开发实践》
进程和线程的目的可能就是为了把原本的任务分成一小块,一个大的函数拆成多个小的函数去执行,有点docker,k8s那种思想在里面
理解了这些本质你就可以去灵活地编写和使用进程了,说实话就像docker,其实完全可以把所有程序都放在一个docker里。
进程间通信好像就像docker间通信。
突然发觉多线程多进程可以用k8s微服务替代掉了啊。k8s不就是多线程的思想么。而多线程开发不就是弄后台开发的么,不也就是微服务么。
一个大的函数拆成多个小的函数还有一个好处就是,可以让多个函数看起来并行执行,当然这是CPU跑得快看起来并行。
线程也是得由其他线程创建出来的,创建出来之后两个线程就并行执行。
是不是所有的父子进程都是在并行执行,包括那么庞大的进程树里面那么多进程表面上看都是并行执行,你用top查看也看得到对吧,很多个进程同时运行。有父子线程的话,那么根线程最开始那个线程是什么,是由谁引发的。应该是由一个进程引发,是不是通过这个就知道一个线程是属于哪个进程了,就看它的根就可以了。你去看它是由哪个进程创建的
所以Linux不区分进程和线程,线程感觉就可以看作进程的子进程。这么来看的话,线程和进程应该也是并行执行的。
其实你在创建线程的时候,在shell下执行,那本身就是一个进程,你就直接执行创建线程的代码就可以了,
不过我现在确实想知道,我创建一个进程,并且在一个进程中创建线程,怎么弄。
以前编写软件有考虑进程线程么?编写软件
这么讲,一个进程/线程就相当于一个main函数,操作系统的好处就在于可以多任务。你之前都是写单片机的程序当然没有考虑这些,所以刚学进程这些可能有些不适应,这可能是操作系统之上编程的常规操作。你没必要所有东西都堆一个main函数里面了。而且不同任务之间还可以相互通信。
或者你以前写操作系统上的应用程序都是比较简单的,一个main函数就可以了。你以前编写的应用程序都是很简单的那种,哪怕写稍微复杂点的好像也没有涉及到多线程,那么多线程的编写时用在哪方面呢。怪不得有java多线程编程,c++多线程编程,每种可以写软件的,都应该有对应的多线程编程的,编写多线程的软件。现在对多线程的认识又上升到一个新的层次,怪不得他们看重多线程编程。所以你做项目就可以做个多线程的项目嘛。无人机用操作系统意义是不是也是在于此,可以多线程。
下面这也说到了多线程编程提供了一种新的模块化编程思想和方法。我理解为它可能是一种新的编写软件的方式。下面拍自《linux c与c++一线开发实践》
当然我估计你写一个软件,只用新建一个进程,但是会建多个线程,我参考windows是这样嘛,windows不是QQ就一个进程么,单片机上就不会有进程的概念。
也就是写一个应用软件只需要fork一次就可以了?
下面截图自《linux c与c++一线开发实践》,这里面讲得不错。多线程可以让我们的应用程序有更出色的性能。
主线程是随着进程的创建而创建的,还有线程是执行单元而不是进程, 是不是任何要执行的东西都得写在线程里面。所以一个进程里面应该至少有一个线程。进程似乎可以变成一种抽象的概念,是进程的容器。所以怪不得线程有执行函数,进程没有,之前学进程的时候写的什么printf那应该是默认在主线程里面了。
进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
是不是一个进程里的所有线程都是由主线程创建的。
我之前的理解没有错,我现在应该可以自由地创建多个进程和线程然后去实现我所想要的功能。
《linux c与c++一线开发实践》这本书还是把线程讲清楚了的,这本书果然如作者所说,都是干货。相比之下我觉得华清的书还有一些Linux c的书要自愧不如。
进程和线程你没有真正理解清楚叫你去写进程或者多线程的程序你是不会写的,或者写不出来的。
转载地址:http://wzoni.baihongyu.com/