同/异步、阻塞/非阻塞、进/线/协程

同步 异步 阻塞 非阻塞

同步与异步区别,主要关注的是消息通信机制

所谓同步调用 就是由调用者主动等待这个调用的结果。发出一个调用,在没有得到结果之前,该调用就不返回。一旦调用返回,就得到返回值了。

所谓异步调用 调用在发出之后,这个调用结果就直接返回了。当一个异步调用过程在发出之后,调用者不会立即得到结果,而是在调用发出后,被调用者通过状态、通知来通知调用者,或者通过函数回调来处理这个调用。

阻塞与非阻塞 关注的是:程序在等待调用结果(消息 返回值)时的状态

阻塞调用 是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用 是指,在不能立刻得到结果之前,该调用不会阻塞当前线程,当前线程还会继续执行下去。

注意!!! 阻塞与非阻塞与是否同步和是否异步无关。

进程 线程 协程

基本理解

大致上看有这么几个区别:

进程:独立的栈空间,独立的堆空间,进程之间调度由os完成。

线程:独立的栈空间,共享堆空间,内核线程之间调度由os完成。

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。

通俗理解:

首先是并发的起源,最初的动机就是想在宏观上,让多个程序能在同一时间执行,之后就是cpu分片,程序内部多个独立的逻辑流,宏观上多个逻辑流是一同执行的,当然也可以是多个cpu并行。

进一步的问题,多个逻辑流之间的切换怎么办,我的逻辑a计算到一半,逻辑b进来,那么逻辑a的中间结果怎么保存?所以同一个cpu中的多个并发执行的逻辑自然需要进行上下文切换。于是就需要进程的概念了,通过虚拟内存,进程表,等等内容来管理程序的运行和切换。

硬件进一步发展,一台电脑多个cpu于是一个cpu跑一个进程,这个就是并行了,是从时间意义上的完全的共同执行。

由于涉及到并行问题,那自然会有调度问题,怎么调度才能让cpu的利用率更高?这个就是内核应该程序要考虑的事。实质上就是某种权衡把,因为调度也是要开销的,所以就看这种调度是否值得去做。

课本上还是讲得挺明白,由于为了满足上述并发的需求,进程最为一个可拥有资源的,可独立调度和分派的基本单位而存在,但是进程的创建,撤销,切换其实都是需要不少开销的,如果进程切换过于频繁,系统资源就会被频繁开销所占去。于是控制粒度再进一步细化,即把“拥有资源”和“独立调度”两个属性分开来。线程仅仅拥有很小的一部分资源,共享线程的资源。其开销显著地小于进程的切换,操作系统的书里,都说的很细致,就不再赘述。

把调度的那部分功能从内核中拿出来,在进程中自己去实现一个逻辑流调度的功能,这样既可以实现并发的优势,又可以避免反复的系统调用,减少线程切换造成的开销,这就叫做用户态线程,相当于是调度功能的更细粒度的实现。

用户态线程需要考虑的问题:1、遇到阻塞式I/O会导致整个进程被挂起 2、由于缺乏时钟中断(具体查看相关内容 时钟中断的时候cpu可以用来进行进程切换)如果一种实现使得每个线程需要自己通过调用某个方法,主动交出控制权。那么我们就称这种用户态线程是协作式的,就是所谓的协程


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值