为什么我们在拥有线程时会使用进程?

时间:2012-05-31 10:29:08

标签: multithreading operating-system

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

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

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

2 个答案:

答案 0 :(得分:3)

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

尽管如此,这种系统的优点可以忽略不计。在当前系统中,两个进程已经可以请求一段共享内存进行协作(参见here)。我能想到的唯一的另一个好处是,上下文切换可能会减少开销。在非常冒险的环境中,甚至可以完全转换虚拟内存并运行内核空间中的每个线程,如the original xbox operating system(链接显示已损坏,alternative here)。这样可以加快执行速度,但即使是轻微的缓冲区溢出也可能会破坏所有内容。

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

答案 1 :(得分:1)

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

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