进程(Process):就指一个程序,例如你的电脑里有2002个程序在运行=有2002个进程。
线程(Thread):指CPU运行一个进程的通道,例如你就是一个进程,你现在只在用左手画正方形,右手空闲,这时你的大脑里只有一条线程,如果你用左手画圆,右手画正方形这时,你的大脑里有两条线程。

解决方案 »

  1.   


    比如你去一个超市,里面很多收银台,很多人在交钱,但他们可以在不同的收银台在同一时刻交钱。一个线程(Thread)就是一个收银台。这样许多收银台一起工作,自然提高了效率了。 
    进程就是那个超市,呵呵我们假定这个超市只收钱(天哪,早知道这样我就说银行了,哈哈)
    那么进程(超市)里面包含许多线程(收银台)简单理解,你每次运行一个程序,系统就多打开一个进程
    每次关闭一个程序,系统就关闭一个进程。如果一个超市效益不好,那么只有一个收银台,那这个进程就是单线程的,也就是平时我们见到的大多数程序,它们都是单线程的。如果效益很好,同时许多人交钱,总不能排队吧?所以这时就要多开线程。比如许多服务器程序,都是多线程的。大型数据计算,或者在处理大规模数据的时候不想让用户等待,一般都用多线程。
     满意吗?
      

  2.   

    To Jinhao(酷斯拉II):
    进程并不是指一个程序,而是指程序的一次执行(关于进程的精确定义在学术界也还有争议,但大多数人同意这种定义)。
    关于进程的程序的区别,有3点需要注意:
    1。一个进程可以对应多个程序;反之,一个程序也可以对应多个进程;
    2。进程是暂时的过程;程序可以长期存储保存;
    3。进程是程序的动态执行;程序是进程的静态文本。可以打这样的比方:
    做菜。程序就是那本《做菜宝典》,进程就是某一次做菜的过程。
      

  3.   

    forward":用户级线程(User-Level Thread): 
    OS内核不支持多线程进程,以内核的观点来看只有进程的存在,此时的多线程是通过一个在应用程序进程内运行的函数库来实现的,此函数库主要实现进程内线程的各个栈的切换。优点:由于同一进程内的线程的调度不需要进入核心态,所以对系统资源的消耗较少,可以在一个进程内启动非常多的线程,另外可以通过修改线程库的实现来为不同类型的进程定制不同的线程调度策略。缺点:由于内核只知道进程的存在,因此同一进程内的不同线程无法在不同的CPU上运行,故而单个进程发挥不出多CPU的优势,并且如果同一进程内的任一线程被阻塞,其他线程也都会被挂起。 
    解决方案:线程库的具体实现有可能在一定程度上避免上述缺点。例如:使用外部的、具有自身时钟的监视器来防止内部线程的独占时间片;有的SMP系统可以支持用户空间中的线程;使用非阻塞的I/O或者异步I/O(注意这两者是不同的)来防止出现阻塞,或者在会引起阻塞的系统调用外进行特殊的包装来解决这个问题。 
    核心级线程(Kernel-Level Thread): 
    比用户级线程要复杂一些,实现方式也有几种,但是一般来说调度时都有一个用户态->核心态->用户态的过程,因此在较大的上下文切换时开销也较大,不过可以利用多处理器的优势。简单介绍一下核心级线程的实现方式:1、一对一的方式,即每个线程对象在内核中都有一个相应的内核对象,核心使用类似普通的进程的调度方式来调度这些内核对象,这种方式的最大优点可能就是实现简单,但是缺点就是切换时总要通过内核来进行,效率会较低,特别是切换开销较大时,另外就是可以创建的线程数收到Kernel的限制,印象中Linux的Kernel-Level Thread好象就是使用这种方式;2、多对多的方式,Sun Solaris(好象是它)创造了轻量级进程(LWP)的概念,在Kernel中有多个LWP(数量小于等于Thread数),每个LWP可以负责多个Thread的切换,而在用户态中有一个调度器负责将Thread切换分配给LWP来做,优点是开销小,缺点是实现复杂;3、多对一,即是用户级线程的概念。 
    由于WinNT/2000可以通过Fiber来实现多对多(比较死板)方式的核心级线程,并且WinNT/2000下使用Critical Section实现的互斥效率较高,所以较Linux有较好的多线程性能。
      

  4.   

    forward";再解说一下关于线程的问题,澄清一些可能有歧义的理解。 
    1、user thread和user-level thread,user thread似乎不是一个专门用语,一般我理解为用户使用多线程时属于用户态空间的上下文,而此时用户使用的thread的实现可以是user-level或者kernel-level的;user-level thread是一个专门用语,指的是thread的调度是在用户态实现的,kernel不知道thread的存在,也有称为“协作式多任务”的,因为调度完全要靠用户态中的实现,而不会由kernel来抢占。 
    2、线程库的实现有许多种,有支持user-level的,有支持kernel-level的实现,还有都支持的实现(如Sun的多对多实现)。POSIX只是定义了Thread的函数接口标准(也就是pthread函数),但是并没有规定其实现,其实现可以是user-level的,也可以是kernel-level的,因此调用了pthread函数只是使用了POSIX thread函数接口,至于是user-level的还是kernel-level的,要看具体环境。当然现在大多数都有kernel-level的实现(包括lavos使用的几种系统)。 
    请看以下网址,有pthread实现的对比: 
    http://www.humanfactor.com/pthreads/os-pthread-support.html#free-threads 
    3、lwp有不同的解释,我是参照SUN的解释(因为他是发明者,所以更为“纯正”一些),在Linux Thread FAQ网站上简单地将其解释为Threads,究其原因是因为实现的不同,Linux是一对一的实现,SUN是多对多的实现(也即混合实现),共同点是从kernel的角度来看,lwp是Thread在用户态和核心态之间的一个桥梁(形容可能不太准确)。