- 论坛徽章:
- 0
|
本帖最后由 MJK2012 于 2012-03-15 12:06 编辑
回复 6# kouu
HI, 谢谢你的讨论先. 至于你后面说的那句话, 的确就是有这个意思.
用'同步'的编程方式, 实现'异步'的成果. 就是我的目标. 而这个目标是需要建立在OS的基础上, 才能更快.
(不是非要OS实现不可, 而是如果不用OS实现, 那么性能就不够快, 也就在一定程度上抵消了它的好处了)
那么我这里继续说说那个任务的stack的处理机制吧.
其实我的设计, 是基于页面切换的 . 在32bit,64bit,pae等各种情况下, 都可用页目录来实现分页.
其中最后一个表, 可以映射出4K*1024 = 4M的空间.
stack是一个很特殊的结构, 它只会存临时信息, 它可以引用其他指针. 但是基本上不会(也禁止)程序直接引用stack上的某一点.
(C语言允许把stack上的内容, 通过指针的方式传递给其他函数, 甚至传递给其他线程. 这就是兼容问题的一个大原因.)
假如一个stack它只是task自己用到的, 不允许stack的内容被指针的方式引用.
那么 , 就可以在页目录上, 切换页表的形式, 加载和卸载stack的数据了.
那么产生的好处就是, 进程内一个128M的地址范围, 本来只能存放16个4M空间.
但是通过切换页表后, 就可以用来描述无数个stack了.
当一个任务被CPU执行时, 就会往这16个范围内, 申请一段, 加载stack, 当切换离开时, 需要释放.
这些都不需要移动物理内存, 纯粹就是靠在页目录上换一下页表的指针就够了.
在这个过程中, 任务的stack的位置, 是会不断地被改变, 相当于不断地被移动.
那么这128M的地址空间, 允许同一个进程的多个个tasks同时被16个CPU执行.
这实际上, 可以被称为一种, 地址的分时复用技术. 通过不断地切换页面映射, 在合适的时间内分配合适的数据.
|
|