0%

线程与进程的初步了解

起因

​ 今天,我的哥们又在上班摸鱼,他发了一些极性码的博客给我,他真的牛逼,都准备搞5G协议栈了,当然只是看着玩的,学学思路而已,这东西不是一个人可以搞定的,然后他问我,线程和进程怎么区分啊?我一时间懵了,因为我之前学linux的时候,就是调用api啊,fork thread就完了。线程最小单位,进程是一个车间啥的,线程共享资源,进程独立资源,脑子就只有这个概念。我本来想要回答的,它来一个博客,就是关于线程和进程认识。举个例子,如果是mcu,那么此时就只有一个进程,那么是不是可以认为,控制程序控制块指针就是控制一个进程呢?如果我们对rtos上系统,是不是就是多任务(线程)了呢?我跟他说了一下观点。我的思路和观点是比较简单的,这个系统就不是一个人可以实现的!

CPU核心数和线程数

打开电脑的资源管理器就可以看到几内核,多少逻辑处理器(线程)。还有那些云服务器啥的,也写了参数。
比如: 8核16线程 32核32线程
首先,我们所谓的cpu核心数量,不是这样算的,是一个大cpu里面多个小cpu,每个小cpu有单核,双核,多核。
单核就是同时只能执行一个线程或者进程,双核就是两个,以此类推。
所以此时的核心就是 cpu (核心)
此时的线程就是 cpu * n *几核心 (线程) 这里是使用超线程技术哦。

进程和线程

进程这个概念在mcu中是没有的,就一个单片机,搞个鬼的进程,多任务还差不多。所以,我们就来思考linux的进程和线程,首先,少不了的结构体,就是进程控制块,内部有id、父id、内部数据、线程列表、内存大小等。然后就得去找mmu要内存,因为每个进程都是独立的。然后线程列表,共用这个进程中的内存数据,线程id,线程优先级等。自然这些结构体里面还得有信号处理,还有互斥锁,信号量等东西。cpu的最小运行单位就是线程,那么进程是怎么处理的呢?
我们要知道每次生成一个进程的时候,一定是有一个主线程,就是进程自身。
所以,cpu哪怕是调用进程,也是运行进程中的线程。我们可以这样认为:
运行一个线程的时候就是裸机。运行一个进程的时候就是一个rtos。

CPU和系统

​ 我们学linux的时候,发现线程可以申请非常大,甚至百万千万上亿都是可以的,但是进程是受限制的。
​ 我们通过上面的思考,可以知道因为进程还会申请空间,还会做很多进程通信的配置,所以是非常耗资源的,加上系统自身还有很多守护进程在,所以,这是进程的申请有限,看配置,而且会越来越卡,因为资源终究有限。可是我的cpu只有8核16线程啊?再怎么样也比不过系统的进程和线程数啊?
​ 这里就要分清楚了os的并发和硬件cpu的并发不一样。
​ 我们用windows来思考,首先就是bios启动开机,此时就得到了cpu的线程数和核心数,然后告诉系统了,系统就知道了目前可用的设备和处理器有那些了。它内部的线程和进程就全部添加到列表中,linux里面也有状态,挂起、运行、暂停、就绪、僵尸、死亡。这些一个个对应着列表,就绪状态的,会被系统调度,然后经过系统的算法和处理,分配cpu线程给到此时的线程和进程,就实现了cpu处理了,所以,本来就不是一一对应的关系。是类似于时间片轮询的操作来实现一个cpu多个线程和进程来使用。
​ 我们可以使用python来申请特定的核心来作为进程,就可以发现,cpu是可以被单独用来执行特定目标的,所以,
系统只是经过算法然后就调度到可用的cpu来进行操作了。我们在linux中,比如编译openwrt,此时就需要使用多线程编译,反正都是生成.o文件,所以,彼此之前不怕干扰,编译就完事了,此时就是linux把可用的cpu丢给编译。我们还可以把进程绑定给一个特定的cpu核心上面,和上面一样的操作就可以实现对核心的操作啦。当然对于我这个初学者,我是把它当成多个单片机,只不过中间有很多数据总线,地址总线、控制总线等

结语

​ 这个博客,是我对于os的内部的原理的初步认识、分析和学习,自然实际中的os,不可能那么简单的啊,就连普通的freertos和rtt都没那么简单的,这个博客,等以后我变强了,再回来修改错误和增添内容哦!

-------------下次的来访是什么时候呢[doge]-------------