一、程序&进程
程序是静态的可执行文件 (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的父线程?这种说法并不科学 创建出来的线程之间没有父子关系,都是平等的。
② 说法二:“一个线程卡死会影响另一个线程”
说法正确但是片面。
父进程结束,子进程也会随之退出;
主线程结束了,其他线程也不会被一并带走,该执行就会执行。
(注意区分第一提到不同的进程/线程,在正常状况/异常状况的影响情况。)