- 论坛徽章:
- 0
|
回复 14# tempname2
Linux即使是在内核态里写代码, 但是如果使用的是普通函数, 那么还是会重新调用int 0x80或sysenter去执行内核代码的, 这个开销太大了.
而且int 0x80之后, Linux依然会做很多安全类型的检查, 或导致性能降低.
而我的实现是, 在内核执行的程序, 调用核心功能的时候, 会避免中断和安全检查. 用完全可信的态度去提高性能.
一般的系统如果只是单个进程的, 那是不需要对内存进行分页的. 而我的刚好反过来. 我觉得, 即使物理内存很少, 但是用虚拟地址空间却能带来很多好处.
3,4不冲突, 整理内存的逻辑可以分段进行, 保证每段整理的间隔少于0.1ms, 系统实时性不会受影响.
关键就是, 我的内存管理方案, 无论是分配还是释放, 都是立刻完成, 并且内存浪费量少于25%,
但是我的算法由于在释放内存的时候, 是根本不会与附近的内存合并, 导致在某些时刻, 内存分配会不合理导致过多的内存被占用.
而内存整理逻辑就是等CPU空闲的时候才去整理内存. 所以这会增大内存高峰期的OOM风险, 好处是的确够简单够快..
本来比起已存在的系统就是毫无竞争力的.. 选择家电, 其实是出于策略因素. 并不是竞争力因素.
我研究了一天的驱动, 设计了自己的驱动架构, 可以不依赖Linux的驱动代码了. 模拟Linux的环境的话太累, 还不如移植代码逻辑.
65536个任务, 可以认为是65536个线程, 或者是类似RTOS的task context, 256G指需要 256G的线性空间, 由于线性空间不够, 所以要分时复用.
任务的stack用的的确是产生page fault时才继续增加物理内存分页.
在我严重, 内存只有两种. 一种时候用指针指来指去的. 一旦一个内存被指针指着.. 那么这个内存就不方便移动了..
除了被指针指着的部分, 全部都可以移动, 或者临时收起来, 等到需要的时候才加载.
实际上这就是分时的页面切换. 目前在我的设计中, 有2种机制用到它
1 - MemoryStream (或者叫内存文件) , 对它的操作是read/write, 所以根本没有地址的说法, 所以不占用地址空间, 可以不断地切换内存去读写不同的部分.
2 - 动态Stack , 为了兼容性, 我保留了普通的Stack , 普通的Stack占用地址空间, 一直到相关线程结束位置. 而动态的Stack, 则在任务切换走的时候释放掉它所占的空间.
根据这种分时服用的方式, MemoryStream解决的是大块内存的占用 , 动态Stack解决任务占的内存 . 那么内存空间里, 就剩下各种指来指去的对象了.
64bit下有用不完的地址空间, 的确可以解决所有的地址问题. 但是一个OS还是需要保留32bit的方式的, 对于增强并发力的关键还是内存消耗量.
例如在32位的Windows里, 即使物理内存再多, 但是一个程序要是运行几千个线程, 那么这个进程也差不多到了2G的极限了. 而我的目标就是要超过这个极限.
Linux并不是每个进程都有自己的内核, 只是他们共享某些公共代码而已. 实际的内核还是必须int 80或sysenter的呀.
即使是最可信的程序, Linux也是做一大堆检查, 对于单进程的程序来说, 实在没必要了.
所以这个系统比RTOS要复杂得多, 但是又比Linux要轻量级一点.
当然, 这个比较, 针对的是普通意义上的Linux, 而不是各种Linux的变种.
|
|