JavaEE - 程序&进程的区别、进程&线程的区别,线程之间到底有没有父子关系?

发布于:2022-07-26 ⋅ 阅读:(343) ⋅ 点赞:(0)

一、程序&进程

程序是静态的可执行文件 (exe) 。它是计算机指令的集合,以文件的形式存储在磁盘上;

进程是动态运行的一个可执行文件。躺在我们电脑桌面上的程序就是一个个的exe,当我们双击某个程序执行它的时候,该程序就运行起来,运行起来的程序就叫做一个进程。

“ 除了我们自己安装的应用程序,电脑也会自带一些程序。开机时,这些电脑自带的一些程序会自动运行起来,于是我们看到了电脑的运转。打开电脑任务管理器,可以看到很多运行中的程序,就是一个个的进程。”

? 程序->进程 其实是 静态->动态的过程

一个静态的exe是保存在磁盘中的。双击运行它时,操作系统将它加载到内存中,继而放入寄存器,最后由CPU执行该程序。程序动态执行,一个进程就此形成。 

 

二、进程&线程

1. 一个线程被包含在进程中,一个进程可以有一个或多个线程。

线程是进程的一部分。当一个进程被终止了,其内部的所有线程都会被终止。

异常状况下

不同的进程之间不会互相影响,一个线程挂掉可能影响其他线程甚至影响到进程

进程之间不会互相影响:如果一个进程挂掉,不会影响另外一个进程的运行

线程之间可能会互相影响:如果线程和线程之间抢占资源而抛出异常挂掉了,就可能会影响其他线程导致其他线程挂掉。

??‍♀️ 举个例子:

qq卡了,微信不会卡;

qq进程中的下载任务卡掉了,就可能进行不了别的操作了。

正常状况下

不同的进程之间不会互相影响,不同的线程之间也不会互相影响

线程之间并行执行任务。假设A、B两个线程,A执行A的任务走掉,B并不会也跟着它走,而是也执行自己的任务。两者为自己独立工作,在这种情况下互不影响。

??‍♀️ 再举个例子:

边qq聊天边听网易云音乐,关闭网易云不影响我继续聊天;

qq边聊天,边下载文件。聊天结束,文件下载不会跟着结束除非它自己结束。

2. 进程(Process)是系统进行资源分配和调度的基本单位线程是任务调度和执行的基本单位。​​​​​​​

进程关注的是内存中的资源,资源的保护和管理由整个进程去完成。

线程关注的是任务,主抓中央处理器执行代码的过程。

每个线程中也有PCB,一个进程就可能有多个PCB。操作系统内核部分线程还是进程,只认PCB。只不过有些PCB之间有关联关系(共有同一组虚拟地址空间和文件描述符)。这也是为什么同一个进程的不同线程可以在不同的CPU上,因为操作系统以线程为调度执行任务。

 

3.  不同的进程之间有自己的虚拟地址空间,不共享资源一个进程多个线程之间,共用同一份系统资源,即新创建的线程不用再重新分配资源。

线程也叫做轻量级进程。也是因为线程之间共享同一份系统资源,节省了创建线程分配资源的时间,线程的创建和销毁就比较迅速。

 

4. 进程有父进程和子进程关系,但是线程没有父子关系。

子进程继承父进程的相关属性,存在”继承“父子关系;

线程与线程大家都归属于一个线程组, 同一个线程组的进程ID都相等也各有各的线程ID。各个线程之间的地位平等。

为什么会出现父子进程的说法?

① 说法一:“新建进程在主线程中创建,所以把在主线程中创建的线程叫做子进程”

     不正确。

     大部分的代码中,确实新线程在主线程中创建的多。但事实上,新线程也可以在别的新         线程中创建 。比如,在新线程a中创建新线程b,难道a是b的父线程?这种说法并不科学       创建出来的线程之间没有父子关系,都是平等的。

② 说法二:“一个线程卡死会影响另一个线程”

     说法正确但是片面。

     父进程结束,子进程也会随之退出;

     主线程结束了,其他线程也不会被一并带走,该执行就会执行。

    (注意区分第一提到不同的进程/线程,在正常状况/异常状况的影响情况。)