免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4488 | 回复: 12
打印 上一主题 下一主题

[自制操作系统研究] 今天设计异步调用的机制, 发现了一些基本原理.. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-17 02:42 |只看该作者 |倒序浏览
本帖最后由 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 ...


传统的任务串行的机制, 是以每一个函数为一个 '最小单位' 的 .

但是在异步函数的语言里, 一个函数被分割成多个  '最小单位'


所以, 异步函数语言, 实际上, 是一种用 结构化编程 来表示多个异步任务 的语言.

原本多个任务, 是需要写成多个函数, 或者是单个函数下用状态机来实现分支.

但是现在异步函数语言可以直接帮忙创造出这种直观的分支,  它提供的是一个新的编程思想 .













论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2012-03-17 11:37 |只看该作者
基本概念和逻辑,有些不对头

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
3 [报告]
发表于 2012-03-17 20:56 |只看该作者
本帖最后由 smalloc 于 2012-03-17 20:57 编辑

看看分布式计算,有你想要的东西

论坛徽章:
0
4 [报告]
发表于 2012-03-18 14:24 |只看该作者
回复 2# 塑料袋


有哪些不对头呢? 愿闻其详.

论坛徽章:
0
5 [报告]
发表于 2012-03-18 14:25 |只看该作者
回复 3# smalloc


这和分布式计算不是同一个东西哦.  

论坛徽章:
0
6 [报告]
发表于 2012-03-20 08:44 |只看该作者
你这个东西,如果我没理解错的话,应该就是传说中的coroutine或者叫做fibre,已经有好几十年的历史的一种调度方式了。
首先,我先说的是,这个东西在现在的操作系统上面是很容易实现的,在函数运行的过程中,保存BP,SP等,你就可以在任意任何一个地方中断函数调用并且以后从这个地方恢复,在新的一块内存上面构造一下函数调用栈,你就可以把当前运行时候的栈迁移到一个新的地方去,而不占用当前线程栈的空间。在linux上面,你甚至直接用ucontext或者libtask之类的东西来实现
其次,有两个问题,兄弟考虑一下
1.  如果直接把这种调度放到内核态,你和直接使用线程,带来了什么好处
2.  如果放在用户态,能带来多大的性能的提升

这种东西比较适合的场景应该是互联网中的那种broker服务,请求处理时间都很小,处理该请求需要请求多个server。这种机制,我了解的是,在几个大的互联网公司都已经有实现了

论坛徽章:
0
7 [报告]
发表于 2012-03-20 09:10 |只看该作者
回复 6# isscc


是有很大的不同的. 因为我这个机制是需要为异步函数语言提供的基础架构模型.

传统的调度为 :

samethread : func1 -> func2 -> func3 -> .....

但是我设计的语言调度为 :

samethread : func1part1 -> func2partx -> func1part2 -> func2party -> ...

一个结构化的嵌套函数的总过程 , 被分割成非常多块的小片段. 每一个片段都不能发生阻塞, 否则整个线程都会被阻塞掉导致其他任务也无法被执行.

所以, 挑战就是这里, 要把阻塞全部换成异步调用.


这种现象, 就好像 windows 编程里的  DoEvent() 一样,  一个函数做到一半, 不想返回, 但是又不想阻塞, 就用 DoEvent

但是DoEvent有很多缺点. 所以我才设计了一个VM语言去模拟异步.  详细可以看

http://www.cnblogs.com/parallet/


不过我最近也发现了, 做到这一步, 是不需要OS的支持的.  而这个思考的深入, 让我反过来, 想把结构化异步函数的概念直接用来编写系统内核.




论坛徽章:
0
8 [报告]
发表于 2012-03-20 09:17 |只看该作者
本帖最后由 MJK2012 于 2012-03-20 09:47 编辑

回复 6# isscc

1.  如果直接把这种调度放到内核态,你和直接使用线程,带来了什么好处
现在我的系统有两种方案. 一个放到内核态统一管理, 一个放到用户进程自己分割. 各有各的好处吧. 细节太依赖其他设计, 这里暂时说不清楚.

2.  如果放在用户态,能带来多大的性能的提升
用户态有多大提升, 这个不知道哦. 要测试过才知道. 总之两种方法都要实现.

今天重新把 http://www.cnblogs.com/parallet/ 的实现拿出来做一下对比测试 .

Windows7 64位 真的让我吃惊!  由于有足够的stack地址空间, Windows7 64bit 已经实现了动态分配stack的页面的功能了. 启动了2000条线程完全不怎么消耗内存.

不过 Windows7 64位 依然还是有缺点, 就是最大只支持8192条线程. 如果用传统的阻塞方式, 服务器有8192个请求被阻塞着, 系统就无法再处理更多的请求了.

而我的那个Parallet虽然是DotNet上另外做了一个VM, 测试16万个Parallet任务同时在等待, 依然不会出错. 只是我电脑上的内存已经被吃掉1.4G而已.

(由于是建立在VM的VM, 所以这个只能做一个参考数值. 用C写一个单独的不需要VM的支持异步的全新语言的话, 内存会占用更少, 性能会提升更多)

如果我在OS的基础上实现这个异步的IO机制, 那么就能用传统的streamline编程方式, 去响应更多的请求. 那些因为其他IO等待的任务数量只限制于内存的大小.

-

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2012-03-20 13:02 |只看该作者
回复 7# MJK2012

不知你做过一点时间的产品开发没有?如果你做过,就不会有这么多玄的主意了。
你的这些东西让我越听越神,一旦你没法解释时,你就祭出你神奇的异步语言,和梦幻的操作系统来支撑。
所以你现在要做的事应该是赶快把你的神奇的异步语言,和梦幻的操作系统变为现实;没有这两样东西, 你现在侃再多, 都是扯淡。

   

论坛徽章:
0
10 [报告]
发表于 2012-03-20 13:27 |只看该作者
回复 9# linuxfellow

我在公司里是负责所有产品的架构设计的.  年份最长的一个产品做了8年, 现在是7.0, 其他产品很多都搞到3.0以上. 不知道这些够不够长呢.

基本上我现在很多思想, 都是源于工作中, 对当今的编程模式的不满而产生的.

就好像我们公司做了大约6年的聊天软件一样. 我发现的问题就是异步代码编写起来很复杂, 很麻烦.

我也感受到越来越多的应用是很需要一种新的方式去释放程序员的负担.  所以我才创立了异步函数语言.

异步函数语言听起来的确是很那个的.. 因为现在根本就没有人在用.. 连C#5.0都还处于试验阶段..

由于上一年我已经实现了Parallet在dotnet上的模式啦, 所以在真正写代码之前, 我会再花一点时间做多一点点理论, 然后才开始动手.


谢谢你的提醒先.


我的计划顺序大概是 :

1 - 这种语言的C版本的JIT , 即直接编译成CPU指令然后直接运行. 这个可以在Windows上完成.  
   完成基本的功能需时大概2个月, 然后写各种代码做测试以达到稳定要一个月.

2 - 开始编写操作系统内核, ASM/C/异步语言 一起上. 该用什么写的部分就用什么写.
   这个需时大概一个多月

3 - 开始实现HAL, 以及找一块通用的网卡回来为这个网卡写个驱动, 用着先.
   这个大概需时两个星期

4 - 在有网卡驱动的基础上, 实现TCP,
   这个就复杂了.. 没经验, 完全不知道写到什么时候. 可能要招人来写.

5 - 把Ruby On Rails移植进来(因为ROR自带HTTP),  然后做大量的并发测试.
   这个大概需要两个星期.

6 - OK, 一切就绪, 发布成开源项目.

预计时间是7个月以上.
















您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP