并发并行区别,进程的理解

1、并发和并行的区别

并发程序可以被同时发起执行的程序,

并行可以被设置成在并行的硬件执行的并发程序

并发程序内部交互:

同步程序原则:程序如果想使用一个共享资源,就必须请求该资源,并且获取该资源的访问权限,当程序不需要此资源时,释放该资源。同一时刻,一个资源只能被一个程序占用

传递数据是并发程序内部的另一种交互方式。可以被称为并发程序内部的通讯,协调内部的通讯可以是同步也可以是异步,异步方式可以使得数据在不加以延时的情况下发送给数据接收方,避免等待

2、进程的定义

进程是操作系统独立分配的基本单元,

是系统进行资源分配和调度的基本单位

在当代面向线程设计的计算机结构中,进程是线程的容器。

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体

进程的状态:可运行状态、可中断的睡眠状态、不可中断的睡眠状态、暂停或跟踪状态、僵尸状态、退出状态

3、进程的空间

内核空间、用户空间

一个用户进程总会存在用户空间中,但是不可以对计算机的硬件进行交互性操作

内核却可以和硬件进行交互,但是它在内核空间中

用户空间和内核空间体现了linux操作系统对于物理内存的划分

内存区域每一个单元都是有地址的,这些地址是由指针来标识和定位的

内核会为每一个进程分配虚拟内存而不是物理内存,虚拟内存总是存在用户空间的 ,内核空间是留给内核使用的

内核会把虚拟内存划分成若干个页。而物理内存单元由cpu负责

多个进程之间的物理内存中的页进行一一对应,并不是每个页都有映射,那些没有对应的页可能未被使用或已经切到磁盘,swap

4、系统调用

用户进程生存在用户空间中,无法直接操作计算机硬件,但是内核空间的内核可以,用户空间无法访问内核空间,也无法随意指示内核操作硬件,内核会提供一些接口供他们使用,这些接口是用户空间和内核空间的一座桥梁,用户进程使用这些接口的行为叫系统调用。

5、进程的切换

进程A切换到进程B的操作流程,内核及时保存进程A之前的运行状态,然后把进行B切换到A的运行状态,

引入一个计数器的概念,从进程A切换进程B的顺序是由计数器来控制的,

进程切换流程:

1、内核运行进程A

2、读取计算器值,并且依此筛选了数据,得到新的数据集合。

3、内核认为A进程已经运行了足够长的时间,所以把进程A换下运行进程B

4、CPU开始读取进程B的计算器值1,并依次筛选数据,得到新的数据集合

5、进程B把数据集合写入data1文件,并写入完成后关闭文件

6、内核把进程B换下,并CPU运行进程A

7、进程A把数据集合写入data1文件,并写入完成后关闭文件

8、把进程A的计算器值更改为10001

9、内核将A换下,并让CPU运行进程B

10、cpu将进程B的计算器值更改为10001

在这里插入图片描述

6、线程和协程

(1)实例说明开销更小

10000人同时在线付款,你打算启动10000个线程来处理任务。等等,问题来了,因为每个线程至少会占用4M的内存空间,10000个线程会消耗39G的内存,而服务器的内存配置只有区区8G,这时候你有2种选择,一是选择增加服务器,二是选择提高代码效率。那么是否有方法能够提高效率呢?

我们知道操作系统在线程等待IO的时候,会阻塞当前线程,切换到其它线程,这样在当前线程等待IO的过程中,其它线程可以继续执行。当系统线程较少的时候没有什么问题,但是当线程数量非常多的时候,却产生了问题。一是系统线程会占用非常多的内存空间,二是过多的线程切换会占用大量的系统时间。

协程刚好可以解决上述2个问题。协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。

自我总结协程和线程的区别

(1)协程是异步的,线程是同步的

(2)协程消耗的系统资源较小,每个线程消耗4M以上的内存,而协程仅需要消耗8kb

(3)线程执行机制:操作系统在线程等待io的时候,会阻塞当前线程,切换到其它线程,等待线程较多的时候,过多的占用了系统的内存空间,过多的切换回占用大量的系统时间,

​ 协程执行机制:协程在线程之上运行完成后,可以选择主动让出,让另外一个协程运行在当前线程上,协程并没有增加线程数量,只是在线程的基础上进行复用的方式运行多个协程。协程的切换在用户态下完成,切换的代价要比线程从用户态切到内核态的代价小很多。

(协程遇见io,临时交出控制权,让cpu执行其他的函数,等操作完成后,再拿回控制权)

(4)协程可中断、恢复

协程的切换:

先说结论:协程切换比线程切换快主要有两点:(1)协程切换完全在用户空间进行,线程切换涉及特权模式切换,需要在内核空间完成;(2)协程切换相比线程切换做的事情更少

  • 协程切换

协程切换只涉及基本的CPU上下文切换,所谓的 CPU 上下文,就是一堆寄存器,里面保存了 CPU运行任务所需要的信息:从哪里开始运行(%rip:指令指针寄存器,标识 CPU 运行的下一条指令),栈顶的位置(%rsp: 是堆栈指针寄存器,通常会指向栈顶位置),当前栈帧在哪(%rbp 是栈帧指针,用于标识当前栈帧的起始位置)以及其它的CPU的中间状态或者结果(%rbx,%r12,%r13,%14,%15 等等)。协程切换非常简单,就是把当前协程的 CPU 寄存器状态保存起来,然后将需要切换进来的协程的 CPU 寄存器状态加载的 CPU 寄存器上就 ok 了。而且完全在用户态进行,一般来说一次协程上下文切换最多就是几十ns 这个量级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值