作者回复: 对的
作者回复: 进程上下文切换,是指用户态和内核态的来回切换。我们知道,如果一旦Synchronized锁资源竞争激烈,线程将会被阻塞,阻塞的线程将会从用户态调用内核态,尝试获取mutex,这个过程就是进程上下文切换。
作者回复: 理解正确~
作者回复: 进程上下文切换,是指用户态和内核态的来回切换。当Synchronized锁资源竞争激烈,线程将会被阻塞,阻塞的线程将会从用户态调用内核态,尝试获取mutex,这个过程是Synchronized锁产生的进程上下文切换。
作者回复: 在linux操作系统中,进程的运行空间一般分为用户态和内核态,用户态空间一般是进程应用运行空间,而内核态空间一般是指应用需要调用系统资源,应用不能再用户态空间直接调用系统资源,需要通过内核态来系统系统资源。
所以进程在用户态和内核态两个直接相互切换,就称之为进程上下文切换。
作者回复: sleep不会释放锁资源,wait则会,但两者都会从running状态中走出,也就是不再占用CPU资源。
作者回复: 进程间的上下文切换因为是用户态和内核态之间的切换,需要消耗更多的资源,例如,寄存器中的内容切换出,缓存的刷新等,而线程间的上下文切换是用户态的线程切换,由于是同一个虚拟内存,消耗资源相对较少。
作者回复: Synchronized在轻量级锁之前,锁资源竞争产生的是线程上下文切换,一旦升级到重量级锁,就会产生进程上下文切换。
作者回复: 这里指的是系统中线程的五个基本状态,waiting以及timed_waiting属于阻塞,这里的阻塞包括争用锁导致的阻塞blocked状态、调用wait(timeout)导致的timed_waiting状态以及调用wait()导致的waiting状态。
作者回复: 对的,协程就是一个典型的例子,一个线程中通过任务调度执行不同的任务,没有发生线程间的上下文切换。
作者回复: Java应用进程里面执行的代码则是属于用户态,而系统内核代码执行则属于内核态,假设我们一个同步锁的执行,首先会在Java应用程序中执行,之后需要切换到系统内核中去获取mutex,在切换的时候,需要将原来用户态的执行指令与内核执行指令相互切换,此时CPU资源也会发生切出切入。
作者回复: CAS乐观锁只是一个原子操作,为CPU指令实现,所以操作速度非常快,Java是调用C语言中的函数执行CPU指令操作,不需要进入内核或者切换线程。
而lock竞争锁资源是基于用户态完成,所以竞争锁资源时不会发生进程上下文切换。
作者回复: 我们可以调用yield,线程可以从runnning到runnable,我们可以手动编程试试,看看cs是不是增加了。
yield也会导致上下文切换的。
作者回复: sleep和wait一样,都会进入阻塞状态,区别是sleep没有释放锁,而wait释放了锁。所以也是一次上下文切换。
作者回复: 是的
作者回复: 不会影响缓存,影响到的是系统的性能