进程和线程的区别

进程和线程的区别


进程和线程的概念

在了解区别之前,我们先了解什么是进程和线程:

  • 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
  • 线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

以下就开始介绍两者区别

一、从属关系不同

进程是正在运行程序的实例,进程中包含了线程,而线程是轻量级的进程,一个进程中包含了多个线程,因此多个线程间可以共享进程资源,线程和进程的关系如下图所示:
在这里插入图片描述
其中,堆和方法区是可以共享的区域,而程序计数器和栈是每个线程私有的。

  1. 程序计数器是一块内存区域,用来记录线程当前要执行的指令地址。
  2. 栈是用来记录每个线程自己的局部变量的。
  3. 堆中存放的是当前程序创建的所有对象。
  4. 方法区存放的是常量和静态变量等信息。

二、所属基本单位不同

进程是资源分配的最小单位,线程是程序执行的最小单位。
同一个进程可以包含多个线程,一个进程中至少包含一个线程,一个线程只能存在于一个进程中
以下节选自《Unix网络编程》

fork is expensive. Memory is copied from the parent to the child, all
descriptors are duplicated in the child, and so on. Current
implementations use a technique called copy-on-write, which avoids a
copy of the parent’s data space to the child until the child needs its
own copy. But, regardless of this optimization, fork is expensive.

IPC is required to pass information between the parent and child after
the fork. Passing information from the parent to the child before the
fork is easy, since the child starts with a copy of the parent’s data
space and with a copy of all the parent’s descriptors. But, returning
information from the child to the parent takes more work.

Threads help with both problems. Threads are sometimes called
lightweight processes since a thread is “lighter weight” than a
process. That is, thread creation can be 10–100 times faster than
process creation.

All threads within a process share the same global memory. This makes
the sharing of information easy between the threads, but along with
this simplicity comes the problem

三、资源消耗不同

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建及销毁一个线程的开销也比进程要小很多。

四、是否同步和互斥

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC) 进行。并且线程在执行时是同步和互斥的,毕竟他们共享同一个进程下的资源,所以如何处理好同步与互斥是编写多线程程序的难点。

额外补充问题:一个进程是不是可以创建无限数量的线程?

不是。

操作系统给一个系统进程提供的空间是2GB ,而一个线程堆栈的空间默认在启动的时候是1MB,理论上最大线程数=2GB/1MB=2048。但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。

如果是同一台机器内的话,能起多少线程也是受内存限制的。

参考链接

链接: 一道面试题:说说进程和线程的区别
链接: 进程与线程的一个简单解释
链接: 进程和线程有什么区别
链接: 线程进程区别

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 说法二:进程线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程线程区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程线程的重要区别。 说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程线程有什么区别呢? 进程线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程线程区别在于: 线程的划分尺度小于进程,使得多线程程序的并发性搞。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值