深入理解进程、线程、Core、OS Application、task、event、runnable、SWC和port之间的区别与联系

进程:

进程是资源分配的最小单位,进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是系统进行资源分配和调度的基本单位。进程是一个动态的概念,是一个活动的实体。

“独立功能”表示进程是面向使用者的定义,它关心的是要做什么?比如,在电脑上我要写一篇文章,打开Word。那么计算机就会创建一个Microsoft Word的进程,如果我想同步写两篇文章,就要再打开一个Word,计算机就又创建一个Microsoft Word的进程。普通的计算机机可以同步做几件事情,比如“上网”,“看电影”,“打游戏”,就是说可以运行很多进程。但是嵌入式计算机通常设计成只做一件事情,比如在汽车领域,整车控制器VCU,发动机喷油点火控制器ECU,变速箱换挡控制器TCU,车身控制器BCM等。这样类比,传统的一个电子控制单元ECU相当于只运行一个进程。

线程:

线程是程序执行的最小单位,也是处理器调度的基本单位,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等)

当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程,主程序必须等线程跑完才会关闭,而threadpool相反。

小结:threadpool确实比thread性能优,但是两者都没有很好的api区控制,如果线程执行无响应就只能等待结束,从而诞生了task任务。

对比进程与线程:

  1. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据,使用相同的地址空间,因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。
  2. 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式进行(如队列,信号,管道,接套字等)。不过如何处理好同步与互斥是编写多线程程序的难点。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
  3. 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

Core

可以理解为就是ECU,一个核就代表一个进程。多核就是多个ECU。也就是说在多核的情况下,可以执行多进程。

不论是进程还是线程,一个cpu核一个时刻就只能干一件事,所以一个cpu核处理多个线程或者进程的话,都是并发;

对于多核心的架构,由于共用一套MMU和cache,所以地址空间是一个,同一时刻只能运行一个进程,此时进程不能并行只能并发。同一个进程下的多线程可以并行执行,因为多线程共享同一套进程空间资源。

OS Application:

说明1:Task、Interrupt、Alarm、schedule Table、Resource、Event 我们称他们叫对象(Object)

说明2:【OS 包含1~N个Core】->【1个Core 包含1~N个Application,相当于一个core可以运行多个进程,一般AUTOSAR Aurix定义两个进程,一个trusted,一个nontrusted】->【1个Application 包含0~N个Object,也就是一个OS-Application包括多个任务Task】

不论是进程还是线程,一个cpu核一个时刻就只能干一件事,所以一个cpu核处理多个线程或者进程的话,都是并发;

AUTOSAR OS必须能够支持构成一个有多功能单元的Operating System objects (Tasks, ISRs, Alarms, Schedule tables, Counters)的集合。此对象集合称为 OS-Application

OS Application分为两类,一类是Trusted, 一类是Non-Trusted

对于Trusted OS Application,可以运行在监控或保护功能关闭的情况下,对于内存或者OS Api的访问没有限制;如果处理器支持,可以运行在特权模式,OS默认Trusted类型的OS Application不会引发内存相关故障,如果发生了内存故障,系统稳定性将不再保证,可能需要关闭OS。

对于Non-Trusted OS Application,不允许关闭监控或保护功能,对于内存或OS Api的访问也受权限控制,也不允许运行在特权模式。对于non-trusted OS Application,操作系统会保护MPU,timer,中断控制器等控制寄存器,不允许修改。如果需要修改这些寄存器,那么OS服务必须执行在特权模式。如果ISR Handler在non-trusted OS Application中,那么OS需要在ISR() wrapper中先切换到非特权模式,再执行ISR handler。

task

在嵌入式操作系统里,任务就是线程的意思。
AUTOSAR OS中存在两种任务:基本任务(Basic Task)和扩展任务(Extended Task)。基本任务则存在以下三种状态:

运行状态(Running):

处于运行状态的任务可能被高优先级任务或者中断抢占从而进入就绪状态,且同一Core中任何时刻只会存在一个任务处于运行状态,任务运行结束后则将自己挂起进入阻塞状态;

就绪状态(Ready): 

处于就绪状态的任务由调度器决定是否启动进入运行状态,且该状态时任务切换至运行状态的前提;

阻塞状态(Suspend): 

处于阻塞状态的任务是被动的,可以由API函数或Alarm激活进入就绪状态;

扩展任务与之相比,则多了一个等待状态(Waiting),解释如下:

等待状态(Waiting):

当任务的运行需要等待某一或某些事件被置位时,任务进入就绪状态。

Task调度策略:

AUTOSAR OS是基于优先级进行任务吊物,所以每个任务必定有一个优先级,而每个任务都是根据其自身特点来定义一个优先级且需要配置其可抢占属性。

可抢占属性可分为不可抢占与全抢占,这里所说的抢占指的是内核抢占。AUTOSAR OS可根据各个任务的可抢占属性配置,来提供不同的调度策略,调度策略可分为以下三种:

  1. 完全抢占式:OS所有任务均是可抢占类型;
  2. 非抢占式:OS中所有任务均是不可抢占的;
  3. 混合抢占式:OS部分任务是可抢占类型,部分任务是不可抢占类型;

event

OS中的Event 主要用于为Extended Task 提供多个同步点,每个Event 可以关联多个Task

自由调度:

自由调度一般task的类型配置为EXTENDED,这种调度方式主要跟runnable绑定alarm,通过alarm触发event,event触发pending的task来执行task。

如下实列代码可以展示自由调度中EXTENED类型的task的执行过程

Task(DIAG)
{
	while(1)
   {
	   waitevent(eventA);
	   if(eventA)
	   {
	       runnable();
	   }
	 }
}

WaitEvent:

只要表达式中任意一个EVENT 被收到,Task state则切换至Ready, 等待调度表按照优先级进行调度

SetEvent:

为指定的Task 设置Event

GetEvent:

获取指定Task当前接收到的所有EVENT

ClearEvent:

当Event被Task处理完成之后,需要进行Clear

Runnable & SWC & port:

Runnable就是一个函数,SWC是应用层单元模块.,例如上图SWC2是接收数据的功能模块,里面包含了三个函数,也就是3个runnable

一个TASK包含多个SWC

Port是依附在SWC上的概念,比如配置工具配置SWC后,需要配置这个SWC的Port。其实也好理解,如果一个C文件孤零零的放在那里,与别的C文件没有任何数据交互,那么作为一套代码中的一个C文件,根本没法发挥作用,所以必然在SWC上需要配置上或者输入(R-Port)的或者输出(P-Port)的Port。

物联沃分享整理
物联沃-IOTWORD物联网 » 深入理解进程、线程、Core、OS Application、task、event、runnable、SWC和port之间的区别与联系

发表评论