线程
线程是CPU的调度,是程序执行的最小单元,在微内核中,真正调度运行的基本单位是线程,因此,实现并发功能的单位是线程。线程是运行于进程内部的,同一个进程内的多个线程之间,大多共享相同的资源,使用的是相同的地址空间,在没有了资源分配及空间分配工作的情况下,启动一个新线程,线程切换相对进程操作要快很多,花费也要小很多。
当然,线程是拥有自己的局部变量和堆栈(注意不是堆)的,比如在windows中用_beginthreadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。
一个很官方的说法:事实上,引入线程的主要目的是为了提高系统的执行效率,减少处理机的空转时间和调度切换(保护现场信息)的时间。
个人理解:单线程本身是属于同步的,但是多线程实现了异步的做法,并且cpu的调度能够减少线程空等的时间,共享一个上下文资源减少了调度的时间
进程
进程是资源分配的基本单位,进程有自己独立的资源空间,比如在linux下面启动一个新的进程,系统必须给他分配独立的地址空间(物理地址),建立众多的数据表来维护它的代码端,堆栈段和数据段,进程占用资源较多,相对昂贵。
引用 :每个进程都有私有的虚拟地址空间,进程的所有线程共享同一地址空间。每个线程被CPU分配一个时间片,一旦被激活,它正常运行直到时间片耗尽并被挂起,此时,操作系统选择另一个线程进行运行。通过时间片轮转,又出于各个时间片很小(20毫秒级),看起来就像多个线程同时在工作
Gevent 协程
协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。
协程的好处:
- 无需线程上下文切换的开销(遇到等待时间自动切换)
- 无需原子操作锁定及同步的开销
- 方便切换控制流,简化编程模型
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。(本身是一个异步并发模型)
拓展:关于并发并行同步异步的学习记录
名词解释
并行: 同一时间段内,多个指令被执行,在一个CPU下多个内核或者多个CPU下运行。
并发: 统一时间发生多个任务请求,具体表现为处理器数量小于需要处理的事务数。
并发分为伪并发和真并发两种,伪并发是指单核处理器上的并发,真并发为多内核服务器/处理器上的并发
同步: 首先需要声明的一点是,同步和并行不是一个概念。以进程为例,进程之间的关系(大部分)就是属于并行的,在不进行进程间通信的情况下,进程之间的资源是相对独立的,不进行共享。
进程同步是指进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。(此处可能涉及到消息队列情况,队列本身用于进程间通信,存储时间或者内容,而前一个线程的输出到队列中传输到后一个队列作为输入的情况,就是进程同步的概念)
异步: 异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
异步指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行。多线程将异步操作放入另一线程中运行,通过轮询或回调方法得到完成通知,
但是完成端口,由操作系统接管异步操作的调度,通过硬件中断,在完成时触发回调方法,此方式不需要占用额外线程。
总结
并发,多个事件同时发生,指发生;并行,同时处理多个事件,指处理;同步,无资源竞争,资源互斥,属于相互依赖的关系;异步,由CPU采用轮询的方式调度,资源一直不浪费,线程总是处于执行的状态。
异步和同步的区别,在io等待的时候,同步不会切走,浪费了时间,异步由于CPU调度,减少了空转时间。