在我们实际开发或者构思项目的过程中,会根据产品的定义或者客户需求对产品的功能上进行分解从而转换成我们软件的开发的概要设计需求表现,比如我们需要做一个多路可调的电源输出并且可以通过 PC 端控制电源的当前输出以及实时显示当前的输出电压和电流,但是接上负载之后可能由于线阻问题可能会导致负载端的电压低于实际输出端的电压,所以还需要一个负载端(远端)的电压补偿功能,如下图1所示:
1.1 任务定义
在上述图 1 和图 2 的设计模块的功能图和功能关系图之后,此时我们可以通过上述图能发现哪些功能或者说模块需要设计的,其实这里的“多通道电源控制”就是我们的“任务”。现在我们把这个大的任务已经分解开上述图 1 所示的 5 个小功能,这个 5 个小的功能咱们也可以称之为任务。
1.2 观察者角度
所以这里我们软件上对“ 任务” 的理解,其实它是我们对所要做的一件事情从某种角度上的抽象出来的一功能或者一个执行活动。 这里面为什么是从某种角度呢?这个很好理解,就是通常我们看到一个事情可以有很多方面去观察的,比如事物的功能去划分观察,又或者是对事物的颜色或者活动状态去划分。所以在我们软件开发过程中“某种角度”也就是说观察者的观察方向很重要,因为它直接的影响到了我们的软件模块划分以及后续针对这个模块进行线程或者进程的执行有着直接影响。
1.3 操作系统的调度
这里面我们不得不说些关于操作系统的调度这个概念了, 当有一堆任务需要被处理,但由于资源有限,比如说只有一台打印机,现在有很多人都需要打印各自的文档那怎么办呢?现在的资源(打印机)只有一个,但任务(很多人需要打印)比较多。 这就需要确定某种规则来决定处理这些任务,这就是调度要做的事情了。 现在回到我们的 CPU 上,就拿现在的单核 CPU, CPU 在同一个时间点只能做一件事情,那它是如何处理多件不同的事情呢? 这里一般情况分为抢占式和时间片式的调度方式,当然还有很多其它的调度算法,咱们只是
了解即可。
1.4 线程
线程则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。 如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。 还是列举上述图 1 的例子“多通道电源控制”项目。这里面的“多通道电源控制”的这个大任务,如果把它当作一个进程的话,那么它下面 5 个小任务就可以理解为我们的线程(子任务)。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性,当然在单处理器上的线程,其实从宏观角度来看也是并行执行的。
1.5 进程
进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、 I/O 设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配 CPU 以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。一个进程和一个线程最显著的区别是:线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样。
实战项目应用
邮箱:TianjiStar.work@outlook.com
-
cpu
+关注
关注
68文章
10816浏览量
210980 -
FreeRTOS
+关注
关注
12文章
483浏览量
61959 -
线程
+关注
关注
0文章
504浏览量
19638 -
进程
+关注
关注
0文章
201浏览量
13941
发布评论请先 登录
相关推荐
评论