ITPub博客

首页 > 数据库 > 数据库开发技术 > python并发编程(4)-操作系统中的进程和线程梳理

python并发编程(4)-操作系统中的进程和线程梳理

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-04-01 18:10:25 0 删除 编辑

看视频总结,纯手打一下为了加深记忆:

PS:下面的知识点总结大部分来自《王道考研》操作系统课程的笔记!!!

进程基本知识了解:

  • 内核:负责管理各个任务,为每个任务分配CPU时间,并负责任务之间通讯。分为不可剥夺型内核和可剥夺型内核;

  • 内核空间 :操作系统(Operating System)是管理计算机硬件与软件资源的程序,操作系统内核驻留在受保护的内核空间。

  • 用户空间:应用是运行在操作系统上运行的程序,工作在用户空间。

  • 隔离:出于安全性和稳定性的考虑,用户空间的程序是无法直接执行内核代码(例如:I/O 读写、创建新进程/线程)的,也无法直接的访问内核数据,必须通过系统调用。

  • 线程和CPU: 线程是和CPU核绑定的,而进程会在核中间进行切换.

  • 程序执行:程序执行前需先放到内存中才能被CPU处理,因此内存主要作用是缓和CPU与硬盘之间的速度矛盾

  • 原子性:是指某种任务执行,要么不执行,要么执行到底,中间不可中断。

  • 原语:指由若干个指令组成,用来实现某个特定的操作的一个过程。

    • 原语的执行具有原子性
    • 原语常驻内存,且在内核态下执行
  • 进程:进程是分配系统资源的单位(包括内存地址空间),每个进程拥有的内存地址空间相互独立。

一、进程的组成

首先,程序是一系列指令的系列的集合体

1.定义

进程= PCB(一种数据结果,对应叫做进程控制块)+ 程序段+数据段

  • 程序段:是程序代码的一些了指令集,存放要执行的代码

  • 数据段:程序运行时使用,产生的运算数据(如:全局变量,局部变量,宏定义的常量等)

  • PCB:操作系统通过PCB来管理进程,它包含的是操作系统对进程管理所需的各自信息的一个数据结构体。

PS:

  • PCB的作用是把程序变成可并发执行的进程。
  • PCB是进程存在的唯一标记
  • PCB是需要被系统频繁调用访问,因此它里面信息必须全部或部分进行内存常驻。

PCB的组成

典型的定义:

  • 进程是程序的一次执行
  • 进程是一个程序的和它数再处理器顺序执行时所发送的活动
  • 进程是具有独立功能的程序再一个数据集合上运行的过程,它是系统进行资源分配的和调度的一个独立单位。

2.特征

  • 动态性:进程是程序的一次执行的过程,进程有自己的生命周期,可以动态的创建和消亡和暂停等
  • 并发性:多程序可以同是存在内存中,且可以同一时间段内同时执行。并发是引入进程的目的。
  • 独立性:进程实体是一个能够独立运行,独立分配资源,独立接手调度的基本单位
  • 异步性:进程按各自独立的不可预知的速度向前执行。
  • 结构性:PCB(一种数据结果,对应叫做进程控制块)+ 程序段+数据段

二、进程的组织(PCB的管理)

在操作系统的中多进程之间的管理交互问题。

  • 1.链接方式:
    • 按照进程的状态把PCB氛围多个队列
    • 操作系统持有执行各个队列的指针
  • 2.索引方式:
    • 根据进程状态的不同,建立不同状态的下的索引表
    • 操作系统持有执行各个索引表的指针

三、进程控制

进程控制

  • 是进程管理基本功能:包括创建,停止,进行状态切换等管理。
  • 进程控制是操作系统的内核通过原语来实现。

CPU执行状态:内核态和用户态

  • 内核态:具有较高特权,能执行一切的指令,访问所有寄存器和存储区
  • 用户态:有较低的特权执行状态,只能执行规定的指令,访问指定好的寄存器和存储区。

进程控制主要是控制进程状态的切换!

四、进程五种状态

进程是程序的一次执行,在执行的过程中,有的时候进程正在被CPU处理,有的时候需要等待CPU处理完成后才可以进行获取CPU执行。所以为方便管理,操作系统给进程划分了五种状态:

  • 创建状态: 初始化PCB,分配内存空间等工作
  • 终止状态: 进程运行结束,需撤销进程,操作系统对撤销了的进行进行相关的资源回收和撤销PCB等工作。
  • 三种基本状态:

    PS:(进程已经拥有了除CPU之外所有的需要资源)

    PS:

    PS:比如:

    • 等待操作系统分配打印机,等待都磁盘操作结果。
    • 为提高CPU利用率,需要把进程需要资源分配齐全才分配给它CPU进行服务
    • 阻塞状态:又叫等待态,因等待某一个时间而暂时不能运行、
    • 单核处理器的环境下,每个时刻最多只有一个进程处于运行态。
    • 多核环境下看一天多个进程处于运行态(每个进程分布再不同的核上运行)
    • 运行状态:占有CPU,并在CPU上运行
    • 就绪状态:已具备运行条件,但由于没有空闲CPU,暂时不能运行

