zoukankan      html  css  js  c++  java
  • 进程、线程、协程

    1、进程与线程

    1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
    2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
    3、进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等),及一些进程级的资源(如打开文件和信号)。某进程内的线程在其他进程不可见。
    4、调度和切换,线程上下文切换要比进程切换快的多。

    2、协程

    历史上多线程在一些场景下的弊端:
    J2EE系统中,都是给予每个请求占用一个线程去完成完整的业务逻辑(包括事务),所以系统的吞吐量取决于每个线程的操作时耗。如果遇到很耗时I/O行为,则整个系统的吞吐能力立刻下降。因为这个时候线程处于阻塞状态,如果线程线程个数很多,会存在很多线程处于空闲状态,(很多线程需要等待该线程执行完才能执行)造成资源应用不彻底。
    例子:JDBC,它是同步阻塞的。这里的耗时其实是让CPU一直等待I/O返回,阻塞的线程根本没有利用CPU去做运算,而是处于空转状态。另外,线程过多,会带来更多的上下文切换带来的开销。

    针对以上问题的一些解决办法:
    1、但线程上加上异步回调,例如Node.js, 以及JAVA 里的Vert.x
    2、协程,当出现长时间的I/O操作时,通过让出当前的协程调度,执行下一个任务的方式来消除上下文切换上的开销。

    3、协程的特点

    1、线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少来上下文切换
    2、线程默认Stack大小是1M,而协程更轻量,接近1K.因此在大小相同的内存中,可以开启更多的协程。
    3、由于在同一个线程,可以避免竞争关系而使用锁
    4、适用于被阻塞的,且需要大量并发的场景。但不适用于大量计算的多线程。大量计算的需要利用多线程技术去解决。

  • 相关阅读:
    PHP异常与错误处理机制
    工作中图片上传遇到的一个问题
    PHP遍历目录四种方法
    ssh框架中.xml文件小技巧分离xml
    读取XML文件内容
    spring_AOP
    spring_AOP_XML
    spring_AOP_annotation
    js异步刷新局部页面
    HQL count(*)
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/13431528.html
Copyright © 2011-2022 走看看