比较因素 | 多进程 | 多线程 |
内存占用量 | 较多,进程发生分支时不必 要地复制大型内存程序段 | 较少,限制在所需堆栈和线程管理器簿记内存 |
访问全局数据 实现的难易程度 | 较难,需要使用特殊的技术 共享进程全局数据使得共享 全局数据非常麻烦 | 较容易,可使用互斥锁或互斥体 |
创建时间 花费代价 | 较长,因为需要复制堆数据 可能非常大linux内核做了优化 copy-on-write | 较短,因为不需要复制堆数据 |
实例切换时 内核调度所 花时间长短 | 较长,进程上下文保存与启动 耗时较长,需要切换页, 文件描述附表以及其他内容息, 工作时间少 | 较短,保存线程现场数据量少,省时间给程序 留下更多CPU时间处理工作 |
代码编写 难易程度 | 较不易出错,独立分支进程 独立地址空间编写难度相对较小 不会连带其他分支进程, 相互干扰度不那么大 | 编程错误代价惨重,一个线程崩溃整个服务器 瘫痪,互相干扰,程序员需要考虑其他线程行为, 需要额外的防范机制编程 |
同步漏洞 | 容易重现,各分支进程独立 内存地址空间,没有太多交互 | 需要较高水平才能克服,测试难以复现, 使用共享内存更多线程交互,漏洞发生率很高 |
互斥体争用 | 无 | 难以控制,如果有太多线程期望获得同一互斥体, 导致过度线程切换,大量CPU时间消耗在内核调度 上,几乎没有时间执行有效工作 |
32位机地址 空间受限问题 | 每个分支进程都仅 限制于32位机4G | 受限单进程4G RAM,所有分线程合在一起不超过 4G,实际时地址空间在小得多的限值下如1.5G拥挤 |
32位机堆栈 空间自适应性 | 无,满空间4G | 低效,32位机每个线程创建时都会创建stack空间, 即便不用系统也会为其保留, 后续线程所能分配的stack越来越少, 受限于4G因素,即便物理内存再大也难以使用 大型缓冲,大量并发线程, 以及同时为每个线程提供足够的堆栈空间 |
名称 | 说明 | 范围 | 用途 |
文件 | 在典型的 UNIX 文件中读写数据。任意数量的进程都可以互操作。 | 本地 | 共享大数据集 |
管道 | 使用专用的文件描述符在两个进程之间传输数据。通信只在父进程和子进程之间进行。 | 本地 | 简单的数据共享,比如生产者和消费者 |
命名管道 | 通过专用的文件描述符在进程之间交换数据。通信可以在同一主机上的任意两个对等进程之间进行。 | 本地 | 生产者和消费者或命令-控制,比如 MySQL 和它的命令行查询工具 |
信号 | 通过中断通知应用程序某一情况。 | 本地 | 无法在信号中传输数据,所以信号主要用于进程管理 |
共享内存 | 通过在同一内存段中读写数据共享信息。 | 本地 | 任何类型的协作,尤其适合需要安全性的情况 |
套接字 | 完成特殊的设置过程之后,使用一般的输入/输出操作传输数据。 | 本地 | FTP、ssh 和 Apache Web Server 等网络服务 |
评论