什么是线程?什么是进程?为什么要有线程?有什么关系与区
别?
进程:
程序执⾏时的⼀个实例
每个进程都有独⽴的内存地址空间
系统进⾏资源分配和调度的基本单位
进程⾥的堆,是⼀个进程中最⼤的⼀块内存,被进程中的所有线程共享的,进程创建时分配,主要存放 new 创建的对象实例
进程⾥的⽅法区,是⽤来存放进程中的代码⽚段的,是线程共享的
在多线程 OS 中,进程不是⼀个可执⾏的实体,即⼀个进程⾄少创建⼀个线程去执⾏代码
为什么要有线程?
每个进程都有⾃⼰的地址空间,即进程空间。⼀个服务器通常需要接收⼤量并发请求,为每⼀个请求都创建⼀个进程系统开销⼤、请求响应效率低,因此操作系统引进线程。
线程:
进程中的⼀个实体
进程的⼀个执⾏路径
CPU 调度和分派的基本单位
线程本⾝是不会独⽴存在
当前线程 CPU 时间⽚⽤完后,会让出 CPU 等下次轮到⾃⼰时候在执⾏
系统不会为线程分配内存,线程组之间只能共享所属进程的资源
线程只拥有在运⾏中必不可少的资源(如程序计数器、栈)
线程⾥的程序计数器就是为了记录该线程让出 CPU 时候的执⾏地址,待再次分配到时间⽚时候就可以从⾃⼰私有的计数器指定地址继续执⾏
每个线程有⾃⼰的栈资源,⽤于存储该线程的局部变量和调⽤栈帧,其它线程⽆权访问
关系:
⼀个程序⾄少⼀个进程,⼀个进程⾄少⼀个线程,进程中的多个线程是共享进程的资源
Java 中当我们启动 main 函数时候就启动了⼀个 JVM 的进程,⽽ main 函数所在线程就是这个进程中的⼀个线程,也叫做主线程⼀个进程中有多个线程,多个线程共享进程的堆和⽅法区资源,但是每个线程有⾃⼰的程序计数器,栈区域
如下图
区别:
本质:进程是操作系统资源分配的基本单位;线程是任务调度和执⾏的基本单位
内存分配:系统在运⾏的时候会为每个进程分配不同的内存空间,建⽴数据表来维护代码段、堆栈段和数据段;除了 CPU 外,系统不会为线程分配内存,线程所使⽤的资源来⾃其所属进程的资源
资源拥有:进程之间的资源是独⽴的,⽆法共享;同⼀进程的所有线程共享本进程的资源,如内存,CPU,IO 等进程间通信和线程间通信的区别
开销:每个进程都有独⽴的代码和数据空间,程序之间的切换会有较⼤的开销;线程可以看做轻量级的进程,同⼀类线程共享代码和数据空间,每个线程都有⾃⼰独⽴的运⾏程序计数器和栈,线程之间切换的开销⼩
通信:进程间以IPC(管道,信号量,共享内存,消息队列,⽂件,套接字等)⽅式通信;同⼀个进程下,线程间可以共享全局变量、静态变量等数据进⾏通信,做到同步和互斥,以保证数据的⼀致性
调度和切换:线程上下⽂切换⽐进程上下⽂切换快,代价⼩
执⾏过程:每个进程都有⼀个程序执⾏的⼊⼝,顺序执⾏序列;线程不能够独⽴执⾏,必须依存在应⽤程序中,由程序的多线程控制机制控制
健壮性:每个进程之间的资源是独⽴的,当⼀个进程崩溃时,不会影响其他进程;同⼀进程的线程共享此线程的资源,当⼀个线程发⽣崩溃时,此进程也会发⽣崩溃,稳定性差,容易出现共享与资源竞争产⽣的各种问题,如死锁等
可维护性:线程的可维护性,代码也较难调试,bug 难排查
进程与线程的选择:
需要频繁创建销毁的优先使⽤线程。因为进程创建、销毁⼀个进程代价很⼤,需要不停的分配资源;线程频繁的调⽤只改变 CPU 的执⾏
线程的切换速度快,需要⼤量计算,切换频繁时,⽤线程
耗时的操作使⽤线程可提⾼应⽤程序的响应
线程对 CPU 的使⽤效率更优,多机器分布的⽤进程,多核分布⽤线程
需要跨机器移植,优先考虑⽤进程
需要更稳定、安全时,优先考虑⽤进程
需要速度时,优先考虑⽤线程
并⾏性要求很⾼时,优先考虑⽤线程
Java 编程语⾔中线程是通过 java.lang.Thread 类实现的。
Thread 类中包含 tid(线程id)、name(线程名称)、group(线程组)、daemon(是否守护线程)、priority(优先级)等重要属性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论