进程和线程的定义及区别(进程和线程的区别)

文章目录
    • 进程和线程
      • 进程
      • 线程
      • 创建线程和线程的常用方法
      • 进程与线程的区别总结

最近经常看到 多进程,多线程和多任务等名词,很容易混。网上查了很多资料,内容很多。作为Linux初学者,还是想从最基础的开始了解,找通俗的例子了解,由浅入深。我把网上查阅的资料整理的一下,一次性全部摸透,还是有点难度的。写个博客,记录一下,以便后期查阅复习。

首先,从定义开始,先看一下教科书上 进程和线程定义:

进程:资源分配的最小单位。

线程:程序执行的最小单位。

心中默念,啥啥啥,写的这是啥。于是乎 我就想到王宝强一脸懵逼的表情。

进程和线程的定义及区别(进程和线程的区别)(1)

详细教程资料关注 评论;资料;两个字可以免费领取 资料内容包括:C/C ,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式 等。。

进程和线程的定义及区别(进程和线程的区别)(2)

进程和线程进程

一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。

进程和线程的定义及区别(进程和线程的区别)(3)

线程

进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

Java 程序天生就是多线程程序,我们可以通过 JMX 来看一下一个普通的 Java 程序有哪些线程,代码如下。

public class MultiThread { public static void main(String[] args) { // 获取 Java 线程管理 MXBean ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); // 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息 ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); // 遍历线程信息,仅打印线程 ID 和线程名称信息 for (ThreadInfo threadInfo : threadInfos) { System.out.println("[" threadInfo.getThreadId() "] " threadInfo.getThreadName()); } } }

述程序输出如下(输出内容可能不同,不用太纠结下面每个线程的作用,只用知道 main 线程执行 main 方法即可)

[6] Monitor Ctrl-Break //监听线程转储或“线程堆栈跟踪”的线程 [5] Attach Listener //负责接收到外部的命令,而对该命令进行执行的并且把结果返回给发送者 [4] Signal Dispatcher // 分发处理给 JVM 信号的线程 [3] finalizer //在垃圾收集前,调用对象 finalize 方法的线程 [2] Reference Handler //用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收的线程 [1] main //main 线程,程序入口

从上面的输出内容可以看出:一个 Java 程序的运行是 main 线程和多个其他线程同时运行。线程与进程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

(2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;

(3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;

(4)处理机分配给线程,即真正在处理机上运行的是线程;

(5)线程是进程的一个执行单元,也是进程内的可调用实体。

进程和线程的定义及区别(进程和线程的区别)(4)

进程与线程的区别总结

1)线程共享内存空间;进程的内存是独立的;

(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;

(3)创建新进程很简单;创建新进程需要对其父进程进行一个克隆;

(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;

(5)改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。

(6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位

(7)并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行

(8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源

(9)系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。

根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。

进程和线程的定义及区别(进程和线程的区别)(5)

进程和线程的定义及区别(进程和线程的区别)(6)

进程和线程的定义及区别(进程和线程的区别)(7)

进程和线程的定义及区别(进程和线程的区别)(8)

进程和线程的定义及区别(进程和线程的区别)(9)

详细教程资料关注 评论;资料;两个字可以免费领取 资料内容包括:C/C ,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式 等。。总结为什么要学多线程

多线程执行效率高; 多进程耗资源,安全。

应付面试 :多线程几乎是面试中必问的题,所以掌握一定的基础知识是必须的。

了解并发编程:实际工作中很少写多线程的代码,这部分代码一般都被人封装起来了,在业务中使用多线程的机会也不是很多(看具体项目),虽然代码中很少会自己去创建线程,但是实际环境中每行代码却都是并行执行的,同一时刻大量请求同一个接口,并发可能会产生一

进程和线程的定义及区别(进程和线程的区别)(10)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页