进程与线程

一,什么是进程

进程是指正在运行的计算机程序。每个进程都有自己的内存空间和系统资源,它与其他进程相互隔离,彼此独立运行。进程可以包含一系列指令和数据,它们被操作系统分配给处理器进行执行。进程可以是操作系统自身的一部分,也可以是由用户创建的应用程序。一个计算机系统可以同时运行多个进程。

二,如何管理进程

  • 先描述:使用 PCB 结构表示进程的各种属性
  • 后组织:使用双向链表,将这些 PCB 结构串起来

什么是所谓的 PCB 结构?

进程与线程_第1张图片

  • 内存指针:每个进程在运行时,都会分配一定的内存空间,我们需要知道分配的内存空间在哪,以及每个部分是干什么的,有一组指针来进行区分。
  • 文件描述符:一个进程涉及到硬盘操作,就需要按照文件的方式来操作,当前进程关联那些文件,操作哪些文件,都是通过文件描述符。
  • 状态:运行态,就绪态,阻塞态。
  • 优先级:就是是否需要计算机优先处理,就相当于人做事,我们要分清事情的轻重缓急,优先处理比较重要和急迫的事情。
  • 上下文:进程从 cpu 离开之前,需要进行 "存档" ,把当前 cpu 中的各种寄存器的状态都记录到内存中,等到下次该进程继续运行的时候 "读档",再把保存在内存中的值返回给 cpu ,cpu 就会在上次停止的地方继续往后运行。类似于游戏中的 "存档","读档" 操作。
  • 记账信息:通过优先级机制,对不同进程分配不同权重的资源,就可能会出现将所有资源分配给某一个进程的极端情况,而记账信息就是用来记录当前进程持有的 cpu 的情况(在 cpu 中执行了多久),作为操作系统调度进程的依据。
  • 寄存器:存在于cpu中,有不同的作用,有的寄存器是用来保存当前执行到那个指令,也称为程序计数器;有点寄存器是用来维护栈的;还有的是用来保存中间计算结果的。

三,虚拟地址空间

在早期的操作系统中,程序运行时分配的内存就是 "物理内存",这样就会容易出现 C语言中的野指针问题,进而导致其他进程的崩溃,为了避免这一问题,操作系统引入了"虚拟地址空间"概念,不在直接分配物理内存,而是分配虚拟的内存空间,再通过操作系统将虚拟内存转换成物理内存,如下图:

进程与线程_第2张图片

 这个时候如果A进程要操作某个内存中的数据,就需要把操作的虚拟地址传给操作系统,操作系统再把虚拟地址翻译成物理地址,在该过程中操作系统就可以进行校验检查,1.检查所给的虚拟地址是否可以正确的翻译,2.检查所给的虚拟地址是否非法,越界。如果出现该情况,操作系统就会及时对当前进程进行处理,不会影响其他进程的运行。

操作系统通过上述方式将进程与进程之间隔离开了,如果某个需求中,需要多个进程相互协作,就不容易操作了,这时我们就引入了新的机制来实现 进程 之间的通信:1.通过文件 2.通过网络(socket),篇幅有限,就不深入讲了。

四,线程

我们常常使用电脑打开多个程序运行,在我们的眼睛看来,这些程序是 "同时运行" 的,但真的是这样吗?其实是不一定的,因为我们既可以通过多个程序在多个cpu上运行("并行")来达到程序同时运行的目的,也可以通过快速切换在同一个cpu运行不同程序("并发")来实现 "看上去" 像是程序同时运行的假象。也就是说只要切换的够快,我们眼睛是捕捉不到的,又因为使用哪种方式实现并发编程是操作系统决定的,我们程序员基本无法定义,所以这两种方式我们就统称为 "并发编程"

其实,我们上面说的多个进程的概念也是为了实现并发编程,以此来适应多核CPU时代,但是它有一个缺点 —— 进程太重量,效率不高。体现在创建,销毁,调度一个进程消耗的时间比较多,在具体一点就是申请资源比较费时间。

为了解决上述问题,我们就引入了 "线程" (Thread),又叫做 "轻量级进程"。线程不能单独存在,他要依附于进程(进程包含线程),进程需要包含至少一个线程,每个线程都可以单独执行一些代码,当存在多个线程时,就达到了 "并发编程" 的效果。

实际上我们每一个线程也会有各自的属性,比如 状态,优先级,上下文,记账信息.....,但是也有一些属性是共用的(这里指的是同一个进程中的线程),比如:PID,内存指针,文件描述符,这也意味着线程也可以单独去CPU上调度执行,而线程之所以更加 "轻量" 是因为 同一个进程的多个线程之间,共用同一份内存空间和文件资源,也就是说在同一个进程中,除了第一个线程外,其他线程不需要去申请资源,省去了分配资源的开销,这就大大提高了效率。虽然线程可以提高效率,但是一个进程中存在的线程还是有上限的(提高的效率会饱和),毕竟调度也是有开销的。

五,进程和线程的区别

  1. 进程包含线程,一个进程中可以有一个或多个线程
  2. 进程和线程都可以实现并发编程,但是线程比进程更加高效,轻量
  3. 同一个进程中的线程共用一份内存和资源
  4. 进程和进程之间是相互独立的,两者不会相互影响,而同一个进程的线程与线程之间,可能会相互影响(线程安全问题 + 线程异常)
  5. 进程是资源分配的基本单位,线城是执行调度的基本单位。

你可能感兴趣的:(服务器,linux,运维)