0

www.yaxin330.com15595805001稳定在线

 1 year ago
source link: https://studygolang.com/articles/36122?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

www.yaxin330.com15595805001稳定在线

fhdrtyhg · 38分钟之前 · 65 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    

由于单核CPU性能过剩,而如此高的性能却只能运行一个程序无疑是极大的浪费,因此多任务操作系统应运而生。

操作系统把每个任务映射为一个进程,通过CPU轮询让每个进程轮流运行,从而让人误以为所有进程都在同时运行,实际上再同一时刻只有一个进程运行,这叫并发。当CPU有多核或者多线程的时候,在同一时刻就会同时有多个进程运行,这叫并行。

随着时代的进步,越来越多的业务逻辑需要高并发,需要高性能。因为创建进程,切换进程,进程间通讯,成本之高,使得多个进程协同运行并不能满足需求,于是多线程应运而生。通过在每个进程里创建多个线程,这些线程共享一个进程数据,这几乎弥补了多进程的所有缺点。当今主流操作系统都是多线程操作系统,例如:windows,linux,线程为操作系统最小调度单位,通过调度器,为每一个线程分配时间片。

随着硬件性能的提升,随着时间的考验,多进程的缺点变成了多线程的缺点:创建线程,切换线程,线程间通讯,成本之高。因为单核CPU性能已经足够,很多时候需要的是并发,而不是并行。而进程和线程都是由系统接管,并发还是并行都由系统说了算。因此人们渴望只并发的多线程,从而协程应运而生。

什么是协程? 设想一下:

多个线程处理各自的队列,当队列有任务时,线程依次执行,当队列为空时,线程休眠,如此循环。

如果线程数量上千甚至上万,这些线程同一时刻只有少部分队列有任务,那么操作系统会频繁的挂起线程,激活线程,并且所有线程都会占用系统资源,这会导致系统不堪重负,即使只有少数线程运行,也会让系统变得缓慢,甚至每个线程都需要锁,虽然有许多无锁算法,但这会让编程难度从普通上升到地狱,而操作线程,锁的时间也许远远大于线程执行任务的时间。

如果我们可以拥有自己的线程调度器,可以在应用层随意调度线程,避免线程进入内核状态,避免线程争夺资源,降低线程切换开销,可以在单核CPU高并发榨干性能,这样的多线程就是协程。

如果用协程来完成上述任务,可以解决上述的所有缺点。 由于调度器太底层,几乎把整个语言固定了,因此只有那些为了高并发而生的语言,才会有调度器,例如:GoLang,ErLang等,这些语言适合编写高并发程序。对于那些不是为了高并发而生的语言,它们也需要协程,但是它们不需要调度器,它们只要手动调度,这就已经足够了。

用协程取代异步回调 Lua 有协程,没有调度器,即使这样,协程依旧是Lua最强特性没有之一,这一特性经常被生手忽略,因为他们根本想不到该怎样使用协程。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK