进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有5种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。
进程负责为程序的运行提供必备的环境,是操作系统资源分配的基本单位。
线程是进程内的一个独立的执行单元,是程序执行的一个完整的流程,是任务(CPU)调度和执行的基本单位,线程负责执行进程中的程序。
应用程序必须运行在某个进程的某个线程上,一个进程中至少有一个运行的线程:主线程在进程启动后自动创建;一个进程中的数据可以供其中的多个线程直接共享,多个进程之间的数据是不能直接共享的。
线程可与同属一个进程的其他线程共享进程所拥有的全部资源,比如计算机里的中央处理器,内存,文件,网络等。
一个程序可能有一个进程也可能有多个进程,比如Chrome浏览器就可以有多个进程,这样的程序叫多进程程序。
线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
一个进程内可以有多个线程运行,则这个程序是多线程的,如果只能有一个线程运行就是单线程程序。
多进程:一个应用程序可以同时启动多个实例运行。
多线程:在一个进程内,同时有多个线程运行。
多线程的优点是能有效的提高CPU的利用率。
多线程的缺点是创建多线程需要开销,(单核创建两个线程在某个时刻只能执行其中的一个线程,只能在线程间跳转运行),线程间切换开销,死锁与状态同步问题。
单线程的优点: 顺序编程,简单易懂。
单线程的缺点: 效率低。
JS是单线程(但是H5中的Web Workers提供多线程运行服务),主流的程序如java是多线程。
浏览器是多线程运行的。
有的浏览器是单进程运行的,如:Firefox,老版IE;有的浏览器是多进程运行的,如:Chrome,新版IE。
在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换开销小。
内存分配方面: 系统在运行的时候会为每个进程分配不同的内存空间,而对线程而言,除了CPU之外,系统不会为线程分配内存,线程所使用的资源来自于其所属进程的资源。
进程之间共享信息可通过TCP/IP协议,线程间共享信息可通过共用内存。
线程没有自己独立的地址空间。一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都会死掉,多进程的程序比多线程的程序健壮。
线程池:保存多个线程对象的容器,实现线程对象的反复利用。
进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。-“互斥锁”(防止两个线程同时读写某一块内存区域)
进程使用的内存地址可以限定使用量。-“信号量”(保证多个线程不会互相冲突)