单进程编程:顺序执行  数据同步  复杂度低  用途单一
多进程编程:同时执行  数据异步  复杂度高  用途广泛
1.  多进程的优势在于任务的独立性,比如某个任务单独作为一个进程的话,崩溃只影响自己的服务,其他任务不受影响.如果是多个任务在同一个进程内部利用多个线程进行处理,某个线程发生了未处理的异常的话,会导致整个进程完蛋,所有的任务跟着遭殃
2.  从资源分配上来说,多进程方案比多线程方案更加灵活和自由
3.  不过任务间的通信方面多进程要比多线程复杂些,编一个好的多进程通信方案要比多线程间的通信方案困难多了
以web server为例的话,比如我的服务器上架设了三个网站,如果是用一个进程管理的话, 网站A遭受攻击死掉了,意味着另外两个网站会出现同样的现象. 如果是分开独立的进程的话,三个网站互不影响

单进程VS多进程   优点:

1. 初期实现起来比较简单快速,省去了进程间通信的工作

2. 单一性使得部署和运营比较简单

3. 内存占有少, 现在内存都很便宜,这个优势不明显

4. 进程内部通信效率比IPC/socket等要高效

单进程VS多进程   缺点:(引用:http://blog.csdn.net/blade2001/article/details/6790890

1. 中后期随着业务逻辑的复杂化和需求的增加,这个单进程会变得臃肿, 难以维护。 一个任务分解成多个进程会使单个进程的逻辑简单,而不容易出错

2. 同进程内模块间是强依赖关系,需要在一起编译相互的影响也比较大。 这相对于多进程间通信来说, 耦合度较大, 不利于多团队并行开发。 多进程更便于多语言的协作开发。

3. 任何模块的崩溃都将导致整个进程的失效,多进程模式更加稳定健壮,业务处理程序隔离运行, 一个Crash不会影响其他

4. 性能问题: 如果不支持进程间cascading的话,单进程的capacity是受限的, 这个性能瓶颈对于支持群组类服务的尤其需要考虑。多进程部署极其灵活,可以扩充机器数量来提高系统处理性能,还可以从硬件上避免单点故障。

5. 单进程中多线程难调试

如果需要高性能处理,只要根据实际情况设计合理,多进程和多线程都是可行的。

如何选择取决于业务要求, 在高端应用中稳定是关键,效率和功能只能排第二, 如金融系统。即使是重负载程序,也分很多种:计算密集型、I/O密集型、通信密集度?

为了应对浏览器经常出现崩溃的现象,现在很多浏览器厂商都采用了多进程标签浏览的概念,其中包括主的IE8、Chrome、 Firefox浏览器,而众多基于WebKit的浏览器在苹果发布WebKit2内核以后已经将可以后采用多进程标签浏览这个功能。

搜狗浏览器是多进程浏览器,

在浏览器中添加多进程浏览之后,即使是浏览器其中的一个进程出现了崩溃现象,其他的进程也不会受到影响。例如一个网站中有漏洞或包含恶意代码、木马等网络攻击,有可能摧毁当前运行在这个网站上的标签,但是却不会影响其他的进程或整个浏览器。多进程是浏览器发展趋势,微软windows系统自带IE以后也不会有单进程了

Linux中多进程、多线程编程需要注意什么问题?

注意同步啊。别搞成死锁了

Linux多进程编程实例

创建两个子进程;一个子进程(生产者进程)依次向缓冲区写入整数0,1,2,...,9;另一个子进程(消费者进程)暂停5s后,从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将数字显示出来;父进程等待子进程2(消费者进程)的退出信息,待收集到该信息后,父进程就返回。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h> int main(void)
{
int i = 0;
int *nCount;
int pfd[2];
char szBuff[11] = {0};
int status;
pid_t pid; pipe(pfd); if (fork() == 0)
{
nCount = malloc(sizeof(int) * 10);
for (i = 0; i < 10; ++i)
{
nCount[i] = i;
sprintf(szBuff, "%s%d", szBuff, nCount[i]);
} write(pfd[1], szBuff, strlen(szBuff));
free(nCount);
close(pfd[0]);
close(pfd[1]);
}
else
{
if (fork() == 0)
{
printf("sleep (5) !\n");
sleep(5);
read(pfd[0], szBuff, 10);
printf("%s\n", szBuff);
close(pfd[0]);
close(pfd[1]);
}
else
{
pid = wait(&status);
i = WEXITSTATUS(status);
printf("child is %d ,exit status =%d\n", pid, i);
pid = wait(&status);
i = WEXITSTATUS(status);
printf("child is %d ,exit status =%d\n", pid, i);
}
}
close(pfd[0]);
close(pfd[1]);
return 0;
} -------------------------------------------------------
解释一下,由于fork出的进程有自己独立的空间,所以两个子进程通信用pipe(管道),由一个子进程malloc出空间,写给子进程2,子进程2接收后返回!

最新文章

  1. 剑指Offer 替换空格
  2. JavaScript入门篇 第二天(消息对话框+网页弹出)
  3. AIX修改用户密码登录不成功案例分享
  4. NPOI高效匯出Excel
  5. 44. Wildcard Matching
  6. Milk Patterns
  7. close函数
  8. centos 更改hostname
  9. JavaScript 操作符 变量
  10. 关于” 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引” 这篇博客相关的优化采坑记录
  11. PHP全栈学习笔记17
  12. shell 生成文件统计信息
  13. 初学者易上手的SSH-spring 01控制反转(IOC)
  14. Flutter - AAPT: error: resource android:attr/dialogCornerRadius not found.
  15. casperjs批量执行多个url
  16. Android 混淆代码有关问题总结
  17. Linux free命令详解
  18. css3实现头像旋转360度
  19. spring aop记录用户的操作
  20. Polycarp and Letters(set首战!)

热门文章

  1. Jquery的deferred对象,看这2篇牛人的文章,基本就够了。
  2. TensorRT caffemodel serialize
  3. Python中的基本语法
  4. 【算法】QuickSort
  5. CodeForces - 616F:Expensive Strings (后缀自动机)
  6. java实现图片上传功能,并返回图片保存路径
  7. linux 的压缩 打包
  8. opencv感兴趣区域ROI
  9. GinKgoCTF-Crypto
  10. linux系统lnmp环境包搬家教程