1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      go語言的棧和隊(duì)列 go 棧內(nèi)存

      棧與隊(duì)列有什么區(qū)別?

      1.隊(duì)列先進(jìn)先出,棧先進(jìn)后出。

      專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)納雍免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

      2.對插入和刪除操作的"限定"。

      棧是限定只能在表的一端進(jìn)行插入和刪除操作的線性表。 隊(duì)列是限定只能在表的一端進(jìn)行插入和在另一端進(jìn)行刪除操作的線性表。

      從"數(shù)據(jù)結(jié)構(gòu)"的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。但它們是完全不同的數(shù)據(jù)類型。除了它們各自的基本操作集不同外,主要區(qū)別是對插入和刪除操作的"限定"。

      棧和隊(duì)列是在程序設(shè)計(jì)中被廣泛使用的兩種線性數(shù)據(jù)結(jié)構(gòu),它們的特點(diǎn)在于基本操作的特殊性,棧必須按"后進(jìn)先出"的規(guī)則進(jìn)行操作,而隊(duì)列必須按"先進(jìn)先出"的規(guī)則進(jìn)行操作。和線性表相比,它們的插入和刪除操作受更多的約束和限定,故又稱為限定性的線性表結(jié)構(gòu)。

      3.遍歷數(shù)據(jù)速度不同。棧只能從頭部取數(shù)據(jù)

      也就最先放入的需要遍歷整個棧最后才能取出來,而且在遍歷數(shù)據(jù)的時候還得為數(shù)據(jù)開辟臨時空間,保持?jǐn)?shù)據(jù)在遍歷前的一致性隊(duì)列怎不同,他基于地址指針進(jìn)行遍歷,而且可以從頭或尾部開始遍歷,但不能同時遍歷,無需開辟臨時空間,因?yàn)樵诒闅v的過程中不影像數(shù)據(jù)結(jié)構(gòu),速度要快的多

      棧(Stack)是限定只能在表的一端進(jìn)行插入和刪除操作的線性表。

      隊(duì)列(Queue)是限定只能在表的一端進(jìn)行插入和在另一端進(jìn)行刪除操作的線性表。

      從"數(shù)據(jù)結(jié)構(gòu)"的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。但它們是完全不同的數(shù)據(jù)類型。除了它們各自的基本操作集不同外,主要區(qū)別是對插入和刪除操作的"限定"。

      棧和隊(duì)列是在程序設(shè)計(jì)中被廣泛使用的兩種線性數(shù)據(jù)結(jié)構(gòu),它們的特點(diǎn)在于基本操作的特殊性,棧必須按"后進(jìn)先出"的規(guī)則進(jìn)行操作,而隊(duì)列必須按"先進(jìn)先出"的規(guī)則進(jìn)行操作。和線性表相比,它們的插入和刪除操作受更多的約束和限定,故又稱為限定性的線性表結(jié)構(gòu)。可將線性表和棧及隊(duì)列的插入和刪除操作對比如下:

      Insert(L,n+1,x)

      Delete(L,n)

      而棧只允許在表尾一端進(jìn)行插入和刪除

      隊(duì)列

      Insert(L,n+1,x)

      Delete(L,1)

      隊(duì)列只允許在表尾一端進(jìn)行插入,在表頭一端進(jìn)行刪除

      go語言循環(huán)隊(duì)列的實(shí)現(xiàn)

      隊(duì)列的概念在 順序隊(duì)列 中,而使用循環(huán)隊(duì)列的目的主要是規(guī)避假溢出造成的空間浪費(fèi),在使用循環(huán)隊(duì)列處理假溢出時,主要有三種解決方案

      本文提供后兩種解決方案。

      順序隊(duì)和循環(huán)隊(duì)列是一種特殊的線性表,與順序棧類似,都是使用一組地址連續(xù)的存儲單元依次存放自隊(duì)頭到隊(duì)尾的數(shù)據(jù)元素,同時附設(shè)隊(duì)頭(front)和隊(duì)尾(rear)兩個指針,但我們要明白一點(diǎn),這個指針并不是指針變量,而是用來表示數(shù)組當(dāng)中元素下標(biāo)的位置。

      本文使用切片來完成的循環(huán)隊(duì)列,由于一開始使用三個參數(shù)的make關(guān)鍵字創(chuàng)建切片,在輸出的結(jié)果中不包含nil值(看起來很舒服),而且在驗(yàn)證的過程中發(fā)現(xiàn)使用append()函數(shù)時切片內(nèi)置的cap會發(fā)生變化,在消除了種種障礙后得到了一個四不像的循環(huán)隊(duì)列,即設(shè)置的指針是順序隊(duì)列的指針,但實(shí)際上進(jìn)行的操作是順序隊(duì)列的操作。最后是對make()函數(shù)和append()函數(shù)的一些使用體驗(yàn)和小結(jié),隊(duì)列的應(yīng)用放在鏈隊(duì)好了。

      官方描述(片段)

      即切片是一個抽象層,底層是對數(shù)組的引用。

      當(dāng)我們使用

      構(gòu)建出來的切片的每個位置的值都被賦為interface類型的初始值nil,但是nil值也是有大小的。

      而使用

      來進(jìn)行初始化時,雖然生成的切片中不包含nil值,但是無法通過設(shè)置的指針變量來完成入隊(duì)和出隊(duì)的操作,只能使用append()函數(shù)來進(jìn)行操作

      在go語言中,切片是一片連續(xù)的內(nèi)存空間加上長度與容量的標(biāo)識,比數(shù)組更為常用。使用 append 關(guān)鍵字向切片中追加元素也是常見的切片操作

      正是基于此,在使用go語言完成循環(huán)隊(duì)列時,首先想到的就是使用make(type, len, cap)關(guān)鍵字方式完成切片初始化,然后使用append()函數(shù)來操作該切片,但這一方式出現(xiàn)了很多問題。在使用append()函數(shù)時,切片的cap可能會發(fā)生變化,用不好就會發(fā)生擴(kuò)容或收縮。最終造成的結(jié)果是一個四不像的結(jié)果,入隊(duì)和出隊(duì)操作變得與指針變量無關(guān),失去了作為循環(huán)隊(duì)列的意義,用在順序隊(duì)列還算合適。

      參考博客:

      Go語言中的Nil

      Golang之nil

      Go 語言設(shè)計(jì)與實(shí)現(xiàn)

      Go語言——goroutine并發(fā)模型

      參考:

      Goroutine并發(fā)調(diào)度模型深度解析手?jǐn)]一個協(xié)程池

      Golang 的 goroutine 是如何實(shí)現(xiàn)的?

      Golang - 調(diào)度剖析【第二部分】

      OS線程初始棧為2MB。Go語言中,每個goroutine采用動態(tài)擴(kuò)容方式,初始2KB,按需增長,最大1G。此外GC會收縮棧空間。

      BTW,增長擴(kuò)容都是有代價的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問題。

      更多關(guān)于stack的內(nèi)容,可以參見大佬的文章。 聊一聊goroutine stack

      用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語言自己實(shí)現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。

      Go語言采用兩級線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會交給OS線程執(zhí)行,但是需要一個中介,提供上下文。這就是G-M-P模型

      Go調(diào)度器有兩個不同的運(yùn)行隊(duì)列:

      go1.10\src\runtime\runtime2.go

      Go調(diào)度器根據(jù)事件進(jìn)行上下文切換。

      調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進(jìn)程切換。

      詳見 Golang - 調(diào)度剖析【第二部分】

      Linux可以通過epoll實(shí)現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。

      文件IO操作

      上面都是防止M堵塞,任務(wù)竊取是防止M空閑

      每個M都有一個特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務(wù),所以g0的棧稱為調(diào)度棧。g0的棧不會自動增長,不會被gc,來自os線程的棧。

      go1.10\src\runtime\proc.go

      G沒辦法自己運(yùn)行,必須通過M運(yùn)行

      M通過通過調(diào)度,執(zhí)行G

      從M掛載P的runq中找到G,執(zhí)行G


      網(wǎng)站標(biāo)題:go語言的棧和隊(duì)列 go 棧內(nèi)存
      當(dāng)前地址:http://ef60e0e.cn/article/dogoehs.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        英德市| 比如县| 襄城县| 贞丰县| 得荣县| 鲁山县| 济阳县| 金川县| 神木县| 舒城县| 巴里| 陇南市| 息烽县| 靖江市| 丽水市| 贵州省| 和静县| 蒙山县| 龙海市| 龙门县| 皮山县| 永德县| 湖北省| 中江县| 澜沧| 永济市| 天门市| 博兴县| 永城市| 莎车县| 德钦县| 鸡西市| 雷波县| 吴忠市| 灵台县| 贵德县| 华蓥市| 谢通门县| 西昌市| 翁牛特旗| 诏安县|