zoukankan      html  css  js  c++  java
  • 单进程与 多进程关系及区别(多进程系统linux)

    单进程编程:顺序执行  数据同步  复杂度低  用途单一
    多进程编程:同时执行  数据异步  复杂度高  用途广泛

    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) ! ");
    sleep(5);
    read(pfd[0], szBuff, 10);
    printf("%s ", szBuff);
    close(pfd[0]);
    close(pfd[1]);
    }
    else
    {
    pid = wait(&status);
    i = WEXITSTATUS(status);
    printf("child is %d ,exit status =%d ", pid, i);
    pid = wait(&status);
    i = WEXITSTATUS(status);
    printf("child is %d ,exit status =%d ", pid, i);
    }
    }
    close(pfd[0]);
    close(pfd[1]);
    return 0;
    }

    -------------------------------------------------------
    解释一下,由于fork出的进程有自己独立的空间,所以两个子进程通信用pipe(管道),由一个子进程malloc出空间,写给子进程2,子进程2接收后返回!
  • 相关阅读:
    进制转换
    BZOJ 1232 安慰奶牛题解
    [BeiJing wc2012]冻结 题解
    the Captain题解;
    最佳贸易
    第二短路
    街道赛跑
    图论基础知识.
    Tkinter 之事件绑定
    Tkinter 之TopLevel顶级窗口
  • 原文地址:https://www.cnblogs.com/xubeiping0930/p/4515011.html
Copyright © 2011-2022 走看看