线程是操作系统任务调度的最小单元,共用进程内的资源。
进程是操作系统资源分配的最小单元,与其他进程资源互相独立。
- 早期的计算机是没有操作系统的,只有输入,计算,输出。用户输入一个指令,计算机完成操作,大部分时候计算机都在等待用户输入指令,这样的处理性能很显然是很低效的,因为手工输入速度远低于计算机的计算速度。
- 于是出现了批处理操作系统,通过纸带,磁带等工具预先写入指令,形成一个指令清单(即任务)交给计算机处理。但批处理系统的缺点是只能有一个任务,而且当计算机在进行I/O处理时,CPU是空闲的。
- 接着世人发明了进程,一个进程就代表一个任务,多个进程通过分时操作能让用户认为并行操作多任务,进程间的资源是独立单元,但是可以通过介质进行通信。缺点:进程内只进行串行处理,无法很好地分工合作提高处理效率。
- 于是就有了操作系统调度的最小单元-线程,线程能够使进程内的子任务能够共享进程内的资源,并且并行工作,大大提高操作系统的性能。
- 地址空间和其它资源 :进程间拥有独立内存,进程是资源分配的基本单位;线程隶属于某一进程,且同一进程的各线程间共享内存(资源),线程是cpu调度的基本单位。
- 通信 :进程间相互独立,通信困难,常用的方法有:管道,信号量(semaphore),套接字,共享内存,消息队列等;线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
- 调度和切换 :线程上下文切换比进程上下文切换要快。进程间切换要保存上下文,加载另一个进程;而线程则共享了进程的上下文环境,切换更快。
多进程: 在操作系统的层面上,同时运行多个程序。
多线程: 在同一进程的层面上,同时运行多条程序。
多进程的好处: 提高了CPU的使用率。
多线程的好处: 提高了进程的使用率,从而提高了CPU的使用率。
操作系统发展到现在,如果我们要完成一个高性能的软件系统,需要考虑如多进程、多线程、进程间通信、多线程并发等技术点,这些技术也并不一定最新的就是最好的,也不是非此即彼的选择。比如:Nginx 可以用多进程也可以用多线程,JBoss 采用的是多线程;Redis 采用的是单进程,Memcache 采用的是多线程,这些系统都实现了高性能,但内部实现差异却很大。