美文网首页
重量级锁相比Lock锁为什么更占用资源

重量级锁相比Lock锁为什么更占用资源

作者: 菊地尤里 | 来源:发表于2019-04-26 11:25 被阅读0次

ReentrantLock 和 Atomic类都使用了CAS机制,大量同步代码执行时间必然长,cas会过多的占用cpu资源。synchronized当变成重量级锁的时候就直接阻塞,还解决出了cpu资源。为啥lock还适合大量同步代码?应该syn的重量级锁更适合,毕竟短时间之内锁释放不出来不必要一直cas?
看到有人提出这个问题,然后我又看了一遍这块内容。

先聊点题外知识:
阻塞与非阻塞哪个更耗cpu资源?
非阻塞并不是不断的轮询,而是直接返回,让自己去处理请求不能满足的情况,自己做决定是继续等待(循环非阻塞调用,当然没有必要,因为可以直接阻塞调用),还是去想别的办法。
至于占用的 cpu 资源应该相差不大,阻塞之后当前线程或进程放弃系统执行时间,直到条件满足,阻塞期间应该就是不会消耗太多资源,因为执行时间都不占用了。
而非阻塞就只是一个调用而已,不满足就直接返回到当前程序了,所以两个应该差不多的。
平时用非阻塞的时候应该就是希望程序自己处理请求不能满足的情况了,而阻塞则是程序只有满足条件才可以继续执行,所以就一直阻塞等待着了,那个用多用少看使用的情况而定。

知识点2:
用户态与内核态的切换与区别?
内核态和用户态的区别
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权级最高的(0级)内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的用户代码中运行。当正在执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内核态。因为中断处理程序将使用当前进程的内核态。

内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。Linux使用了Ring3级别运行用户态。Ring0作为内核态,没有使用Ring1和Ring2.Ring3不能访问Ring0的地址空间,包括代码和数量。Linux进程的4GB空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。用户运行一程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换Ring3,回到用户态。这样,用户态的程序就不能随意操作1内核地址空间,具有一定的安全保护作用。

用户态和内核态的转换
(1)用户态切换到内核态的3种方式
a.系统调用
这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。

b.异常
当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此异常的内核相关程序中,也就到了内核态,比如缺页异常。

c.外围设备的中断
当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

具体的切换操作从出发方式看,可以在认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一样的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断处理机制基本上是一样的,用户态切换到内核态的步骤主要包括:
(1)从当前进程的描述符中提取其内核栈的ss0及esp0信息。
(2)使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈找到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
(3)将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

所以简单的说
synchronized由操作系统支持,涉及内核态和用户态的上下文切换,并发高时切换开销非常大

相关文章

  • 重量级锁相比Lock锁为什么更占用资源

    ReentrantLock 和 Atomic类都使用了CAS机制,大量同步代码执行时间必然长,cas会过多的占用c...

  • synchronized如何实现高性能

    偏向锁:mark word存储线程id轻量级锁:cas重量级锁:lock

  • 无锁编程lock-free和CAS

    lock-free的概念什么是lock-free,简单的说就是不直接使用锁,减少锁在系统中占用的开销。相比于基于锁...

  • Lock 和 Synchronized

    Lock锁: JDK1.5后新增的功能,与采用 synchronized 相比,lcok 可以提供多种锁的方案,更...

  • 每日一题 2020-03-26 聊聊Java里的那把锁——偏向锁

    偏向锁(Biased Lock)也是一种非互斥锁,它比自旋锁更轻,是Java为了解决synchronized重量级...

  • Java多线程之Lock深入理解

    1 Lock原理深入理解 Java中已经有了synchronized重量级锁,那么为什么还得有Lock,之所以引入...

  • Lock源码解读

    Lock接口 public interface Lock { // 获得锁资源 void lock(); // 尝...

  • 锁2

    5、读写锁 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到...

  • 锁分类

    是否锁住资源分为悲观锁(互斥同步锁)和乐观锁 悲观锁 典型的就是synchronize锁和Lock锁互斥同步锁, ...

  • iOS中各种锁的性能对比

    自旋锁 与 互斥锁 自旋锁 (spin lock): 如果一个线程需要获取自旋锁,该锁已经被其他线程占用,该线程不...

网友评论

      本文标题:重量级锁相比Lock锁为什么更占用资源

      本文链接:https://www.haomeiwen.com/subject/clkfnqtx.html