44.并发编程理论

1. 程序, 进程, 线程

1.1 程序
程序: 是一个静态的概念, 一般对应于操作系统中的一个可执行文件.

可执行文件一组计算机能识别和执行的指令编写的一堆代码文件通过编译得到的.
启动可执行文件, 则将程序加载到内存中, 开始执行该程序, 于是产生了进程.
1.2 进程
进程(Process): 是一个动态的概念, 是操作系统对一个正在运行的程序从创建到销毁的过程.
执行可执行文件, 将信息加载到内存中,分配一些资源,并且执行程序中所有指令.

进程是操作系统资源分配的最小单元, 每一个进程拥独自的资源, 有⾃⼰的堆、栈、虚存空间(页表)、文件描述符等信息.

同一个程序执行多次, 是多个进程. 
1.3 线程
线程: 是进程中的⼀个执⾏单元, 负责当前进程中程序的执⾏,
⼀个进程中可以有多个线程, 线程之间共用进程的资源.


线程的优势
    1·  创建线程比创建进程更快 
    2·  销毁线程比销毁进程更快
    3·  调度线程比调度进程更快

1.4 进程与线程的对比

* 1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元.

* 2.从属关系不同:进程中包含了线程, 线程属于进程.

* 3.开销不同:进程的创建、销毁和切换的开销都远大于线程.

* 4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源.

* 5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程.

* 6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快.

* 7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员. 

2. 程序运行三种状态

image-20210722165333537

程序运行会以下三种状态中切换, 直到程序运行结束, 释放内存.
就绪态: 程序运行前, 首先进入就绪态, 等待操作系统的调度.
运行态: CPU执行程序指令的状态.
阻塞态: 执行中程序遇到事件请求会进入阻塞态, 等待返回结果, 并切换到其他程序执行.
       结果返回后进入就绪态再次等待操作系统调用.

3. 并发与并行

早期计算机的CPU都是单核的, 一个 CPU 在同一时间只能执行一个任务(某个进程的线程), 当系统中有多个任务等待执行时,
CPU只能执行完一个再执行下一个.

计算机在运行过程中, 有很多指令会涉及 I/O 操作,  I/O 操作又是相当耗时的, 速度远远低于 CPU,
这导致 CPU 经常处于空闲状态, 只能等待 I/O 操作完成后才能继续执行后面的指令.
3.1 并发
为了提高 CPU 利用率, 减少等待时间, 提出了一种 CPU 并发工作的理论.

并发(Concurrency): 是通过一种算法将 CPU 资源合理地分配给多个任务, 
当一个任务执行 I/O 操作时, CPU 可以转而执行其它的任务,
等到 I/O 操作完成以后, 或者新的任务遇到 I/O 操作时, CPU 再回到原来的任务继续执行.

2022-10-12_00854

虽然 CPU 在同一时刻只能执行一个任务, 但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,
使得多个任务在视觉上看起来是一起执行的. CPU 的执行速度极快, 多任务切换的时间也极短, 
用户根本感受不到, 所以并发执行看起来才跟真的一样.
操作系统负责将有限的 CPU 资源分配给不同的任务, 但是不同操作系统的分配方式不太一样, 常见的有:

* 1. 当检测到正在执行的任务进行 I/O 操作时, 就将 CPU 资源分配给其它任务.

* 2. 多道技术:  CPU 时间平均分配给各个任务, 每个任务都可以获得 CPU 的使用权.
	 在给定的时间内, 即使任务没有执行完成, 也要将 CPU 资源分配给其它任务,
	 该任务需要等待下次分配 CPU 使用权后再继续执行.
多道技术可以实现cpu对每个程序进程时间片的划分,
每一个程序执行一段时间, 在不同的程序中切换, 速度太快, 让人的感觉就是同时在运行的.

 CPU 资源合理地分配给多个任务共同使用, 有效避免了 CPU 被某个任务长期霸占的问题, 极大地提升了 CPU 资源利用率.

image-20210722183316114

进程的并发实现在于硬件中断一个正在运行的进程, 把此时程序中所有的状态保存下来, 
操作系统会记录在一个进程表中(每个进程占用一个进程表现, 这些表项也称为进程的控制模块)
保证程序再次启动像从未中断过一样.
3.2 并行(Parallelism)
并发是针对单核 CPU 提出的, 而并行则是针对多核 CPU 提出的. 
和单核 CPU 不同, 多核 CPU 真正实现了同时执行多个任务.

