赞 | 0 |
VIP | 2 |
好人卡 | 27 |
积分 | 1 |
经验 | 26327 |
最后登录 | 2019-10-13 |
在线时间 | 953 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 953 小时
- 注册时间
- 2007-4-25
- 帖子
- 805
|
本帖最后由 苏小脉 于 2011-4-27 13:47 编辑
所以,即使是ruby里面的Thread.new出来的线程应该也是属于RPGMake的进程,这样的线程就会和其他的线程分摊这个进程的CPU时间。
Ruby 1.8 的线程是绿色线程,是由解释器调度的,不能提升丝毫性能。其存在意义只是为了让语言拥有协程,能进行多任务设计。虽然后来 Ruby 1.9 采用了 OS 线程,但由于 YARV 不像 JVM 那么强力,只能和 CPython 一样部署全局解释器锁,大部分场合下仍然没有真正的并发,所以也不能提升性能。唯一的好处就是 Ruby 标准库以及第三方扩展可以在短时间内手动把锁解开达到并发,从而解决一些性能上的问题,比如阻塞的 I/O 操作。
这里“RM主线程”有歧义,是指 RM 的 OS 主线程,还是 Ruby 层面的绿色线程?如果用来指后者,当某个 Ruby 线程进行耗时的外部函数调用时,其它的 Ruby 线程确实会尽数僵死,因为其任务调度是由解释器负责的,而自始至终解释器都只是一条 OS 线程。
同进程的线程会不会使得另外一个线程没有机会被调度,这个取决于操作系统的任务调度机制,对于大多数操作系统而言应该是不会的。除非那个进程本身难以被调度。多线程提供的就是一种并行的假象(多CPU是真的并行。。。),如果会有一个线程无法执行,那就失去线程的意义了。
确实,如今家用计算机上常见的系统都是抢先式多任务系统,采用轮转式调度,每个线程的执行和操作系统为其分配的时间片有关,不会因为其中一个线程消耗所有 CPU 时间而出现整个系统假死的情况。不过,很多受时间约束的实时嵌入式操作系统都采用合作式调度,因为只有这样,实时程序才能有一个确定性的算法精确地控制实时序列,比如火箭上的航线修正系统。其实合作式多任务是最早被采用的调度方式,以前 Windows 9x,Mac OS Classic 等遗留系统都曾经用过。因为合作式多任务系统有上述排程缺陷,就逐渐过渡到了抢先式多任务。 |
|