课程名称:笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机
课程章节:第4章 并发基础篇
主讲老师:求老仙
课程内容:
第4章 并发基础篇
课程收获:
问题1)什么是线程,什么是进程?并发,并行?
1,线程和进程
进程是操作系统分配的基本单位
线程是操作系统操作的基本单位,线程是轻量级进程
2,进程和线程关系
线程是运行在进程中,进程是线程的容器
设计进程和线程的目的就是解决资源分配的问题
- 进程的作用
进程是处理内存和文件(Linux系统处理的都是文件),对接用户权限,操作系统的命名空间。
消息共享,所有的io设备,网络io都是文件
- 为什么需要线程
因为cpu资源不能被充分的利用,作为操作系统的操作最小单位
- 主线程
主线程是随着进程的创建而创建,创建了进程,需要的cpu资源,肯定是需要创建主线程
7,创建一下线程需要什么
8,线程对内存权限,线程是共享进程的内存的,Java语言做了限制,所以不能随意访问jvm线程的内存
3,并发和并行
并发,交替执行,同一个时刻只有一个线程执行
并行,同时执行,多核同时处理
- 并发和线程的关系
线程是一种并发的模型,多核会存在并行
问题2)内核级线程和用户级线程?
内核:进程和硬件的沟通结构
问题1.1)线程的调用是操作系统完成的,线程的状态是jvm控制的
jvm不调度线程,不控制线程的调度,但是jvm控制线程的状态,线程的调度是通过操作系统来完成的
线程仅仅会获得cpu资源,其他资源都是进程的
问题3)为什么Java的线程是内核级线程?
用户进程创建的时候,内核空间会为进程创建一个主线程,如果进程中又创建了两个线程,如果想实现进程内的线程并发执行,就需要内核空间知道进程中的线程,也就是需要内核空间进行调度获取cpu,否则内核空间只知道该线程有一个主线程,无法进行进程内的线程并发执行。
Jdk1.1之后,Java的线程是内核级线程的映射,是内核控制的,不是用户空间控制的,这是为了实现并发或者并行。
红色是主线程,内核在创建用户进程的时候,会创建内核级的主线程。
绿色是用户线程,是用户自己创建的(green Thread)
操作系统分配cpu资源的时候,只能分配给内核级的线程,内核级的线程对应的是某进程中的线程,若用户空间的进程,创建的用户线程,不受内核控制,是分配不到cpu资源,只能通过进程的主线程分配cpu资源,所以就不可能有进程中的线程并发或并行的存在。
进程在创建线程的时候,是调用的操作系统的api,内核空间是可以调度进程创建的用户空间线程。
用户线程和内核级线程的映射: n个内核级线程(n个核)映射m个用户线程,Java中是一对一个的关系,就是在用户空间创建一个线程,对应的在内核空间也会有一个内核级的线程。(因为线程的创建和执行,只要提供入口地址就可以执行)。
内核级和用户级的线程只是映射,不是真正的用户创解一个线程,内核也创建一个线程,有可能是内核级线程是个线程池
问题3)为什么进程的切换,消耗比较大?
线程是进程分配的资源,内存和cpu都是进程的。
进程是有资源的,有内存和cpu,如果进程的切换,就要把内存和调度重新设置,所以成本高
问题4)线程上下文切换的是什么?以及什么时候发生上下文切换?
- 因为线程不保存资源,虽然ThreadLocal看似是线程的资源,实际是通过hashMap,Thread作为key,value作为存在资源,存储在hashMap中,并没有存储到线程中。
线程切换,context switch上下文切换,实际切换的是cpu上下文,因为线程仅有cpu资源,
Cpu的上下文,只有cpu的寄存器的值,所以本质上,线程的上下文切换,就是讲现在cpu中寄存器的值,存储起来,然后选择新的线程
2,什么时候发生线程上下文切换,sleep,wait,请求io都会上下文切换、
3,为什么是操作系统os,保存寄存器的值呢,不是保存到线程中
因为线程的上下文切换,有的是主动的有的是被动的,比如当前线程抛出异常,所以是os来进行保存寄存器的值。