多核 CPU 内部集成了多个计算核心(Core), 每个核心相当于一个简单的 CPU, 
如果不计较细节, 你可以认为给计算机安装了多个独立的 CPU.

多核 CPU 的每个核心都可以独立地执行一个任务, 而且多个核心之间不会相互干扰.
在不同核心上执行的多个任务, 是真正地同时运行, 这种状态就叫做并行.

2022-10-12_00855

双核 CPU 执行两个任务时, 每个核心各自执行一个任务, 和单核 CPU 在两个任务之间不断切换相比, 它的执行效率更高.
3.3 并发+并行
单核CPU在同一时间只能处理一个进程.
多核CPU可以同时执行多个进程, 进程个数不高于核数.

执行任务的数量恰好等于 CPU 核心的数量, 是一种理想状态.但是在实际场景中, 
处于运行状态的任务是非常多的, 尤其是电脑和手机, 开机就几十个任务, 
 CPU 往往只有 4 核、8 核或者 16 , 远低于任务的数量, 
这个时候就会同时存在并发和并行两种情况:所有核心都要并行工作, 并且每个核心还要并发工作.

image-20221012181255986

每个核心并发执行两个任务, 两个核心并行的话就能执行四个任务.
当然也可以一个核心执行一个任务, 另一个核心并发执行三个任务, 
这跟操作系统的分配方式, 以及每个任务的工作状态有关系.
3.4 总结
并发针对单核 CPU 而言, 它指的是 CPU 交替执行不同任务的能力;
并行针对多核 CPU 而言, 它指的是多个核心同时执行多个任务的能力.

单核 CPU 只能并发, 无法并行, 并行只可能发生在多核 CPU .

在多核 CPU , 并发和并行一般都会同时存在, 它们都是提高 CPU 处理任务能力的重要手段.

4. 同步, 异步

同步和异步:描述的是任务的提交方式.
同步:任务提交之后, 原地等待任务的返回结果, 等待过程中不做任何事情.

异步:任务提交之后, 不原地等待返回的结果, 去做其他的事情, 任务的返回结果会有一个异步的回调机制自动处理.

5. 阻塞, 非阻塞

阻塞非阻塞:描述程序的运行状态.
阻塞:调用结果返回之前, 当前线程会被挂起, 只有在得到结果之后才会返回(线程进入阻塞态).
非阻塞:不能立刻得到结果之前, 直接返回.(线程只有就绪态, 运行态).
ps:
上诉概念的组合:最高效的一种组合:异步非阻塞.
理想状态:写的代码永远处于就绪态和运行态之间切换, 现实是难以实现的.

6. 子进程, 父进程

硬件需要操作系统管理, 只要有操作系统就有进程的概念.
新进程的创建都是由一个已经存在的进程去执行创建.

子进程: 由一个进程所创建的进程.
父进程:创建了新的进程的进程.

windows下父进程创建子进程有各自不同的地址空间, (多道技术要求物理层面实现进程之间内存的隔离),
任何一个进程在其地址空间中的修改都不会影响到另一个进程.

7. 僵尸进程, 孤儿进程

僵尸进程:当开启子进程, 该进程结束后不会立刻释放占用的进程号.
需要父进程能够查看得到她它开设的子进程的基本信息, 如占用的pid号, 运行时间等.

所有的进程都会步入僵尸进程, 等待父进程的查看.
父进程不死并且在无限的创建立子进程, 并且子进程也不会结束.

孤儿进程: 子进程存活, 父进程意外死亡, 操作系统会开始一个管理程序, 专门管理孤儿进程回收相关资源.

8. 进程的终止情况

* 1. 正常退出(程序正常执行完毕退出, 或执行程序的结束命令).
* 2. 出错退出(执行文件不不存在)
* 3. 严重错误(执行非法指令, 引用不存在, 能够进行异常捕捉).
* 4. 被其他进程强行结束.

9. 进程调度

进程调度:长短作业为cpu划分的.
先来先服务调度算法:对长作业有利, 多断作业无益, 
短作业优先算法:对短作业有利, 多长作业无益.

时间片轮转法+多级反馈队列:
时间片:将固定的时间切分成N多分, 每一份表示一个时间片 .

设置多级就绪队列, 各级队列优先级从高到底, 时间片从小到大划分.
新进程先进入第一级队列, 排队等待被分配时间片.
若用完时间片, 进程还未结束, 则进程进入下一级队列末尾.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值