zoukankan      html  css  js  c++  java
  • 多进程和线程的区别【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/39432377

    1、首先要明确进程和线程的含义:

    进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。进程是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

    每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。

    多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

    使用线程的好处有以下几点:

    a)使用线程可以把占据长时间的程序中的任务放到后台去处理

    b)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

    c)程序的运行速度可能加快

    d)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

    2、其次来看下线程和进程的关系

    线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

    3、然后我们来看下线程和进程间的比较

     

    子进程继承父进程的属性:

    子线程继承主线程的属性:

    实际用户ID,实际组ID,有效用户ID,有效组ID;

    附加组ID;

    进程组ID;

    会话ID;

    控制终端;

    设置用户ID标志和设置组ID标志;

    当前工作目录;

    根目录;

    文件模式创建屏蔽字(umask);

    信号屏蔽和安排;

    针对任一打开文件描述符的在执行时关闭(close-on-exec)标志;

    环境;

    连接的共享存储段;

    存储映射;

    资源限制;

    进程中的所有信息对该进程的所有线程都是共享的;

    可执行的程序文本;

    程序的全局内存;

    堆内存;

    栈;

    文件描述符;

    信号的处理是进程中所有线程共享的(注意:如果信号的默认处理是终止该进程那么即是把信号传给某个线程也一样会将进程杀掉)

     

    父子进程之间的区别:

    子线程特有的:

    fork的返回值(=0子进程);

    进程ID不同;

    两个进程具有不同的父进程ID;

    子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime均被设置为0;

    不继承父进程设置的文件锁;

    子进程的未处理闹钟被清除;

    子进程的未处理信号集设置为空集;

    线程ID;

    一组寄存器值;

    栈;

    调度优先级和策略;

    信号屏蔽字;

    errno变量;

    线程私有数据;

     

     

    3、设计时考虑的使用技巧

    1.尽量避免长驻内存的进程,例如那些很少用到的功能,或周期性很长(10分钟以上),把它们的功能提取出来,做成一个小的应用程序。需要的时候再把它们拉起来(如通过crontab配置,或直接system)。

    2.把目标设计成子功能系统的组合可用提高重用的易用性和维护性。 
    把目标根据功能划分不同的子系统,子系统间遵循特定的协议(文本或XML),由通讯联系起来,协作完成目标。

    也就是说,我们在做设计的时候可以如下考虑:

    1、线程的创建以及线程间的通信和同步都比进程要快。在多核CPU上的任务分割是对线程而言的,不是进程。

    2、如果不需要频繁的创建和销毁 执行的效率是并不多的,需要频繁创建的话,线程快。

    3、其它的就根据你的实际情况选择了, 要是没有数据通信什么的,线程间的通信比进程间方便。最关键的一点,多线程可以让同一个程序的不同部分并发执行。

    所以在做安防系统的时候,报警系统和监控系统之间可以用多进程来做,对于报警系统中可以用多线程来实现如果发生意外,可以向用户发送消息,同时鸣笛,以及如果是火警的话,可以打开阀门等。

    1)需要频繁创建销毁的优先用线程。
    实例:web服务器。来一个建立一个线程,断了就销毁线程。要是用进程,创建和销毁的代价是很难承受的。
    2)需要进行大量计算的优先使用线程。
    所谓大量计算,当然就是要消耗很多cpu,切换频繁了,这种情况先线程是最合适的。
    实例:图像处理、算法处理
    3)强相关的处理用线程,若相关的处理用进程。
    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。
    一般的server需要完成如下任务:消息收发和消息处理。消息收发和消息处理就是弱相关的任务,而消息处理里面可能又分为消息解码、业务处理,这两个任务相对来说相关性就要强多了。因此消息收发和消息处理可以分进程设计,消息解码和业务处理可以分线程设计。
    4)可能扩展到多机分布的用进程,多核分布的用线程。
    5)都满足需求的情况下,用你最熟悉、最拿手的方式。

    至于”数据共享、同步“、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,只能说:没有明确的选择方法。一般有一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个

  • 相关阅读:
    numpy
    shell进阶2
    python笔记3
    shell进阶1
    记录:Paxos原理、历程及实战
    收藏
    linux fs io
    linux mount 操作
    docker好文收藏
    rbd snap(1)
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/5769986.html
Copyright © 2011-2022 走看看