zoukankan      html  css  js  c++  java
  • Go怎么获取当前时间? Go ARM64 vDSO优化之路

    https://mzh.io/

    Go ARM64 vDSO优化之路

    2018-03-16  | Meng Zhuo

    背景

    Go怎么获取当前时间?问一个会Go的程序员,他随手就能写这个出来给你。

    import time
    
    time.Now()
    

    这背后是一个系统调用,X86上调用SYSCALL来完成,ARM64上是SVC。

    // func walltime() (sec int64, nsec int32)  
    TEXT runtime·walltime(SB),NOSPLIT,$24-12    
            MOVW    $0, R0 // CLOCK_REALTIME    
            MOVD    RSP, R1                     
            MOVD    $SYS_clock_gettime, R8      
            SVC                                 
            MOVD    0(RSP), R3      // sec      
            MOVD    8(RSP), R5      // nsec     
            MOVD    R3, sec+0(FP)               
            MOVW    R5, nsec+8(FP)              
            RET
    
    • R0 分别是调用的时钟类型
    • R1 是对应的Stack Pointer
    • R8 系统调用的ID

    很简单吧?但是这里有一个优化点,就是SVC涉及到了内核态和用户态的切换, 其实就是把所有的用户态的寄存器存储在内核的栈上,执行完内核函数之后,再恢复回来。 这一来一回,速度就降下来了……

    而时间又是很常见的系统调用,且是只读数据,能不能不切换内核/用户态呢? Linux内核的开发者们提出了vDSO方案。 通过给每个用户态进程添加一个共享对象(virtual dynamic shared object)来提供一些常见的内核函数 这样就不用切换用户态了。

  • 相关阅读:
    Docker基础 ubuntu安装docker
    layui.laytpl 模板引擎用法
    golang 中 strings 包的 Replace 用法介绍笔记
    golang之结构体
    Mysql复习秘籍
    NFS 共享存储
    Rsyncd 同步服务
    企业服务器架构
    基础面试题二
    基础面试题一
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9486909.html
Copyright © 2011-2022 走看看