进程、线程、协程的初步认识 - youngperson/study-100 GitHub Wiki

历史背景

  • 操作系统和性能最相关的是进程和线程

  • 最早的计算机是没有操作系统的,只有输入->计算->输出,大部分情况下都是在等用户的输入指令,处理性能很低效(PS:人的输入速度远比不上计算机运算速度)

  • 为了解决手工操作的低效,批处理操作系统诞生了。我们只要把任务清单写在存储介质当中,然后交给计算机去处理

  • 为了解决批处理任务计算机一次只能执行一个任务,如果某个任务需要读大量的数据,在I/O操作过程,CPU是空闲的,没有被利用起来进行其它的计算。诞生了进程,用进程来对应一个任务

  • 为了解决单个进程内只能串行处理,实际上很多进程内部的子任务并不是严格按照时间顺序去执行的,也是需要并行处理的。诞生了线程

进程

  1. 什么是进程

    • 进程是资源的抽象
    • 由操作系统进程调度
    • 进程是资源分配的最小单位,与其它进程资源相互独立
  2. 操作系统能同时运行多少个进程

    • 从操作系统和CPU角度看,进程是串行处理
    • 从用户角度看,多进程在并行处理,因为CPU处理的速度很快
  3. 进程之间的通信

    • 通道
    • 消息队列(ps:Posix消息队列system V消息队列)
    • 信号量
    • 共享存储
    • 套接口(ps:Socket)

线程

  1. 什么是线程

    • 线程是任务调度的抽象
    • 线程是进程内的子任务
    • 线程是任务调度的最小单位,共享同一个进程内的资源
  2. 一个进程下能开多少个线程

    • 假如内存是4个g,进程不可能有4个g的内存,假设是2g。每个线程默认堆栈大小是1M,所以理论上可以创建2048个左右的线程
    • 实际需要根据进程具体的去分析
    • 进程下线程不是越多越好,需要去衡量出合适的值
  3. 进程可以没有线程?

    • 一个程序至少有一个进程,一个进程至少有一个线程
    • 有没有没有线程的进程呢 比如僵尸、孤儿进程下面有没有线程???

协程

- 协程是用户态下面,应用程序可控制
- 微线程??

应用

  • Nginx可以用多进程/多线程
  • Jboss用多线程
  • Redis用单进程
  • Memcache用多线程