Java教程

【学习打卡】第5天+并发基础篇

本文主要是介绍【学习打卡】第5天+并发基础篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

课程名称:笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

课程章节:第4章 并发基础篇

主讲老师:求老仙

课程内容:

第4章 并发基础篇

课程收获:

问题1)什么是线程,什么是进程?并发,并行?

1,线程和进程

进程是操作系统分配的基本单位

线程是操作系统操作的基本单位,线程是轻量级进程

2,进程和线程关系

线程是运行在进程中,进程是线程的容器

设计进程和线程的目的就是解决资源分配的问题

  1. 进程的作用

进程是处理内存和文件(Linux系统处理的都是文件),对接用户权限,操作系统的命名空间。

消息共享,所有的io设备,网络io都是文件

  1. 为什么需要线程

因为cpu资源不能被充分的利用,作为操作系统的操作最小单位

  1. 主线程

主线程是随着进程的创建而创建,创建了进程,需要的cpu资源,肯定是需要创建主线程

7,创建一下线程需要什么

8,线程对内存权限,线程是共享进程的内存的,Java语言做了限制,所以不能随意访问jvm线程的内存

3,并发和并行

并发,交替执行,同一个时刻只有一个线程执行

并行,同时执行,多核同时处理

  1. 并发和线程的关系

线程是一种并发的模型,多核会存在并行

问题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)线程上下文切换的是什么?以及什么时候发生上下文切换?

  1. 因为线程不保存资源,虽然ThreadLocal看似是线程的资源,实际是通过hashMap,Thread作为key,value作为存在资源,存储在hashMap中,并没有存储到线程中。

线程切换,context switch上下文切换,实际切换的是cpu上下文,因为线程仅有cpu资源,

Cpu的上下文,只有cpu的寄存器的值,所以本质上,线程的上下文切换,就是讲现在cpu中寄存器的值,存储起来,然后选择新的线程

2,什么时候发生线程上下文切换,sleep,wait,请求io都会上下文切换、

3,为什么是操作系统os,保存寄存器的值呢,不是保存到线程中

因为线程的上下文切换,有的是主动的有的是被动的,比如当前线程抛出异常,所以是os来进行保存寄存器的值。

Cas和原子操作

这篇关于【学习打卡】第5天+并发基础篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!