- 论坛徽章:
- 0
|
本帖最后由 MJK2012 于 2012-03-17 02:48 编辑
以前思考异步操作, 是站在编程语言的角度上去想的. 今天在OS的角度去进行设计. 发现原来我的想法是:
举例 ,
一般RTOS的任务机制, 是 '非抢占式的任务队列' , 示意图如下 :
task1 -> task2 -> task3 -> ...
任务排队执行, 一个搞定后, 再执行第二个.. 这是 '串行'
Windows/Linux 是 '抢占式线程机制' , 示意图如下 :
thread1 -> thread2 -> thread1 -> thread2 ...
不同的线程在抢CPU的时间片段. 这是 '并行'
而我的方案, 原来就是这两种方式的一个广义设计. 如下 :
thread1 : { task11->task12->task13->... }
thread2 : { task21->task22->task23->... }
一个系统会有多个线程并行着执行, 然后一个线程下有多个任务串行着执行
实际执行时, 两个线程下的任务会打架 , 但是处于同一个线程下的任务不会打架.
为什么说是一种广义设计呢 ?
情况1, 如果系统只有1个线程, 那么它就是单纯的 串行执行.
情况2, 如果每个线程只允许有1个任务, 那么它就是单纯的 并行执行.
所以, 只要往Windows/Linux里, 加入串行执行的任务队列机制, 就可以实现这个目标.
---
然而, 在我的设计中, 这个并行+串行的, 是作为一种基础架构 . 建筑在这个基础架构之上的, 是结构化过程的分片执行.
举个例子,
function A()
{
StepA1();
AsyncRead();
StepA2();
}
这个函数中途用了一次异步调用, 那么这个函数就会被分成两个task,
task1 : StepA1+BeginAsyncRead ,
task2 : EndAsyncRead+StepA2,
那么在A所在的线程里, 就会是这样的逻辑
thread1 : task1 -> task2
但是一个线程由于是允许多个任务串行的 , 那么 task1 和 task2 往往, 中间会被塞进其他任务 , 变成
thread1 : task1 -> taskxx -> task2 ...
传统的任务串行的机制, 是以每一个函数为一个 '最小单位' 的 .
但是在异步函数的语言里, 一个函数被分割成多个 '最小单位'
所以, 异步函数语言, 实际上, 是一种用 结构化编程 来表示多个异步任务 的语言.
原本多个任务, 是需要写成多个函数, 或者是单个函数下用状态机来实现分支.
但是现在异步函数语言可以直接帮忙创造出这种直观的分支, 它提供的是一个新的编程思想 .
|
|