【问题标题】:Task in vxworksvxworks 中的任务
【发布时间】:2011-12-06 06:52:15
【问题描述】:
当我们执行 taskSpawn 时,正在 vxworks 中创建一个任务。实际上是什么任务。跟线程有关系吗。
据我了解,vxworks 是基于线程的操作系统。
有人可以帮助我了解实际场景中任务/线程/进程之间的真正区别吗?
我在某处看到任务是执行一组指令。如果是这样,那么线程也有一些指令集,所以我们可以将线程称为任务。
请帮忙
【问题讨论】:
标签:
linux
multithreading
operating-system
vxworks
【解决方案1】:
任务和线程类似于进程。但不同之处在于线程没有单独的内存空间,它们在进程本身的 pcb(堆栈)下运行。但是,任务有自己的堆栈区域并且是一个轻量级进程,即,tcb 与pcb,因此上下文切换或任务切换可以更快地发生。
由于 vxworks 处理 rtos 并且切换延迟应该非常少,它处理任务。
【解决方案2】:
除了现有的答案:
如果您需要在 VxWorks 系统上创建 POSIX 线程(可以通过在内核配置中包含 POSIX 并调用 pthread_create() 来实现),您会注意到这些线程将作为任务出现在您的任务列表中(在C 外壳)。
因此,任务和线程非常相似。 VxWorks 甚至将 POSIX 线程包装为任务,以便与现有的本地任务并行处理。
【解决方案3】:
在 vxWorks 中,任务是一个可运行的单元。
任务具有 TCB(任务控制块),具有唯一的任务空间和特定的优先级(正如您在 taskSpawn 函数中定义的那样)。
vxWorks调度器只能运行任务,这是最小的可运行单元(调度器可以自己运行内核,中断可以在系统中运行)。
运行哪个任务的决定将基于任务状态(必须处于就绪状态)和任务优先级(在 vxWorks 中,最高优先级是较低的数字)。
请注意,多个任务可能具有相同的优先级,然后内核将根据您配置的方案(FIFO 或循环)运行不同的任务。
在 vxWorks 中,所有任务都拥有相同的内存空间(包括内核内存空间)。这就是 WindRiver 在 vxWorks 6.x 中添加了“Process like”机制的原因。进程有自己的受 MMU 保护的“虚拟内存空间”。
只是为了给你总结一下:
任务在系统中拥有相同的内存空间。
线程在它们的进程中拥有相同的内存空间。
受 MMU 保护的进程内存空间。
【解决方案4】:
任务是操作系统设计中的抽象概念。任务是执行的单个上下文。任务有一个内存空间,它在其中存储数据和代码。此内存空间可能会或可能不会与其他任务共享。一个任务有一个状态(例如正在运行、停止、被杀死......),它(通常)有一个堆栈。任务优先于其他任务。
关于此类任务的示例,是 VxWorks 任务。另一个是 Linux 线程。
在 Linux 中(我也相信最新版本的 VxWorks 顺便说一句),存在一组相关任务的概念。属于同一组的任务共享内存空间和其他几个资源(例如文件处理程序)。一个 Linux 进程就是这样一组任务。
总的来说,操作系统调度程序调度任务而不是进程。进程是程序员一起思考相关线程组的对流抽象。
希望对你有所帮助。
【解决方案5】:
线程是一个通常与支持进程模型(Unix/Linux/Windows)的操作系统一起使用的概念,您可以在其中运行进程。
这个进程可以有一个执行线程(就像一个简单的 C 程序)。或者您可以创建多个线程在当前进程内存空间内并行执行某些操作。
对于较旧的 vxWorks,没有进程模型。一切都将在同一个内存空间中运行。 vxWorks 任务提供系统代码将执行的上下文。所有代码(中断处理程序除外)都将在任务的上下文中执行。
任务是独立的执行单元。他们可以共享资源,拥有共同的内存等等......但是调度程序根据非常具体的标准执行任务。通常,系统中优先级最高的任务是在任何给定时间执行的任务。
一旦任务完成/休眠/阻塞等待资源,系统中的下一个最高优先级任务将运行。
出于您的目的,您可能可以将任务视为一个线程。