原帖 | Jack | 2024-09-22 13:35 | 👍2 | 阅读约1
老师,协作的话其实我们裸机的调度就是协作吧?协程,进程,线程这三个不太理解,有什么例子或者资料视频可以学习一下吗,我看很多人把freertos成为多线程,这是不是不正确,应该叫多任务?
裸机是的,裸机无法实现抢占式调度(无法进行任务中的上下文切换(出栈入栈),必须要这个程序块执行完再去决定下一个执行块是哪个),所以如果想让别的任务得到运行,就必须先让出自己当前的任务块。
进程(Process):
定义:进程是操作系统中的独立运行单位,每个进程有自己独立的地址空间、数据、代码、文件等资源。
特点:进程之间的通信较线程复杂,因为它们不共享内存(所以没有办法使用全局变量这种);但进程之间的隔离使得一个进程崩溃不会影响其他进程。
线程(Thread):
定义:线程是操作系统调度的基本单位,一个进程内可以包含多个线程。线程共享进程的资源,如内存空间、全局变量等,但每个线程有自己的栈和寄存器。(RTOS中,我们在中断中可以通过全局变量在一个文件域下去通知线程(任务))
特点:线程切换由操作系统调度,切换开销较协程大,但使用更广泛。
协程(Coroutine):
定义:协程是一种比线程更轻量的调度单元,任务的切换由程序自身控制,而不是操作系统。协程是在同一线程内以非抢占方式执行的任务,每个协程在执行过程中需要主动让出执行权给其他协程。
特点:没有线程间的上下文切换开销,效率更高,但需要开发者显式地控制任务切换。
关于FreeRTOS是多线程还是多任务:
准确来说,是多任务,说它是线程的话,会和通用操作系统有一些差别,主要是调度方式的不同。
FreeRTOS的任务(Task)与大型非RTOS操作系统中的线程非常相似:每个任务都有自己的栈和程序计数器,它们在时间上共享CPU,但其中最大的不同是FreeRTOS的任务的切换。
在那种大型操作系统里,线程的切换一般是基于时间片(时间片到了才切换)和动态优先级(RTOS往往大部分都是静态优先级,和抢占式调度),线程切换时间和响应时间可能不可预测。然而FreeRTOS能够实现的一点不同是它的实时性很高,它是每个systick都会去判断是否有高优先级任务就绪,如果有则立刻发生切换,这个是大型非RTOS的操作系统做不到的,这一点在OS的层面来讲,除了嵌入式的某些实时性要求很高领域,大部分通用操作系统很少有这种实时性需求。所以你要说它是线程它又和那些通用OS的人的理解不一样,所以遇到通用OS的人,你可以跟他们说是任务。
其实根据我上一篇关于RTOS的起源的文章,也能看出,RTOS它的起源也决定了它其实更多的是个调度器,不算完整的操作系统,所以叫线程有些不是特别准确,所以我们叫它任务。
相关笔记