线程和进程的区别
概念:
- 进程(资源分配的最小单位):是一个动态概念,是竞争计算机系统资源的基本单位,是并发执行的程序在执行过程中分配和管理资源的基本单位。
- 线程(程序执行的最小单位):是比进程更小 的独立运行和独立调度的基本单位,线程也被称为轻量级进行。是CPU调度和分派的基本单位。线程自己基本上不拥有系统资源,值拥有一点运行必不可少的资源(计数器寄存器和栈),但它可享有所属进程的资源
- 一个程序至少一个进程,一个进程至少一个线程
进程和线程的区别:
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间
- 资源拥有:同一进程内的线程共享本进程的资源,但进程之间的资源是独立的
- 健壮性:多进程程序比多线程更加健壮,多线程程序只要一个线程死掉,整个进程就死掉;但一个进程崩溃后,在保护模式下不会对其它进程产生影响,因此进程有自己的独立地址空间。
- 进程切换时,消耗资源大,效率低。所以涉及频繁切换时,使用线程要比进程好。如果要同时进程并且共享某些变量的并发操作,只能用线程
- 执行过程:进程相当于一个应用程序执行的实例,所以每个独立的进程都有一个程序运行的入口、程序执行序列和程序运行出口。每个线程相当于这个应用程序的一个执行流,所以不能独立执行必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 线程是处理器调度的基本单位,但进程不是。
- 线程和进程都可以并发执行
两者的优劣:
- 线程执行开销小,但不利于资源的管理和保护,进程刚好相反
- 线程之间通信方便,同一进程下共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式进行。但多线程程序编写好同步与互斥更加困难
- 线程的调度与切换比进程快,开销也小
- 多进程比较独立,所以多进程程序会比多线程程序健壮。
通信方式
- 进程:管道、消息队列、共享内存、信号量、socket
- 线程:锁机制、信号量机制、信号机制
生命周期
- 进程:就绪、运行、阻塞
- 就绪:处于准备好运行的状态
- 执行:正在执行的状态
- 阻塞:暂时无法执行的状态
- 线程:初始、运行、阻塞、等待、死亡
- 新建:当一个Thread类或其子类被声明并创建时,新生的线程对象处于新建状态
- 就绪:处于新建状态的线程被start()后,将进入线程队列等待cpu时间片,此时它具备了运行的条件,只是没有分配到cpu资源
- 运行:当就绪的线程被调度并获得cpu资源时,便进入运行状态,run()定义了线程的操作和功能
- 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出cpu临时停止自己的执行,进入阻塞状态
- 死亡:线程完成它的全部工作或者线程被提前强制性的终止或者出现异常导致结束