五、进程状态切换

引发进程切换的事件

  • 当前进程事件片到
  • 有更高优先级的进程到达
  • 当前仅主动阻塞
  • 当前进程终止

状态切换说明

  • 阻塞态----》就绪态 :不是进程自身能控制的,是处于一种被动的行为。
  • 运行态----》阻塞态:是进程自身做的出一个行为属于:主动行为
  • 不能直接由 阻塞态----》运行态(因为阻塞态是进程主动请求的,而如果进程还没有运行就无法发出运行的请求)
  • 不能直接由 就绪态----》阻塞态(因为阻塞态是进程主动请求的,而如果进程还没有运行就无法发出运行的请求) 所以如果进程不处于运行态,则无法进行相关主动切换。

六、进程控制原语

进程控制会导致进程状态的切换:

无论哪个原语无非需要做的三类事情是:

  • 1:更新PCB中的信息,(如修改进程状态标志,将运行环境保持到PCB,从PCB恢复到运行环境)
    • a)所有的进程控制原语都会去修改紧张的状态标记
    • b)剥夺当前运行进程的CPU使用权比如需要保持其运行环境
    • c)某进程开始运行前必然要恢复其运行环境
  • 2:将PCB插入和是的队列
  • 3:分配、回收资源

进程创建原语

进程撤销原语

  • 进程终止原语
    • 进程正常结束
    • 进程异常结束
    • 外界干预
    • 从PCB集合中找到终止进程的PCB
    • 若进程处于运行,则立即剥夺CPU使用权,把CPU分配给其他进程
    • 终止所有进程
    • 将改进程所有资源归还给父进程或操作系统
    • 删除PCB
    • 终止/撤销原语
    • 引起进程终止事件

进程阻塞和唤醒:

- 进程阻塞(运行态--->阻塞态)
  • 引起进程的阻塞的事件:

    • 需要等待系统分配某种资源
    • 需要等待相互合作的其他进程完成工作
  • 进程的阻塞是通过阻塞原语来完成:

    • 1)找到要阻塞的进程的对应PCB
    • 2)保护进程运行现场,把PCB状态信息设置为阻塞态,暂停进程运行
    • 3)把PCB插入相应【事件等待】队列
    • 阻塞原语处理具体流程:
- 进程唤醒(阻塞态--->就绪态)
  • 引起进程的唤醒的事件:

    • 等待的事件发生(因何事阻塞,就由何事来唤醒)
  • 进程的唤醒是通过唤醒原语来完成:

    • 1)在【事件等待】队列中找到对应的PCB
    • 2)把PCB从【事件等待】队列移除,修改PCB的进行为就绪态
    • 3)把PCB插入【就绪队列】等待被调度
    • 唤醒原语处理具体流程:

七、进程同步和进程互斥

7.1同步定义:

因为进程存在异步的特性:异步性是指各并发执行的进程以各自的独立的不可预知的速度向前推进。但是如果存在某些制约限制条件的情况,相关的进程之间的调用结果需要遵循定义的次序,此时就需要做相关的进程同步。

PS:同步也叫做直接制约关系,它是指某为完成某种任务而建立的两个多或多个进程,这些进程的存在一定依赖关系,需要再某些位置上协调他们的工作次序而产生的制约关系。

7.2互斥定义:

因为我们的进程有并发性,而‘并发’需要‘共享’的存在,各个并发执行的程序必不可免的需要进行一系统资源的共享(内存,打印机,摄像头等)

资源共享方式:

  • 互斥共享:系统中某些资源,虽然可以提供给多个进程使用,但是同一个时间内置允许某个进程访问该资源,必须进程互斥(只能一个人进行视频聊天),另一个想访问资源的进程必须等待,等占用进程访问结束后,资源释放后才可以进行资源的使用。

  • 同时共享:系统中的某些资源,允许一个时间段内由多个进程‘同时’对他们进行访问。(浏览器播放歌曲,QQ音乐播放歌曲,两个都是播放歌曲)

临界资源阶段划分:

对于互斥共享中的资源我们通常也叫做临界资源,对临界资源的访问的在逻辑上的划分:

  • 进入区

  • 负责检测是否可以进入临界区,如果可以进入免责赢设置正在访问临界的资源的标志(可以理解为上锁),便于阻止其他进程同事进入临界区。

  • 临界区:访问临界资源的代码

  • 退出区:负责接触正在访问临界资源的标记(可以理解为解锁)

  • 剩余区:做其他的处理

