进程与线程的区别

来源:互联网 发布:阿里云客服能拿多少钱 编辑:程序博客网 时间:2024/06/03 16:56

首先举一个小小的不太精确的类比,相当于一个简单的入门。

计算机的CPU主要负责解释计算机指令以及处理计算机软件中的数据,简单点说就是承担了计算机中所有的计算任务。可以把它比作一个工厂,时时刻刻都在运行。

现在假设工厂电力有限,一次只能讲电力提供给一个车间使用。即,当一个车间工作的时候,其他车间都必须停工。这就是“单个CPU一次只能运行一个任务”的比喻。这里,进程比作车间,代表CPU能处理的单个任务,而任意一个时刻,CPU总是只运行一个进程,其他进程处于非运行状态。

除此以外,一个车间里可以有很多工人,他们协同完成一个任务。而线程,就好比车间里的工人,一个进程可包括多个线程。而车间的空间是工人们共享的,比如许多房间是每个工人都可进出的。这象征一个进程的内存空间是共享的,每个线程都可以共享内存空间。

以上只是粗略的类比,真正要理解进程与线程的区别还是要深入概念。

进程与线程的概念

进程:
程序是不能单独运行的,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。

既然有了进程为什么还需要线程?
在多道编程中,操作系统允许多个程序同时加载到内存中,然后存在操作系统调度下实现并发执行。就是这样的调度设计,提高了CPU的利用率,会让用户觉得自己独享了CPU和其他资源。但是为什么进程这么优秀,还需要线程的存在呢?主要在于进程的两点缺陷上:

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

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

比方说,当我们听课时,要同时做三件事情:听课,记笔记,思考。1)但是如果只提供“进程”机制,这三件事不能同时进行,同一时间内只能做一件事,比如听课时不能记笔记和思考。2)假如老师在演算过程,我们在记笔记,而老师突然有一步推不下去,就会阻塞,他在思考的时候我们却不能干其他事,不能记笔记、思考、听课,只能干等。

所以我们要有另外一个机制,让听、写、思三个独立过程都并行起来以提高听课效率。所以便引入了“线程”的概念。

线程:
前提:进程属于在处理器这一层上提供的抽象;线程则属于在进程这个层次上再提供了一层并发的抽象。

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

进程与线程的联系

在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

进程与线程的比较

1)地址空间和其它资源:
进程间相互独立,这表现在内存空间,上下文环境,所以一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间。而某进程内的线程线程运行在进程空间内,所以同一进程所产生的线程共享同一内存空间,在其它进程不可见。

2)同一进程中的两段代码不能够同时执行,除非引入线程。

3)线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。

4)占用资源:
线程占用的资源要少于进程所占用的资源。

5)调度和切换:
线程上下文切换比进程上下文切换要快得多。

6)在多线程OS(操作系统)中,进程不是一个可执行的实体。

7)通信:
进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

8)进程和线程都可以有优先级。

总结:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(比如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

附加我觉得挺重要的线程的一点知识:
平时我们写的程序都是作为线程运行的,一个进程至少包含一个线程(主线程,如c中进入main函数时创建的线程),在其中还可再创建出多个线程。而同一个进程中,这些线程共享的资源有:
1>堆。由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的。
2>全局变量。
3>静态变量。
4>文件等公用资源。
线程独享的资源:
1>栈。
2>寄存器。这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是寄存器副本,包括程序计数器PC。

感觉对进程与线程的理解还是皮毛,还是希望自己能多多学习,多多查找资料。不过操作系统老师也说了,“如果能真正理解并掌握了进程的概念,操作系统这门课就学得差不多了”,所以,还是加油吧~

0 0
原创粉丝点击