Day3.进程与线程的基本概念

针对进程管理, 查阅了手头的4本书的目录,大致扫了一下,汇总了如下一些内容,主要集中在进程管理的大方向,后续还有设计进程调度等其他内容待本章节学习完之后再做规整。

从几本书的目录来看大部分的内容都是差不多的,但是目录结构确实千差万别的,由于鄙人对这块内容不甚熟悉,所以也不知道归纳的对不对。最终拍脑袋整合了一下,形成了第二张图,按照自己定义的顺序开展深度学习,时间期限:7天完成。

图1

图2

基本概念

进程和线程在操作系统内的引入

在早期,计算机的操作系统只能运行一个程序,为了提高CPU利用率,设计了在一台计算机中加载多个程序到内存中,并让这些程序并发运行的方案。每个加载到内存的程序就叫做进程,操作系统管理者多个进程并发执行,这是一个重要的抽象,让进程认为自己是独占了CPU。

进一步理解,程序是第一个静态的二进制文件,而操作系统通过调用方式将程序执行起来,执行起来的程序就叫做进程,由于程序的执行需要系统资源开销,因此在进程中被赋予了系统资源。一个进程包含了可执行的代码,还包含进程的活动信息和数据,如存放返回值的用户栈,存放进程的数据款,切换内核进程的内核栈,动态分配内存的堆(heap)等等,在程序运行的过程中,进程会独占CPU。

在操作系统的多个进程并发执行过程中,本质上是通过CPU的时间片机制将1秒钟的CPU处理时间进行切片,通过调度算法分配给不同的进程去执行,期间涉及到一个名字,就叫做上下文切换(Context Switching),即指在并发执行情况下,进程A执行了n个CPU时间片以后,需要将进程A状态进行保存,随后换进程B消费m个CPU时间片,其后进程B将自己的执行状态保存后,再切换至进程A恢复到之前保存的状态,继续执行进程A的步骤。两个进程之间的切换就叫做上下文切换。

综上所述,在上下文切换中会涉及到两个进程之间大量的数据存储交互,从而对操作系统会产生一定的性能负载,当上下文切换过多时会产生CPU的性能瓶颈,即大部分的CPU时间片都被用于处理进程间的上下文切换。

因此,自然而然的引出了线程的概念,进程的创建、销毁与切换存在着较大的开销,因此线程被设计成进程的一个执行路径,同一个进程中的线程共享进程的资源,因此系统对线程的调度所需的成本远远小于进程。

进程和线程的概念及特点

进程是操作系统中一段执行中的程序(进程=程序+执行),包括程序计数器、寄存器和程序变量的当前值。有如下两个特点:

  • 进程依赖于程序执行而产生,进程是动态的,程序是静态的
  • 每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响

进程是操作系统在计算机资源层面提供的并发抽象概念。线程是操作系统在进程内部提供的并发抽象概念。

线程是进程的一个组成部分,在一个进程中,如果有一个线程由于等待输入等原因发生阻塞,那么只有这个线程会发生阻塞,不依赖该输入的线程可以机继续运行。在并发机制上,当前的多核CPU架构下,一个进程中的多个线程可以运行在不同CPU核上的同一个时间片,提升了应用程序的整体并发能力。

在这块,有一个最典型的产品可以说道一下,就是redis,早期在2018年接触redis的时候特地研究过。是一个比较典型的单进程少量线程的产品。那时碰到过redis的性能问题,因此特地对redis的读写和持久化做了研究。在redis的读写上,是一个单线程的方式实现的,也就是说所有的redis的查询都是串行执行的,并不是概念中传统数据库的并发查询。但是由于redis是内存数据库,因此速度比较快,让人察觉不到是串行执行的,但是当用户在执行类似flushdb或者hash查询之类耗时比较长的操作时,问题就会暴露出来,你会发现后续的执行会夯住,直到前一条指令执行完毕以后才会继续执行后面的操作。这个就能充分证明redis在「接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端」这个过程中是单线程执行的,并不能通过增加线程数量来提升并发效率(因为多并发会产生锁机制,redis靠的就是单线程,没有锁,所以性能高)

话题再扯回来,对比进程和线程的关系,主要有如下几点:

  • 传统操作系统中,进程是管理资源的基本单位,线程是调度的基本单位。进程拥有独立的资源空间(如进程地址空间),而线程则共享进程的资源空间。
  • 从Linux内核实现的角度看,并没有使用额外的调度算法或定义特别的数据结构来标识线程,线程和进程都使用相同的进程描述符数据结构。
  • 进程通过fork()函数创建,线程通过clone()函数创建,线程使用clone()函数时会定义哪些资源和父进程共享,哪些资源为线程独享。
  • Linux内核中,线程对应一个进程描述符,而进程对应一个(单线程的进程)或一组进程描述符(多线程的进程)
  • 一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
  • 一个进程崩溃后,在保护模式下其他进程不会被影响,但是一个线程崩溃可能导致整个进程被操作系统杀掉,所以多进程要比多线程健壮。
  • 每个进程都有独立的地址空间,进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值