临界区是进程中访问临界资源的代码段

进入区和退出区:负责实现互斥的代码段

八、线程

目的:

线程引入:也是增加并发的任务执行。

进程是程序一个次执行,如果一个进程内同时需要做其他更多的事情,则无法完成。所以在进程的基础之上引入的线程。

定义:

  • 线程是程序执行流程的最小单位。
  • 是操作系统能够进行运算调度的最小单位。
  • 是也刚基本的CPU执行掉地的基本单元
  • 它被包含在进程之中,是进程中的实际运作单位
  • 一条线程指的是进程中一个单一顺序的控制流
  • 一个进程中可以并发多个线程,每条线程并行执行不同的任务

引入线程后,进程只作为除CPU之外的系统资源分配的单元(如打印机,内存地址空等都是分配给进程的)

(进程是资源分配的基本单位,线程是调度的基本单位)

线程一些属性

  • 线程是CPU调度的基本单位
  • 线程是和CPU核绑定的,多CPU多核中,各个线程可以占用不同的CPU。(线程可以分配到不同的CPU上执行)
  • 线程都有一个线程ID,和线程控制块(TCB)
  • 线程也和进程一样,有状态转换:如小就绪、阻塞、运行等
  • 线程几乎不拥有系统资源
  • 同一个进程的不同线程共享进程资源,因共享地址空间,同一个进程中的线程间通信不需要系统干预
  • 同一进程中的线程的切换,不会引发进程状态切换。
  • 但是不同的进程中的线程切换,会引起进程切换。(跨进程之前的跨线程通信)

和进程的关系

  • 同一进程中的多条线程将共享该进程中的全部系统资源(如虚拟地址空间,文件描述符和信号处理)
  • 但同一进程中的多个线程有:---》各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)
  • 一个进程可以有很多线程,每条线程并行执行不同的任务。

引入线程好处

  • 在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计很明显的可以提高了程序的执行吞吐率。
  • 在单CPU单核里使用多线程技术,可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开执行,编写专门的workhorse线程执行密集计算,也可以提高了程序的执行效率。
  • 传统进程间并发,需要切换仅的运行环境,系统开销大。但统一进程内的线程的切换,则不需要切换进程上下文环境,系统开销小。

线程分类(线程的实现方式)

在多线程操作系统中,各个系统的实现方式并不相同,所以不同的系统对于多线程应用也有所不同。

在有的系统中实现了用户级线程,有的系统中实现了内核级线程(轻量级进程)。

  • 用户级线程

    缺点:

    • 不需要内核干预,少了进出内核态开销,但是不能很好利用好多核CPU。
    • 同一进程中只能同一个时刻存在一个线程运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。
    • 一个单独的进程内部,没有时钟中断,所以不可能用轮转调度的方式调度线程
    • 资源调度按照进程进行,多个处理机CPU下,同一个进程中的线程只能在同一个处理机CPU下分时复用
    • 由应用程序的通通过线程库来实现的相关线程创建和使用和切换。
    • 用户线程切换可以在用户态下完成,无需系统干预
    • 用户线程对操作系统来说是透明不存在的,对用户程序员来说是可以看得到的。

上图(用户级线程是一种”多对一”的线程映射):

上图说明的是一个多对1的一种用户模型和内核线程的之间的问题描述。

  • 1)库调度器从进程的多个线程中选择一个线程

  • 2)然后该线程和该进程允许的一个内核线程关联起来。

  • 3)内核线程将被操作系统调度器指派到处理器内核。

  • 内核级线程(windows系统下的线程)

    缺点:进入到了内核态,切换系统开销大。

    • 由操作系统内核完成
    • 相关调度和切换也由内核负责管理
    • 切换的调度处需要运行在核心态下
    • 都草最系统内核是不透明的,可以看得到的线程实体
    • 可以很好的利用smp,意思就是很好的利用多核cpu
    • 当有多个CPU或多核时,一个进程的多个线程可以同时执行。
    • 内核线程驻留在内核空间,它们是内核对象
    • 这些线程可以在全系统内进行资源的竞争

如上图所示,即内核级线程的实现方式, 每个用户线程都直接与一个内核线程相关联.

PS:内核线程才是CPU调度的分配的基本单位

PS:内核线程才是CPU调度的分配的基本单位

PS:内核线程才是CPU调度的分配的基本单位

多线程模型

混合实现:用户级与内核级的多路复用

用户级与内核级的多路复用:内核统一调度内核线程,每个内核线程对应n个用户线程(多堆垛的线程模式)

补充-------任务管理器可以看到信息

开启更多列选项

进程下面的子线程:

进程下面运行的线程:

或从资源管理器查看线程数:

查看CPU核数和个数

查看进程分配到那个核上运行

参考资料:

多线程模型 :https://kernel.blog.csdn.net/article/details/51892437

个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111765