<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
牆上時鐘也稱為牆上時間。大多是1970年1月1日(UTC)以來的秒數和毫秒數。
牆上時間可以和NTP(Network Time Protocal,網路時間協定)同步,但是如果本地時鐘遠遠快於NTP伺服器,則強制重置之後會跳到先前某個時間點。(這裡不是很確定,猜測是如果時間差的不多,則調整石英晶體振盪器的頻率,慢慢一致。如果差很多,則強行一致)
機器大多有自己的石英晶體振盪器,並將其作為計時器。單調時鐘的絕對值沒有任何意義,根據作業系統和語言的不同,單調時鐘可能在程式開始時設為0、或在計算機啟動後設為0等等。但是通過比較同一臺計算機上兩次單調時鐘的差,可以獲得相對準確的時間間隔。
type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic), // a 33-bit seconds field, and a 30-bit wall time nanoseconds field. // The nanoseconds field is in the range [0, 999999999]. // If the hasMonotonic bit is 0, then the 33-bit field must be zero // and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext. // If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit // unsigned wall seconds since Jan 1 year 1885, and ext holds a // signed 64-bit monotonic clock reading, nanoseconds since process start. wall uint64 ext int64 ... } 複製程式碼
wall和ext共同記錄了時間,但是分為兩種情況,一種是沒有記錄單調時鐘(比如是通過字串解析得到的時間),另一種是記錄了單調時鐘(比如通過Now)。
wall的第一位是一個標記位
如果為1,則表示記錄了單調時鐘。則wall的2-34(閉區間)位記錄了從1885-1-1到現在的秒數,最後30位記錄了納秒數。而ext記錄了從程式開始執行到現在經過的單調時鐘數。
如果為0,則表示沒有記錄單調時鐘。則wall的2-34(閉區間)位全部為0(那最後30位是啥?)。而ext記錄了從1-1-1到現在經過的秒數。
這裡比較關鍵的程式碼是第914行的runtimeNano() - startNano
。startNano
的含義還是直接上程式碼比較明瞭。
var startNano = 0 func init(){ startNano = runtimeNano() }
runtimeNano()
是呼叫了組合,獲取了作業系統當前的單調時鐘。前面說過,單調時鐘的絕對值沒有什麼意義。因此這裡將兩個時間相減,得到了從程式開始到現在的單調時鐘。
然後看一下Sub
func (t Time) Sub(u Time) Duration { if t.wall&u.wall&hasMonotonic != 0 { te := t.ext ue := u.ext d := Duration(te - ue) if d < 0 && te > ue { return maxDuration // t - u is positive out of range } if d > 0 && te < ue { return minDuration // t - u is negative out of range } return d } d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec()) // Check for overflow or underflow. switch { case u.Add(d).Equal(t): return d // d is correct case t.Before(u): return minDuration // t - u is negative out of range default: return maxDuration // t - u is positive out of range } }
這裡我們只需要關注2-13行即可。除去了範圍檢查,這裡的主要邏輯就是兩個Time的ext相減。而ext又都代表了單調時鐘,所以最後返回的是單調時鐘的差值。
在分散式系統中,我們經常需要判斷時間間隔來檢測心跳。而牆上時鐘與NTP的組合可能會帶來時間的前後跳躍與閃爍,所以使用單調時鐘更加安全和保險。
在go語言中,沒有直接呼叫呼叫時鐘的函數。可以通過time.Now()
獲得帶單調時鐘的Time
結構體,並通過Since和Until獲得相對準確的時間間隔。
go1.14.2 原始碼
資料密集型應用系統設計(書)
到此這篇關於golang 牆上時鐘與單調時鐘的實現的文章就介紹到這了,更多相關golang 牆上時鐘與單調時鐘內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45