1. 介紹
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、克東ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的克東網(wǎng)站制作公司
最近在研究一些消息中間件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一個(gè)基于Go語言的分布式實(shí)時(shí)消息平臺(tái),它基于MIT開源協(xié)議發(fā)布,由bitly公司開源出來的一款簡單易用的消息中間件。
官方和第三方還為NSQ開發(fā)了眾多客戶端功能庫,如官方提供的基于HTTP的nsqd、Go客戶端go-nsq、Python客戶端pynsq、基于Node.js的JavaScript客戶端nsqjs、異步C客戶端libnsq、Java客戶端nsq-java以及基于各種語言的眾多第三方客戶端功能庫。
1.1 Features
1). Distributed
NSQ提供了分布式的,去中心化,且沒有單點(diǎn)故障的拓?fù)浣Y(jié)構(gòu),穩(wěn)定的消息傳輸發(fā)布保障,能夠具有高容錯(cuò)和HA(高可用)特性。
2). Scalable易于擴(kuò)展
NSQ支持水平擴(kuò)展,沒有中心化的brokers。內(nèi)置的發(fā)現(xiàn)服務(wù)簡化了在集群中增加節(jié)點(diǎn)。同時(shí)支持pub-sub和load-balanced 的消息分發(fā)。
3). Ops Friendly
NSQ非常容易配置和部署,生來就綁定了一個(gè)管理界面。二進(jìn)制包沒有運(yùn)行時(shí)依賴。官方有Docker image。
4.Integrated高度集成
官方的 Go 和 Python庫都有提供。而且為大多數(shù)語言提供了庫。
1.2 組件
1.3 拓?fù)浣Y(jié)構(gòu)
NSQ推薦通過他們相應(yīng)的nsqd實(shí)例使用協(xié)同定位發(fā)布者,這意味著即使面對(duì)網(wǎng)絡(luò)分區(qū),消息也會(huì)被保存在本地,直到它們被一個(gè)消費(fèi)者讀取。更重要的是,發(fā)布者不必去發(fā)現(xiàn)其他的nsqd節(jié)點(diǎn),他們總是可以向本地實(shí)例發(fā)布消息。
NSQ
首先,一個(gè)發(fā)布者向它的本地nsqd發(fā)送消息,要做到這點(diǎn),首先要先打開一個(gè)連接,然后發(fā)送一個(gè)包含topic和消息主體的發(fā)布命令,在這種情況下,我們將消息發(fā)布到事件topic上以分散到我們不同的worker中。
事件topic會(huì)復(fù)制這些消息并且在每一個(gè)連接topic的channel上進(jìn)行排隊(duì),在我們的案例中,有三個(gè)channel,它們其中之一作為檔案channel。消費(fèi)者會(huì)獲取這些消息并且上傳到S3。
nsqd
每個(gè)channel的消息都會(huì)進(jìn)行排隊(duì),直到一個(gè)worker把他們消費(fèi),如果此隊(duì)列超出了內(nèi)存限制,消息將會(huì)被寫入到磁盤中。Nsqd節(jié)點(diǎn)首先會(huì)向nsqlookup廣播他們的位置信息,一旦它們注冊(cè)成功,worker將會(huì)從nsqlookup服務(wù)器節(jié)點(diǎn)上發(fā)現(xiàn)所有包含事件topic的nsqd節(jié)點(diǎn)。
nsqlookupd
2. Internals
2.1 消息傳遞擔(dān)保
1)客戶表示已經(jīng)準(zhǔn)備好接收消息
2)NSQ 發(fā)送一條消息,并暫時(shí)將數(shù)據(jù)存儲(chǔ)在本地(在 re-queue 或 timeout)
3)客戶端回復(fù) FIN(結(jié)束)或 REQ(重新排隊(duì))分別指示成功或失敗。如果客戶端沒有回復(fù), NSQ 會(huì)在設(shè)定的時(shí)間超時(shí),自動(dòng)重新排隊(duì)消息
這確保了消息丟失唯一可能的情況是不正常結(jié)束 nsqd 進(jìn)程。在這種情況下,這是在內(nèi)存中的任何信息(或任何緩沖未刷新到磁盤)都將丟失。
如何防止消息丟失是最重要的,即使是這個(gè)意外情況可以得到緩解。一種解決方案是構(gòu)成冗余 nsqd對(duì)(在不同的主機(jī)上)接收消息的相同部分的副本。因?yàn)槟銓?shí)現(xiàn)的消費(fèi)者是冪等的,以兩倍時(shí)間處理這些消息不會(huì)對(duì)下游造成影響,并使得系統(tǒng)能夠承受任何單一節(jié)點(diǎn)故障而不會(huì)丟失信息。
2.2 簡化配置和管理
單個(gè) nsqd 實(shí)例被設(shè)計(jì)成可以同時(shí)處理多個(gè)數(shù)據(jù)流。流被稱為“話題”和話題有 1 個(gè)或多個(gè)“通道”。每個(gè)通道都接收到一個(gè)話題中所有消息的拷貝。在實(shí)踐中,一個(gè)通道映射到下行服務(wù)消費(fèi)一個(gè)話題。
在更底的層面,每個(gè) nsqd 有一個(gè)與 nsqlookupd 的長期 TCP 連接,定期推動(dòng)其狀態(tài)。這個(gè)數(shù)據(jù)被 nsqlookupd 用于給消費(fèi)者通知 nsqd 地址。對(duì)于消費(fèi)者來說,一個(gè)暴露的 HTTP /lookup 接口用于輪詢。為話題引入一個(gè)新的消費(fèi)者,只需啟動(dòng)一個(gè)配置了 nsqlookup 實(shí)例地址的 NSQ 客戶端。無需為添加任何新的消費(fèi)者或生產(chǎn)者更改配置,大大降低了開銷和復(fù)雜性。
2.3 消除單點(diǎn)故障
NSQ被設(shè)計(jì)以分布的方式被使用。nsqd 客戶端(通過 TCP )連接到指定話題的所有生產(chǎn)者實(shí)例。沒有中間人,沒有消息代理,也沒有單點(diǎn)故障。
這種拓?fù)浣Y(jié)構(gòu)消除單鏈,聚合,反饋。相反,你的消費(fèi)者直接訪問所有生產(chǎn)者。從技術(shù)上講,哪個(gè)客戶端連接到哪個(gè) NSQ 不重要,只要有足夠的消費(fèi)者連接到所有生產(chǎn)者,以滿足大量的消息,保證所有東西最終將被處理。對(duì)于 nsqlookupd,高可用性是通過運(yùn)行多個(gè)實(shí)例來實(shí)現(xiàn)。他們不直接相互通信和數(shù)據(jù)被認(rèn)為是最終一致。消費(fèi)者輪詢所有的配置的 nsqlookupd 實(shí)例和合并 response。失敗的,無法訪問的,或以其他方式故障的節(jié)點(diǎn)不會(huì)讓系統(tǒng)陷于停頓。
2.4 效率
對(duì)于數(shù)據(jù)的協(xié)議,通過推送數(shù)據(jù)到客戶端最大限度地提高性能和吞吐量的,而不是等待客戶端拉數(shù)據(jù)。這個(gè)概念,稱之為 RDY 狀態(tài),基本上是客戶端流量控制的一種形式。
efficiency
2.5 心跳和超時(shí)
組合應(yīng)用級(jí)別的心跳和 RDY 狀態(tài),避免頭阻塞現(xiàn)象,也可能使心跳無用(即,如果消費(fèi)者是在后面的處理消息流的接收緩沖區(qū)中,操作系統(tǒng)將被填滿,堵心跳)為了保證進(jìn)度,所有的網(wǎng)絡(luò) IO 時(shí)間上限勢必與配置的心跳間隔相關(guān)聯(lián)。這意味著,你可以從字面上拔掉之間的網(wǎng)絡(luò)連接 nsqd 和消費(fèi)者,它會(huì)檢測并正確處理錯(cuò)誤。當(dāng)檢測到一個(gè)致命錯(cuò)誤,客戶端連接被強(qiáng)制關(guān)閉。在傳輸中的消息會(huì)超時(shí)而重新排隊(duì)等待傳遞到另一個(gè)消費(fèi)者。最后,錯(cuò)誤會(huì)被記錄并累計(jì)到各種內(nèi)部指標(biāo)。
2.6 分布式
因?yàn)镹SQ沒有在守護(hù)程序之間共享信息,所以它從一開始就是為了分布式操作而生。個(gè)別的機(jī)器可以隨便宕機(jī)隨便啟動(dòng)而不會(huì)影響到系統(tǒng)的其余部分,消息發(fā)布者可以在本地發(fā)布,即使面對(duì)網(wǎng)絡(luò)分區(qū)。
這種“分布式優(yōu)先”的設(shè)計(jì)理念意味著NSQ基本上可以永遠(yuǎn)不斷地?cái)U(kuò)展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享狀態(tài)就是保存在lookup節(jié)點(diǎn)上,甚至它們不需要全局視圖,配置某些nsqd注冊(cè)到某些lookup節(jié)點(diǎn)上這是很簡單的配置,唯一關(guān)鍵的地方就是消費(fèi)者可以通過lookup節(jié)點(diǎn)獲取所有完整的節(jié)點(diǎn)集。清晰的故障事件——NSQ在組件內(nèi)建立了一套明確關(guān)于可能導(dǎo)致故障的的故障權(quán)衡機(jī)制,這對(duì)消息傳遞和恢復(fù)都有意義。雖然它們可能不像Kafka系統(tǒng)那樣提供嚴(yán)格的保證級(jí)別,但NSQ簡單的操作使故障情況非常明顯。
2.7 no replication
不像其他的隊(duì)列組件,NSQ并沒有提供任何形式的復(fù)制和集群,也正是這點(diǎn)讓它能夠如此簡單地運(yùn)行,但它確實(shí)對(duì)于一些高保證性高可靠性的消息發(fā)布沒有足夠的保證。我們可以通過降低文件同步的時(shí)間來部分避免,只需通過一個(gè)標(biāo)志配置,通過EBS支持我們的隊(duì)列。但是這樣仍然存在一個(gè)消息被發(fā)布后馬上死亡,丟失了有效的寫入的情況。
2.8 沒有嚴(yán)格的順序
雖然Kafka由一個(gè)有序的日志構(gòu)成,但NSQ不是。消息可以在任何時(shí)間以任何順序進(jìn)入隊(duì)列。在我們使用的案例中,這通常沒有關(guān)系,因?yàn)樗械臄?shù)據(jù)都被加上了時(shí)間戳,但它并不適合需要嚴(yán)格順序的情況。
2.9 無數(shù)據(jù)重復(fù)刪除功能
NSQ對(duì)于超時(shí)系統(tǒng),它使用了心跳檢測機(jī)制去測試消費(fèi)者是否存活還是死亡。很多原因會(huì)導(dǎo)致我們的consumer無法完成心跳檢測,所以在consumer中必須有一個(gè)單獨(dú)的步驟確保冪等性。
3. 實(shí)踐安裝過程
本文將nsq集群具體的安裝過程略去,大家可以自行參考官網(wǎng),比較簡單。這部分介紹下筆者實(shí)驗(yàn)的拓?fù)洌约皀sqadmin的相關(guān)信息。
3.1 拓?fù)浣Y(jié)構(gòu)
topology
實(shí)驗(yàn)采用3臺(tái)NSQD服務(wù),2臺(tái)LOOKUPD服務(wù)。
采用官方推薦的拓?fù)洌l(fā)布的服務(wù)和NSQD在一臺(tái)主機(jī)。一共5臺(tái)機(jī)器。
NSQ基本沒有配置文件,配置通過命令行指定參數(shù)。
主要命令如下:
LOOKUPD命令
NSQD命令
工具類,消費(fèi)后存儲(chǔ)到本地文件。
發(fā)布一條消息
3.2 nsqadmin
對(duì)Streams的詳細(xì)信息進(jìn)行查看,包括NSQD節(jié)點(diǎn),具體的channel,隊(duì)列中的消息數(shù),連接數(shù)等信息。
nsqadmin
channel
列出所有的NSQD節(jié)點(diǎn):
nodes
消息的統(tǒng)計(jì):
msgs
lookup主機(jī)的列表:
hosts
4. 總結(jié)
NSQ基本核心就是簡單性,是一個(gè)簡單的隊(duì)列,這意味著它很容易進(jìn)行故障推理和很容易發(fā)現(xiàn)bug。消費(fèi)者可以自行處理故障事件而不會(huì)影響系統(tǒng)剩下的其余部分。
事實(shí)上,簡單性是我們決定使用NSQ的首要因素,這方便與我們的許多其他軟件一起維護(hù),通過引入隊(duì)列使我們得到了堪稱完美的表現(xiàn),通過隊(duì)列甚至讓我們?cè)黾恿藥讉€(gè)數(shù)量級(jí)的吞吐量。越來越多的consumer需要一套嚴(yán)格可靠性和順序性保障,這已經(jīng)超過了NSQ提供的簡單功能。
結(jié)合我們的業(yè)務(wù)系統(tǒng)來看,對(duì)于我們所需要傳輸?shù)陌l(fā)票消息,相對(duì)比較敏感,無法容忍某個(gè)nsqd宕機(jī),或者磁盤無法使用的情況,該節(jié)點(diǎn)堆積的消息無法找回。這是我們沒有選擇該消息中間件的主要原因。簡單性和可靠性似乎并不能完全滿足。相比Kafka,ops肩負(fù)起更多負(fù)責(zé)的運(yùn)營。另一方面,它擁有一個(gè)可復(fù)制的、有序的日志可以提供給我們更好的服務(wù)。但對(duì)于其他適合NSQ的consumer,它為我們服務(wù)的相當(dāng)好,我們期待著繼續(xù)鞏固它的堅(jiān)實(shí)的基礎(chǔ)。
在開始之前,希望你計(jì)算一下 Part1 共占用的大小是多少呢?
輸出結(jié)果:
這么一算, Part1 這一個(gè)結(jié)構(gòu)體的占用內(nèi)存大小為 1+4+1+8+1 = 15 個(gè)字節(jié)。相信有的小伙伴是這么算的,看上去也沒什么毛病
真實(shí)情況是怎么樣的呢?我們實(shí)際調(diào)用看看,如下:
輸出結(jié)果:
最終輸出為占用 32 個(gè)字節(jié)。這與前面所預(yù)期的結(jié)果完全不一樣。這充分地說明了先前的計(jì)算方式是錯(cuò)誤的。為什么呢?
在這里要提到 “內(nèi)存對(duì)齊” 這一概念,才能夠用正確的姿勢去計(jì)算,接下來我們?cè)敿?xì)的講講它是什么
有的小伙伴可能會(huì)認(rèn)為內(nèi)存讀取,就是一個(gè)簡單的字節(jié)數(shù)組擺放
上圖表示一個(gè)坑一個(gè)蘿卜的內(nèi)存讀取方式。但實(shí)際上 CPU 并不會(huì)以一個(gè)一個(gè)字節(jié)去讀取和寫入內(nèi)存。相反 CPU 讀取內(nèi)存是 一塊一塊讀取 的,塊的大小可以為 2、4、6、8、16 字節(jié)等大小。塊大小我們稱其為 內(nèi)存訪問粒度 。如下圖:
在樣例中,假設(shè)訪問粒度為 4。 CPU 是以每 4 個(gè)字節(jié)大小的訪問粒度去讀取和寫入內(nèi)存的。這才是正確的姿勢
另外作為一個(gè)工程師,你也很有必要學(xué)習(xí)這塊知識(shí)點(diǎn)哦 :)
在上圖中,假設(shè)從 Index 1 開始讀取,將會(huì)出現(xiàn)很崩潰的問題。因?yàn)樗膬?nèi)存訪問邊界是不對(duì)齊的。因此 CPU 會(huì)做一些額外的處理工作。如下:
從上述流程可得出,不做 “內(nèi)存對(duì)齊” 是一件有點(diǎn) "麻煩" 的事。因?yàn)樗鼤?huì)增加許多耗費(fèi)時(shí)間的動(dòng)作
而假設(shè)做了內(nèi)存對(duì)齊,從 Index 0 開始讀取 4 個(gè)字節(jié),只需要讀取一次,也不需要額外的運(yùn)算。這顯然高效很多,是標(biāo)準(zhǔn)的 空間換時(shí)間 做法
在不同平臺(tái)上的編譯器都有自己默認(rèn)的 “對(duì)齊系數(shù)”,可通過預(yù)編譯命令 #pragma pack(n) 進(jìn)行變更,n 就是代指 “對(duì)齊系數(shù)”。一般來講,我們常用的平臺(tái)的系數(shù)如下:
另外要注意,不同硬件平臺(tái)占用的大小和對(duì)齊值都可能是不一樣的。因此本文的值不是唯一的,調(diào)試的時(shí)候需按本機(jī)的實(shí)際情況考慮
輸出結(jié)果:
在 Go 中可以調(diào)用 unsafe.Alignof 來返回相應(yīng)類型的對(duì)齊系數(shù)。通過觀察輸出結(jié)果,可得知基本都是 2^n ,最大也不會(huì)超過 8。這是因?yàn)槲沂痔幔?4 位)編譯器默認(rèn)對(duì)齊系數(shù)是 8,因此最大值不會(huì)超過這個(gè)數(shù)
在上小節(jié)中,提到了結(jié)構(gòu)體中的成員變量要做字節(jié)對(duì)齊。那么想當(dāng)然身為最終結(jié)果的結(jié)構(gòu)體,也是需要做字節(jié)對(duì)齊的
接下來我們一起分析一下,“它” 到底經(jīng)歷了些什么,影響了 “預(yù)期” 結(jié)果
在每個(gè)成員變量進(jìn)行對(duì)齊后,根據(jù)規(guī)則 2,整個(gè)結(jié)構(gòu)體本身也要進(jìn)行字節(jié)對(duì)齊,因?yàn)榭砂l(fā)現(xiàn)它可能并不是 2^n ,不是偶數(shù)倍。顯然不符合對(duì)齊的規(guī)則
根據(jù)規(guī)則 2,可得出對(duì)齊值為 8。現(xiàn)在的偏移量為 25,不是 8 的整倍數(shù)。因此確定偏移量為 32。對(duì)結(jié)構(gòu)體進(jìn)行對(duì)齊
Part1 內(nèi)存布局:axxx|bbbb|cxxx|xxxx|dddd|dddd|exxx|xxxx
通過本節(jié)的分析,可得知先前的 “推算” 為什么錯(cuò)誤?
是因?yàn)閷?shí)際內(nèi)存管理并非 “一個(gè)蘿卜一個(gè)坑” 的思想。而是一塊一塊。通過空間換時(shí)間(效率)的思想來完成這塊讀取、寫入。另外也需要兼顧不同平臺(tái)的內(nèi)存操作情況
在上一小節(jié),可得知根據(jù)成員變量的類型不同,其結(jié)構(gòu)體的內(nèi)存會(huì)產(chǎn)生對(duì)齊等動(dòng)作。那假設(shè)字段順序不同,會(huì)不會(huì)有什么變化呢?我們一起來試試吧 :-)
輸出結(jié)果:
通過結(jié)果可以驚喜的發(fā)現(xiàn),只是 “簡單” 對(duì)成員變量的字段順序進(jìn)行改變,就改變了結(jié)構(gòu)體占用大小
接下來我們一起剖析一下 Part2 ,看看它的內(nèi)部到底和上一位之間有什么區(qū)別,才導(dǎo)致了這樣的結(jié)果?
符合規(guī)則 2,不需要額外對(duì)齊
Part2 內(nèi)存布局:ecax|bbbb|dddd|dddd
通過對(duì)比 Part1 和 Part2 的內(nèi)存布局,你會(huì)發(fā)現(xiàn)兩者有很大的不同。如下:
仔細(xì)一看, Part1 存在許多 Padding。顯然它占據(jù)了不少空間,那么 Padding 是怎么出現(xiàn)的呢?
通過本文的介紹,可得知是由于不同類型導(dǎo)致需要進(jìn)行字節(jié)對(duì)齊,以此保證內(nèi)存的訪問邊界
那么也不難理解,為什么 調(diào)整結(jié)構(gòu)體內(nèi)成員變量的字段順序 就能達(dá)到縮小結(jié)構(gòu)體占用大小的疑問了,是因?yàn)榍擅畹販p少了 Padding 的存在。讓它們更 “緊湊” 了。這一點(diǎn)對(duì)于加深 Go 的內(nèi)存布局印象和大對(duì)象的優(yōu)化非常有幫
英文原文鏈接【Go, the unwritten parts】 發(fā)表于2017/05/22 作者JBD是Go語言開發(fā)小組成員
檢查程序的執(zhí)行路徑和當(dāng)前狀態(tài)是非常有用的調(diào)試手段。核心文件(core file)包含了一個(gè)運(yùn)行進(jìn)程的內(nèi)存轉(zhuǎn)儲(chǔ)和狀態(tài)。它主要是用來作為事后調(diào)試程序用的。它也可以被用來查看一個(gè)運(yùn)行中的程序的狀態(tài)。這兩個(gè)使用場景使調(diào)試文件轉(zhuǎn)儲(chǔ)成為一個(gè)非常好的診斷手段。我們可以用這個(gè)方法來做事后診斷和分析線上的服務(wù)(production services)。
在這篇文章中,我們將用一個(gè)簡單的hello world網(wǎng)站服務(wù)作為例子。在現(xiàn)實(shí)中,我們的程序很容易就會(huì)變得很復(fù)雜。分析核心轉(zhuǎn)儲(chǔ)給我們提供了一個(gè)機(jī)會(huì)去重構(gòu)程序的狀態(tài)并且查看只有在某些條件/環(huán)境下才能重現(xiàn)的案例。
作者注 : 這個(gè)調(diào)試流程只在Linux上可行。我不是很確定它是否在其它Unixs系統(tǒng)上工作。macOS對(duì)此還不支持。Windows現(xiàn)在也不支持。
在我們開始前,需要確保核心轉(zhuǎn)儲(chǔ)的ulimit設(shè)置在合適的范圍。它的缺省值是0,意味著最大的核心文件大小是0。我通常在我的開發(fā)機(jī)器上將它設(shè)置成unlimited。使用以下命令:
接下來,你需要在你的機(jī)器上安裝 delve 。
下面我們使用的 main.go 文件。它注冊(cè)了一個(gè)簡單的請(qǐng)求處理函數(shù)(handler)然后啟動(dòng)了HTTP服務(wù)。
讓我們編譯并生產(chǎn)二進(jìn)制文件。
現(xiàn)在讓我們假設(shè),這個(gè)服務(wù)器出了些問題,但是我們并不是很確定問題的根源。你可能已經(jīng)在程序里加了很多輔助信息,但還是無法從這些調(diào)試信息中找出線索。通常在這種情況下,當(dāng)前進(jìn)程的快照會(huì)非常有用。我們可以用這個(gè)快照深入查看程序的當(dāng)前狀態(tài)。
有幾個(gè)方式來獲取核心文件。你可能已經(jīng)熟悉了奔潰轉(zhuǎn)儲(chǔ)(crash dumps)。它們是在一個(gè)程序奔潰的時(shí)候?qū)懭氪疟P的核心轉(zhuǎn)儲(chǔ)。Go語言在缺省設(shè)置下不會(huì)生產(chǎn)奔潰轉(zhuǎn)儲(chǔ)。但是當(dāng)你把 GOTRACEBACK 環(huán)境變量設(shè)置成“crash”,你就可以用 Ctrl+backslash 才觸發(fā)奔潰轉(zhuǎn)儲(chǔ)。如下圖所示:
上面的操作會(huì)使程序終止,將堆棧跟蹤(stack trace)打印出來,并把核心轉(zhuǎn)儲(chǔ)文件寫入磁盤。
另外個(gè)方法可以從一個(gè)運(yùn)行的程序獲得核心轉(zhuǎn)儲(chǔ)而不需要終止相應(yīng)的進(jìn)程。 gcore 可以生產(chǎn)核心文件而無需使運(yùn)行中的程序退出。
根據(jù)上面的操作,我們獲得了轉(zhuǎn)儲(chǔ)而沒有終止對(duì)應(yīng)的進(jìn)程。下一步就是把核心文件加載進(jìn)delve并開始分析。
差不多就這些。delve的常用操作都可以使用。你可以backtrace,list,查看變量等等。有些功能不可用因?yàn)槲覀兪褂玫暮诵霓D(zhuǎn)儲(chǔ)是一個(gè)快照而不是正在運(yùn)行的進(jìn)程。但是程序執(zhí)行路徑和狀態(tài)全部可以訪問。
數(shù)組是一個(gè)由 固定長度 的 特定類型元素 組成的序列,一個(gè)數(shù)組可以由零個(gè)或多個(gè)元素組成。 數(shù)組是值類型
數(shù)組的每個(gè)元素都可以通過索引下標(biāo)來訪問,索引下標(biāo)的范圍是從0開始到數(shù)組長度減1的位置,內(nèi)置函數(shù) len() 可以返回?cái)?shù)組中元素的個(gè)數(shù)。
2.類型的打印,結(jié)果的第二種打印方式
3.對(duì)元素的修改或者賦值
4.判斷數(shù)組是否相等:長度、類型
4.數(shù)組的地址:連續(xù)存儲(chǔ)的空間
5.數(shù)組的賦值、地址、取值
6.數(shù)組的默認(rèn)值
7.數(shù)組的初始化
8.數(shù)組的逆置
9.求數(shù)組的最大值、最小值、平均值
10.對(duì)數(shù)組字符串進(jìn)行連接
11.冒泡排序法的實(shí)現(xiàn)
12.數(shù)組做函數(shù)的參數(shù)
13.二維數(shù)組:賦值和地址
14.二維數(shù)組:打印和輸出
15. 指針數(shù)組,每一個(gè)元素都是地址
17.數(shù)組的內(nèi)存分配
應(yīng)用程序發(fā)生異常 未知的軟件異常
1.病毒木馬造成的,在當(dāng)今互聯(lián)網(wǎng)時(shí)代,病毒坐著為了獲得更多的牟利,常用病毒綁架應(yīng)用程序和系統(tǒng)文件,然后某些安全殺毒軟件把被病毒木馬感染的應(yīng)用程序和系統(tǒng)文件當(dāng)病毒殺了導(dǎo)致的。
2.應(yīng)用程序組件丟失,應(yīng)用程序完整的運(yùn)行需要一些系統(tǒng)文件或者某些ll文件支持的,如果應(yīng)用程序組件不完整也會(huì)導(dǎo)致的。
3.系統(tǒng)文件損壞或丟失,盜版系統(tǒng)或Ghost版本系統(tǒng),很容易出現(xiàn)該問題。
4.操作系統(tǒng)自身的問題,操作系統(tǒng)本身也會(huì)有bug 。
5.硬件問題,例如內(nèi)存條壞了或者存在質(zhì)量問題,或者內(nèi)存條的金手指的灰塵特別多。
應(yīng)用程序發(fā)生異常怎么辦
1.檢查電腦是否存在病毒,請(qǐng)使用百度衛(wèi)士進(jìn)行木馬查殺。
2.系統(tǒng)文件損壞或丟失,盜版系統(tǒng)或Ghost版本系統(tǒng),很容易出現(xiàn)該問題。建議:使用完整版或正版系統(tǒng)。
3.安裝的軟件與系統(tǒng)或其它軟件發(fā)生沖突,找到發(fā)生沖突的軟件,卸載它。如果更新下載補(bǔ)丁不是該軟件的錯(cuò)誤補(bǔ)丁,也會(huì)引起軟件異常,解決辦法:卸載該軟件,重新下載重新安裝試試。順便檢查開機(jī)啟動(dòng)項(xiàng),把沒必要啟動(dòng)的啟動(dòng)項(xiàng)禁止開機(jī)啟動(dòng)。
4.如果檢查上面的都沒問題,可以試試下面的方法。
打開開始菜單→運(yùn)行→輸入cmd→回車,在命令提示符下輸入下面命令 for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1回車。
完成后,在輸入下面
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回車。
如果怕輸入錯(cuò)誤,可以復(fù)制這兩條指令,然后在命令提示符后擊鼠標(biāo)右鍵,打“粘貼”,回車,耐心等待,直到屏幕滾動(dòng)停止為止。(重啟電腦)。
本文名稱:go語言內(nèi)存上限設(shè)置 golang限制最大內(nèi)存
當(dāng)前URL:http://m.kartarina.com/article30/hjjspo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、域名注冊(cè)、定制網(wǎng)站、App開發(fā)、網(wǎng)站內(nèi)鏈、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)