目录
哥几个来学进程与线程啦~~
🌴1.认识进程
🍎1.1进程是什么?
官方的定义:进程是系统资源分配的最小单位(这句话非常重要!!所以我放在第一句啦~~)。进程是一个具有独立功能的程序在一个数据集合上一次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。
通俗来讲就是电脑里运行的一个个程序:
我通过可执行文件(后缀为.exe)来打开进程。
进程是动态的,是不断被内存加载的。
而可执行文件则是静态的,它一般存储在硬盘中。
我们通过打开可执行文件来将文件中的相关信息加载到内存中,并运行其中的代码,这样就形成了一个进程。
🍅1.2如何管理进程?
PCB(Process Control Block):
在我们的计算机内部,将进程抽象为了一组有关联的、互为一体的数据PCB,包含了:
🍕1.pid:每个进程的唯一标识符。
🍔2.内存指针:记录了当前进程使用的是哪一块内存。内存指针式操作系统加载进程的必要数据,内存指针操作系统指明那一部分是指令,那一部分是数据。
🍟3.文件描述符:记录了进程打开了哪些文件,多个文件描述符会放在一个类似顺序表的结构中,称为文件描述表。
🌭4.进程的调度信息:
a.进程状态:新建状态(NEW),就绪状态,运行状态,阻塞状态,销毁状态
b.进程的优先级:决定了进程的执行顺序,进程有6个优先级。
c.进程的上下文:保存当前进程的状态,以便下一次执行。
d.进程的记账信息:统计了每个进程再CPU上执行了多久,可以作为调度的重要参考。
操作系统往往使用双向链表这种数据结构来存储PCB
PCB的作用:
PCB可以被操作系统中的多个模块读写或者修改,如被调度程序,资源分配程序,中断处理程序以及监督分析程序等读或者修改。所以说PCB是操作系统中最重要的记录型数据结构,操作系统是根据PCB来对并发执行的进程进行控制和管理的,作用如下:
🍕1.作为独立运行的基本单位
🍔2.能实现间断性运行方式
🍟3.提供线程管理所需要的信息
🌭4.提供进程调度所需要的信息
🍿5.实现与其他进程的同步与通信
摘自大佬作品:(14条消息) 什么是进程?_月半的人的博客-CSDN博客
🍓1.3进程的虚拟空间地址
操作系统对内存资源的分配,采取的是空间分配,即不同进程使用不同的内存区域,使进程之间不会相互影响。
每个进程都需要占用一部分内存,也就有了内存地址,如果每个进程直接访问内存空间,这时候指针指向的位置是否合法很难取保证,很容易让指针访问到非法的内存空间,那么就有可能进而导致进程的崩溃,如下图:
改进方案:
为了确保操作系统能够给进程带来稳定的运行环境,操作系统引入了“进程的虚拟地址”,即每个进程只能访问到自己的地址空间,相互之间不会有影响,哪怕指针指向错误,系统也会及时地报错。
如图:
页表,也叫MMU,是CPU上的硬件设备,它可以将进程的虚拟地址通过一系列操作转化为电脑的物理地址。
通过这种方式,进程自身感知不到物理地址是什么,使一个进程无法直接影响另一个进程的内存内容,保证了进程的独立性。也可以降低进程崩溃的可能性。
虚拟地址带来的问题:
每个进程都有一个虚拟地址,如果多个虚拟地址空间加起来大于内存了怎么办?
在极端情况下,多个进程的虚拟空间的占用已经超过了内存,这种情况属于bug,就需要进行代码优化或者扩容了。
优化简单思路: 可以考虑分布式的方式分更多组的服务器,每组服务器存储一部分.
🍒1.4进程间通信
什么是进程间通信?
进程间通信,就是在确保隔离性的前提下,找一个公共区域,让两个进程或多个进程之间通过这块区域来进行通信。
为什么要进程间通信?
在现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运 而生。
🍕数据传输:一个进程需要把它的数据发送给另一个进程。
🍔资源共享:多个进程之间共享同样的资源。
🍟通知时间:一个进程需要向另一个或另一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
🌭进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程所有的陷入和异常,并能够及时知道它的状态改变。
摘自大佬作品:(15条消息) Linux-进程间通信_linux进程间通信_The August的博客-CSDN博客
进程间通信的方法:
目前,主流操作系统提供的进程通信机制有如下: 1. 管道 2. 共享内存 3. 文件 4. 网络 5. 信号量 6. 信号。
🌹1.5并行与并发:
并行:
同一时刻,三个核心同时执行两个不同的进程,那么这两个进程就是并行的。
并发:
在一个核心中,先执行进程1,再执行进程2,执行一会后再执行进程3,再再执行进程1.......这样,进程1、进程2、进程3就是并发执行的。只要它跳转得足够快我们人脑就发现不了~~
我们要清楚一点,一个CPU在一瞬间只能执行一个任务,那么为什么我们在平时使用电脑、手机时可以一边听音乐一边打游戏呢?原因就是我们的CPU处理能力太快啦~~它的运行频率远远超过了我们人脑反应的速度。
它能够轮转多个任务的方式就是利用时间片轮转调度:
每一个进程会被操作系统分配一个时间片,即每次被CPU选中来执行当前进程所用的时间。时间一到,无论进程运行是否结束,操作系统都会强制将CPU这个资源转移到另一个进程执行。
🌳2.线程
🍧2.1线程是什么?
线程是内存资源调度的最小单位,线程被设计成进程的一个执行路径,同一个进程的里的线程共享进程的资源。也就是说,一个进程可以并发执行多个线程。只有在进程启动,第一个线程创建,才会申请系统资源,之后创建线程就不会再申请资源了,因此,创建和销毁线程的效率就提高了。
🍦2.2为什么要有线程(线程的优点)?
进程的创建、销毁与切换存在着较大的时空开销,因此人们急需一种轻型的进程技术来减少开销。线程可以看作是轻量级的进程,它:
🍕a.创建线程比创建进程更快(创建一个新的线程的代价比创建一个新的进程的代价要小得多)
🍔b.销毁线程比销毁进程更快
🍟c.调度线程比调度进程更快(与进程相比,线程之间切换需要操作系统做的工作要少得多)
🌭d.线程占用的资源比进程少得多
🍿e.能充分利用多处理器的可并行数量
🥓f.在等待慢速I/O操作结束的同时,程序可执行其他计算任务
🧇g.计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
🥞h.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作
🌲3.进程与线程的区别
🍕a.根本区别:进程是操作系统进行资源分配的最小单位,线程是操作系统资源调度的最小单位。
🍔b.从属关系不同:进程中包含了线程,线程是属于进程的。
🍟c.开销不同:进程的创建、销毁和切换的开销都远大于线程。
🌭d.拥有的资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。线程只独享指令流执行的必要资源,如寄存器和栈。
🍿e.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常,那么就会影响到其所在的进程和子进程。
🥓f.CPU利用率不同:进程的CPU利用率比较低,因为上下文切换开销大,而线程的CPU利用率较高,上下文切换速度快。
🧇g.操作者不一样:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
🥞h.相互通信不同:进程之间通信需要通过内核态,而由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。
以上就是进程与线程的全部内容啦,后续还有多线程初阶和进阶等着大家~~