进程与线程的区别

来源:互联网 发布:网络医生的工作内容 编辑:程序博客网 时间:2024/05/21 10:22

最近学到操作系统,觉得很有必要把进程与线程的概念搞清楚。

首先我们先从大的方面谈谈cpu——进程——线程:

cpu是计算机的核心,他承担了计算机所有的任务。单个cpu只能运行一个任务。进程是一个动态概念,它代表cpu所能处理的单个任务。cpu总是运行一个进程,当一个进程运行时,其他的进程就处于非运行状态。一个进程里可以有多个线程,一个进程的内存空间是共享的,意思就是所有的线程可以共享这块内存空间。有时候某个线程在使用内存空间时,其它想用的线程需要等待。为了防止一块内存被多个线程访问,可以在外面加一个锁,这个锁就是“互斥锁”。一块内存空间的使用时有限制的,他有最大的线程使用上限,为了解决这个,就要用到“信号量”,为了保证多个线程不会相互冲突。


进程与线程当然没有这么简单。接下来我们就好好说说进程与线程的那些事。


首先我们来看看进程是什么?

进程不单单是程序的一个执行实例这么简单。

首先一个程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。

程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。因为这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。


那么在有了进程后为什么还要有线程?

进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:

    • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

    • 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

    所以我们引进线程这个概念来解决这些问题。



  • 线程的优点:


    因为要并发,我们发明了进程,又进一步发明了线程。只不过进程和线程的并发层次不同:进程属于在处理器这一层上提供的抽象;线程则属于在进程这个层次上再提供了一层并发的抽象。如果我们进入计算机体系结构里,就会发现,流水线提供的也是一种并发,不过是指令级的并发。这样,流水线、线程、进程就从低到高在三个层次上提供我们所迫切需要的并发!


    除了提高进程的并发度,线程还有个好处,就是可以有效地利用多处理器和多核计算机。现在的处理器有个趋势就是朝着多核方向发展,在没有线程之前,多核并不能让一个进程的执行速度提高,原因还是上面所有的两点限制。但如果讲一个进程分解为若干个线程,则可以让不同的线程运行在不同的核上,从而提高了进程的执行速度。


    进程与线程的区别

    1. 在windows底下才有很明确的进程和线程的区分,在linux底下把进程和线程都叫做任务。

    2. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。

    3. 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

    4. 同一进程下的所有线程都共享进程地址空间,以及打开的文件描述符。

    5. 线程也有自己的私有空间,包括:程序计数器(表示下一条该执行哪一条指令)、寄存器(用来线程上下文切换的时候保存当前状态)、堆栈指针、线程优先级、错误变量。

    6. 在linux下,进程的创建有三个函数(fork,vfork,clone),fork和vfork都只是复制出一个子进程,并且fork用到了写时拷贝的技术,vfork父子进程共享地址空间,clone创建一个独立的进程。

    7. 线程的创建用pthread_create,因为线程共享同一进程的地址空间,所以在使用的时候要保证线程安全,主要用互斥锁、条件变量、信号量、读写锁等

    8. 线程又分用户线程和内核线程,用户线程通过调用内存线程来实现通信,这点的线程模型有三种:一对一、多对一、多对多

    解析:一对一:一个用户线程对应一个内核线程,这种方法简单高效,但缺点是由于内核线程的数量被限制,所以用户线程也会被限制;   

             多对一:多个用户线程映射到一个内核线程,解决了数量限制的问题,但它的缺点是只要一个线程阻塞,映射到这个内核线程上的所有线程都会阻塞 ;     

            多对多:多个用户线程对应多个内核线程,由于前面两种模型都有缺陷,所以引入了这种模型可以很好的解决前两种模型的缺陷


    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。


  • 原创粉丝点击