进程、线程、协程的初步认识 - youngperson/study-100 GitHub Wiki
历史背景
-
操作系统和性能最相关的是进程和线程
-
最早的计算机是没有操作系统的,只有输入->计算->输出,大部分情况下都是在等用户的输入指令,处理性能很低效(PS:人的输入速度远比不上计算机运算速度)
-
为了解决手工操作的低效,批处理操作系统诞生了。我们只要把任务清单写在存储介质当中,然后交给计算机去处理
-
为了解决批处理任务计算机一次只能执行一个任务,如果某个任务需要读大量的数据,在I/O操作过程,CPU是空闲的,没有被利用起来进行其它的计算。诞生了进程,用进程来对应一个任务
-
为了解决单个进程内只能串行处理,实际上很多进程内部的子任务并不是严格按照时间顺序去执行的,也是需要并行处理的。诞生了线程
进程
-
什么是进程
- 进程是资源的抽象
- 由操作系统进程调度
- 进程是资源分配的最小单位,与其它进程资源相互独立
-
操作系统能同时运行多少个进程
- 从操作系统和CPU角度看,进程是串行处理
- 从用户角度看,多进程在并行处理,因为CPU处理的速度很快
-
进程之间的通信
- 通道
- 消息队列(ps:Posix消息队列system V消息队列)
- 信号量
- 共享存储
- 套接口(ps:Socket)
线程
-
什么是线程
- 线程是任务调度的抽象
- 线程是进程内的子任务
- 线程是任务调度的最小单位,共享同一个进程内的资源
-
一个进程下能开多少个线程
- 假如内存是4个g,进程不可能有4个g的内存,假设是2g。每个线程默认堆栈大小是1M,所以理论上可以创建2048个左右的线程
- 实际需要根据进程具体的去分析
- 进程下线程不是越多越好,需要去衡量出合适的值
-
进程可以没有线程?
- 一个程序至少有一个进程,一个进程至少有一个线程
- 有没有没有线程的进程呢 比如僵尸、孤儿进程下面有没有线程???
协程
- 协程是用户态下面,应用程序可控制
- 微线程??
应用
- Nginx可以用多进程/多线程
- Jboss用多线程
- Redis用单进程
- Memcache用多线程