网络并发编程

网络并发编程

​ 并发编程是指程序在运行期间,可以同时的执行多任务,充分利用资源达到节省时间的目的。实现I/O并发编程的三种方式:进程,线程,协程,异步。这里不过多解释他们之中的基本含义。进程和线程都是基于计算机操作系统的内核的方式,涉及到了上下文的切换。也就是用户核和系统内核之间的切换,这个的成本是比较高的。而协程都是用户级切换,系统内核无感知。所以说协程的效率会更好。

协程

​ 线程分为用户线程和内核线程,内核线程对应到的是操作系统上。cpu来调度内核线程,内核线程上执行用户线程,也就是说用户线程需要和内核线程进行绑定,此时就涉及到了绑定的方式,也称为线程的调度模型。总共有一下三种。

  1. M:1 -> 多个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快,因为这些用户线程一个内核线程上绑定,但是无法利用多核系统的优点。比如python采用的就是该模型。

  2. M:M -> 1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。POSIX线程模型(pthread)就是这么做的。

  3. M:N -> 内核空间开启多个内核线程,每个内核空间线程可以对应多个用户空间线程。具体的比例由实际的情况决定。效率非常高,但是管理复杂。

    Go语言中的goroutine采用了协程,并且使用了M:N模型。go使用MPG管理协程。可以去查看下go的MGP原理。总结一句话就是go针对于并发而生的语言。

阻塞、非阻塞、同步、异步的关系和区别

​ 我们经常会听到,同步阻塞i/o,异步i/o…想搞清楚他们之间的区别和联系,首先要明白这几个词语是用来描述什么的。这几个词语用来描述应用程序和计算机之间是怎么协调工作的。

​ 一般我们把这个过程分为三个角色:应用程序,系统内核,I/O外设。流程如下图所示

应用程序 系统内核 I/O外设 1 2 3 4 应用程序 系统内核 I/O外设

​ 流程中,系统内核和I/O外设之间的过程,对应用程序是不可见的。阻塞、非阻塞、同步与异步都是用来描述应用程序和系统内核之间的关系,角度不太一样而已。阻塞与非阻塞说的是应用程序向系统内核发起请求后,应用程序是否会挂起,如果此时应用程序可以做其他事情则为非阻塞,如果挂起等着系统内核响应则为阻塞。同步与异步指的是系统内核拿到数据后与应用程序传递的方式。如果是应用程序轮询询问系统内核为同步,如果是系统内核通知应用程序则为异步。

​ 常用的模型有三种 同步阻塞I/O,同步非阻塞I/O,异步I/O(异步非阻塞I/O)

同步阻塞I/O也是传统的模型,如上图所示。同步非阻塞时I/O如下图所示:

应用程序 系统内核 I/O外设 1 2 轮询查询 3 4 应用程序copy数据 应用程序 系统内核 I/O外设

同步非阻塞式I/O,常用I/O多路复用。linux的epoll采用的就是同步非阻塞I/O多路复用的模型。异步I/O如下图所示:

应用程序 系统内核 I/O外设 1 2 3 4 系统内核调用应用程序 应用程序 系统内核 I/O外设

Node Js就是采用异步I/O模型。一般能称为"基于事件驱动的回调机制"的都属于异步I/O。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值