2

我们为什么要使用流程。我们不能建立一个所有事情都用线程完成的环境吗?我可能认为的一些原因是:

  • 恶意阻塞线程可能会导致所有线程阻塞。
  • 线程的安全问题,因为共享可能会导致更多的不一致,并且需要更多的同步。

除此之外,如果它们没有安全问题,我们可以转移到一个完全线程化的环境来使用吗?

4

2 回答 2

4

在操作系统级别迁移到完全线程化的环境(即所有进程都转换为共享相同虚拟地址空间的线程)的问题将是缺乏内存保护。我想不出一个流氓线程能够阻止其他线程,但它肯定会在不允许去的内存位置四处游荡。如果违反了保护,就会出现很多安全问题。但是,如果所有线程都表现良好,它会正常工作。然而,这类似于预先保护的内存操作系统,其中一个线程会使整个系统崩溃。

也就是说,这种系统的优势可以忽略不计。在当前系统中,两个进程已经可以请求一段共享内存进行合作(参见此处)。我能想到的唯一其他优势是上下文切换可能会减少开销。在一个非常冒险的环境中,甚至可以完全关闭虚拟内存并运行内核空间中的每个线程,就像在原始 xbox 操作系统中一样(链接似乎已损坏,此处为替代)。这将产生更快执行的效果,但即使是轻微的缓冲区溢出也可能会破坏一切。

总而言之,关于进程和线程的操作系统安全性已经有很多研究。进程的封装性和独立性的性质使它们非常适合并发。如果它们对您来说不够快,请为特定的用户应用程序编写具有多个线程的单个进程,但最好不要回到预保护计算的黑暗时代,将所有内容混合在一个内存空间中。

于 2012-05-31T11:36:37.393 回答
1

如果您的意思是“我们能否将基于多进程的应用程序重写为单进程多线程应用程序”,那么答案很可能是“是”。

如果您的意思是“我可以编写一个不再有进程而只有线程的操作系统”,那么答案是响亮的“不”。线程对程序状态的访问太多了。这使得它们非常高效,但也非常危险。故障是问题,故障是否是由于处理器故障导致线程硬崩溃引起的。或者像死锁这样的问题。目前不可能终止线程并对程序其余部分的状态没有影响。一个进程提供了隔离边界,允许行为不端的代码被终止,而不会影响机器上运行的其他进程的稳定性。它还提供了对安全性非常重要的特权边界。

于 2012-05-31T11:37:05.963 回答