檢查硬碟完整性竟導致系統資料毀損,外媒發現 Windows 10 20H2 新問題_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

Windows 10 每次更新出現 Bug 已經不是什麼新聞,最近德國媒體 Planet 3D Now 就發現了一個很有問題的 Bug。這個問題一般人未必會用得到,但稍微懂一點電腦的人可能比較容易觸發。根據引發的狀況,無論如何都會出現 BSoD 藍色當機畫面,當機畫面顯示後會進入系統自動修復程序,但根據 Planet 3D Now 的報導,他們發現這個自動修復程序仍然無法解決這個狀況,並發現系統檔案在這個過程中已經毀損。而目前判斷僅有系統版號為 19042.685 的 Windows 10 系統將會出現這個問題,即便虛擬系統環境下,也能重現這個 Bug:

▲Windows 10 這次被自己內建的指令打敗了(圖片來源)

很多熟悉 Windows 系統的玩家多半知道一些終端機指令的實用操作,chkdsk 就是很多玩家熟悉的「檢查硬碟」指令。這個指令搭配一些參數後,可以檢測硬碟完整度,確認硬碟是否有嚴重的損壞或系統資料的毀損。這個指令相當歷史悠久,筆者至少記得在 DOS 系統能使用,而最新的 Windows 10 依然保有這個指令功能。不過這個堪稱骨灰級的指令,卻成為 Windows 10 20H2 的被發現的新問題來源之一。

一個更新竟讓專職檢查硬碟的指令成為當機兇手

根據外媒 Planet 3D Now 給出的結論,這個現象能在一般電腦與虛擬機器中發現,非常容易觸發。考慮到一般人未必會使用這個指令檢查硬碟,因此若非具備一定程度的電腦或 Windows 系統知識,未必會引發這個問題。根據 Planet 3D Now 與其他網友的測試後,發現只要在管理員權限下開啟終端機並輸入 chkdsk c: /f,就會立刻當機,並提示「NTFS FILE SYSTEM 錯誤」,嚴重的甚至會讓系統資料毀損:

▲國外網友很熱心的針對一整個教室的電腦實驗這個 Bug,發現通通無一例外的當機(圖片來源)

目前這個問題已經回報給 Microsoft,相信不久之後這個問題將能獲得解決。不過,一個小小的 chkdsk 指令竟然直接能讓 Windows 10 最新版本系統當機,這對微軟來說的確是個嚴重的形象問題。作為一個電腦編輯, chkdsk 指令雖然不見得天天使用,但至少知道這是個 Windows 內建的功能之一。如果內建功能都能讓系統出現嚴重的當機,那麼 Windows 10 20H2 系統在用戶心中的信賴度將會大幅下降。

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

另外,Planet 3D Now 根據網友們的反覆測試後提出一個新的發現,就是已經過安裝更新,使得系統版本號碼變更為 19042.685 的 Windows 10 20H2 系統肯定會出現這個狀況。但乾淨安裝的 Windows 10 20H2 並不會引發這個問題。從這個發現反推回微軟的更新時間表,可以發現 KB4592438 這個更新正好符合這些特徵。因此若已經安裝此更新的 Windows 10 20H2 系統有可能引發這個 Bug :

▲目前得知更新後成為特定版本的 Windows 10 將出現這個問題(圖片來源)

消息來源:PC Watch

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

其實 AirPods Max 閒置 5 分鐘就會進入 Smart Case 低耗電模式,還有個超低耗電模式等著呢_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

儘管 AirPods Max 已經是蘋果主動降噪無線耳機中續航最長,可達 20 小時連續聆聽時間的存在。然而,許多人似乎對於將這台美型耳機塞回具備 Smart Case 聰穎耳機套感到有些抗拒(?)。但仍會擔心假如無法藉由它啟動低耗電 AirPods Max 是否就會續航不足?好在,蘋果最近釋出了支援文件,分別提到了有無放在耳機套中,低功耗功能啟動的時機點。繼續閱讀其實 AirPods Max 閒置 5 分鐘就會進入 Smart Case 低耗電模式,還有個超低耗電模式等著呢報導內文。

【 AirPods Max 官網購買頁面 】


▲圖片來源:Apple

其實 AirPods Max 閒置 5 分鐘就會進入 Smart Case 低耗電模式,還有個超低耗電模式等著呢

▲圖片來源:Apple

雖然 AirPods Max 支援充電 5 分鐘即可獲得 1.5 小時聆聽時間的快充功能,不過無線耳機的重點想必就是「無線」這兩個字,所以大多數人應該都會希望在使用過程中盡量不需要插線使用吧!好在,這次的蘋果耳罩式主動降噪無線耳機 AirPods Max 支援最高 20 小時的聆聽時間,理論上來講應該能夠支援大多數人整天甚至多天的使用。

但很多人也會對於搭配聰穎耳機套來盡量省電的必要性有所疑問。現在,透過官方的說明文件,我們終於知道 AirPods Max「各種」低功耗模式的觸發時間點,在有無搭配聰穎耳機套的正確資訊。

▲圖片來源:Apple

簡單的講,AirPods Max 分為幾個「狀態」:

· 透過光感應確認耳機離開耳朵的暫停狀態,類似暫停。
· 靜置超過一定時間或收納到 Smart Case 聰穎耳機套內進入省電模式,類似待機。

上述兩者再維持更長時間後,則是會進入類似休眠的「超低耗電模式」。將會關閉藍牙與 Find My 尋機功能。

▲圖片來源:Apple

以上,其實大多數人關心的是耳機如果不搭配聰穎耳機套的話,是否就會一直處於暫停狀態造成續航損耗過多。而根據官方的說法,雖然想省電還是將 AirPods Max 放入聰穎耳機套最快,會立即啟動低耗電模式。不過其實這款耳機只要靜止閒置 5 分鐘的時間也就會進入放入聰穎耳機套的狀態。

沒錯,兩者就只差 5 分鐘而已。沒先前傳出的 18 小時那樣久。

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

至於更低功耗的 Ultra-low power 超低耗電模式則是需要再等 18 小時(Smart Case)/ 72 小時(靜置)才會啟動。

▲圖:說明文件提到,AirPods Max 耳機上也會有類似以往 AirPods 充電盒顯示有無低於 15% 電量的狀態燈號。

是說,除了超低耗電模式到底能讓 AirPods 續航延長到多少,該如何喚醒,還有包括「靜置(stationary)」的定義也蠻讓人好奇的 — 是代表儘管是塞在包包裡,只要有偵測到動態就會恢復一般的暫停狀態嗎?

假若如此,這應該代表 AirPods Max 放在固定場地使用的話,是不太需要塞回聰穎耳機套中。不過如果想保證通勤移動過程中攜帶時的低耗電狀態,最有效延長外出時的續航時間,也許原廠的耳機套(或類似功能的專用攜行盒)都還是要裝回比較好囉。

【 AirPods Max 官網購買頁面 】

本篇圖片 / 引用來源

延伸閱讀:

HomePod mini 開箱體驗:一顆就能敲開蘋果智慧家門,兩顆更是不嫌多

AirPods Max 過保電池維修價格公佈,這算… 便宜?

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

如果你是愛用 GoPro 進行創作的朋友,應該不會對官方的遙控器裝置太陌生 — 基本上就是個讓你在無法觸及 GoPro 運動相機時,可以幫忙執行各種設定與拍攝的好夥伴。而隨著新世代的 Hero9 推出,他們則是再推出了一款算是先前超小巧方形的藍牙遙控器的升級版「The Remote」,是說這中文應該就只叫做遙控器?繼續閱讀 GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機報導內文。

▲圖片來源:GoPro

GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機

說起來這次新推的 GoPro 遙控器,比較像是介於很早以前的 Wi-Fi 遙控器與後來推出的藍牙遙控器之間的產品 — 同時可以控制的相機數也是,搭載螢幕的 Wi-Fi 版本,可以一次遙控 50 台是其中最高階的存在(算是吧);外型就是「一顆按鈕」且支援語音功能的藍牙遙控器,則是僅能與單機連線;這次的新款遙控器,則是可以跟 5 台支援的機型,包括:GoPro Hero9、 Hero8 與 Max 連線使用。

▲圖片來源:GoPro

儘管 GoPro 在官網寫上了它搭載了大尺寸的「高解析度螢幕」。不過很可惜,它支援的顯示功能其實比較接近於 Hero8 的前螢幕,並非 Hero9 的全彩自拍螢幕 — 雖然官方真的打上了 high-resolution display。

遙控距離方面,相對於先前藍牙遙控器的 10 公尺,這次的版本更遠到了 60 公尺,並支援水下最深近 5 公尺的防水能力。但最遠距離還是由 Wi-Fi 版本的智慧遙控器的 180 公尺為最強。

▲圖片來源:GoPro

機身上則是除了正面的拍攝鈕外,側面還有模式與設定按鈕共 4 顆按鈕(其中一個從官圖看不出來,但應該在頂部,也許是電源鈕吧)。大螢幕的好處是,這次的遙控器不再像 Wi-Fi 版本那樣,一切資訊擠成一團,讓人很難在激烈的運動活動下快速查看,並會直接顯示剩餘電量的百分比而非圖示(這個好,誒… 應該是相機電量吧?),遙控器螢幕的頂部也有錄影燈號。

The Remote 現已在美國官網開賣,建議售價為 US$80(約 NT$2,300),據稱其他國家的開賣時間將會需要等到明年二月。所以如果急著要入手的話,可能就只能從海外官網入手囉。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

本篇圖片 / 引用來源

延伸閱讀:

HomePod mini 開箱體驗:一顆就能敲開蘋果智慧家門,兩顆更是不嫌多

其實 AirPods Max 閒置 5 分鐘就會進入 Smart Case 低耗電模式,還有個超低耗電模式等著呢

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

​雲中奈飛(一):Netflix的上雲之旅_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

作者按: 

Netflix(譯為奈飛/網飛)公司自1997年創立以來,已發展成為美國最大的互聯網流媒體服務商。它從2008到2015年間長達七年的將其所有IT系統從自有數據中心遷移到AWS之上的旅程,在當時可謂前無古人的創舉,對公有雲的發展、傳統企業上雲及基於雲的業務轉型等都有很大的推動和促進作用。雖然已過去多年,有些東西已略微顯得過時,但奈飛上雲的理念、步驟、做法等,對當今企業上雲及用雲仍有很大的參考價值。 

因此,在接下來的幾周內,筆者打算花上些許時間,對奈飛的上雲之旅,及其雲上運行,基於網上公開資料,從上雲歷程、雲上架構、支撐團隊、雲上安全等維度做下梳理和總結,形成系列文章。它山之石,可以攻玉。本文為這系列文章的第一篇,介紹奈飛的總體上雲歷程。

 

本文目錄

零、公司簡介………………………………… 1

一、發端………………………………………. 4

二、驗證………………………………………. 6

三、進行………………………………………. 8

四、完成………………………………………. 11 

五、筆者感受

 

零、公司簡介

 

 

Netflix(https://www.netflix.com/)公司總部設在美國加利福尼亞州,是全世界最大的視頻流媒體平台,在除中國大陸地區以外的所有國家和地區均提供視頻點播服務,相當於國內的愛奇藝、優酷和騰訊視頻等視頻網站。 

1997年,當Reed Hastings和Marc Randolph創建 Netflix時,這家公司唯一業務是DVD郵購業務。2002年上市,股票發行價為15美元;2007年開始發展流媒體業務;2013年,發布其首部原創電視劇《紙牌屋》;2016年宣布全球化,全世界200多個國家和地區可訂閱Netflix觀看電影電視劇。 2017年,Netflix用戶數量超過美國有線電視用戶總數。如今,Netflix的股價是419美元,已成為世界上大型的電視劇和電影製片公司之一、美國最大的互聯網流媒體服務商,在世界範圍內擁有很強的影響力,高峰時刻佔據了互聯網流媒體流量的33%。 

 

除了商業上非常成功外,Netflix在技術上也非常成功,它雖然是家娛樂公司,但實際上是一家技術公司。從2008年開始,直到2015年底,它花了整整七年時間,把公司整套IT系統搬到了AWS上。這可謂前無來者。除此之外,Netflix在分佈式系統開源上具有巨大的影響力,其開源項目叫做Netflix OSS(Open Source Software),涵蓋範圍基本包括了業界絕大部分分佈式系統領域,包括但不限於: 

·       公共運行時服務及庫,比如Eureka, Ribbon, Hystrix

·       大數據,比如Genie

·       構建和發布工具,比如Asgard/Spinnaker

·       數據持久化,比如EVCache

·       可觀察性、可靠性和性能,比如Simian Army 

 

一、發端

 

Netflix的上雲之旅始於2008年8月。從公開資料來看,當時主要有兩個驅動力促使其上雲: 

(1)發生了系統宕機。 

當時,Netflix的IT系統運行在高端昂貴的IBM服務器、Oracle數據庫和SAN存儲搭建的平台之上。某次,因為SAN存儲硬件故障導致的數據庫宕機,使得Netflix的DVD配送服務不得不停止了3天。這個故障使得公司管理層開始意識到,由IT團隊利用昂貴的平台來保證系統可用性的做法存在問題,更應該從應用層面去保障系統可用性。因此,需考慮IT系統從傳統垂直擴展的帶有單點故障的架構,轉向高可用、水平擴展的分佈式架構。與此同時,他們開始思考是否可以利用剛剛出現的低成本雲基礎設施來替代昂貴傳統IT基礎設施來支撐需具備高可用性的應用。

 

 

(2)新業務帶來巨大數據中心擴容壓力。 

Netflix的傳統DVD寄送服務的服務模式下,客戶瀏覽Netflix網站選擇DVD,然後公司開始寄送。因為受到DVD來回寄送速度的限制,通常是以周為周期給客戶寄送DVD。因此,這種傳統業務模式對IT系統的業務壓力較輕。 

傳統DVD寄送業務模式

 

儘管DVD業務增長迅速,但2007年Netflix仍然決定推出第一款流媒體產品“Watch Now”來革新其業務。這種業務也是它後來蓬勃發展的關鍵因素之一。這種新服務模式下,用戶與Netflix網站之間的交互頻率是傳統DVD寄送業務下交互頻率的100倍甚至不止。 

流媒體服務模式

 

新模式下,用戶每周看的視頻數量是之前的十倍,而每個視頻對數據中心中的IT系統產生的流量則是百倍,因此每個用戶對IT系統產生的流量是之前的千倍。也就是說,只要0.1%的用戶從傳統模式轉向新模式,那IT系統的容量就必須翻倍。其實這種規律也很常見。即使用戶並沒有顯著增長,只要因為業務模式的變化,對IT系統的壓力也可能成倍增加。 

這就要求Netflix找到一種快速擴容數據中心的方法,因為根據當時的業務預測,其用戶很快就會轉向在線流媒體服務模式。時間來到2009年,隨着新業務的發展,Netflix面臨兩個選擇:自建數據中心,或利用其業務競爭對手亞馬遜於2006年才發布的AWS雲。前者需要大量前期資金投入,並且未來的容量需求無法預測且是變化不定的,而後者則是在視頻流領域的最大競爭對手Amazon的雲上開展業務。Netflix決定選擇後者。他們認為,相比在不實際產生業務價值的數據中心上做前期巨大投入,將資金投入在視頻內容和開發人員身上會更有價值。

 

 

二、驗證

於是這一年(2009年),Netflix開始研究利用AWS雲來開展業務的各種風險,包括業務競爭風險、規模性風險、商業風險和公關風險等。就業務競爭風險,Netflix與AWS溝融了AWS是如何與Amazon Premier做業務分離的。然後開展實驗去驗證AWS上的資源快速擴容能力。Netflix還與AWS簽訂了首批企業許可協議,這種協議下Netflix不需要通過授權信用卡方式來使用AWS資源,而信用卡授權是當時大多數人在AWS上消費時使用的主要方式。 

隨着兩家合作消息的傳開,2010年4月,紐約時報還發表了一篇關於Netflix和AWS業務的文章,說兩者將進行業務合作。請注意其中的“peculiar(特有)“一詞,表示那時候企業上雲是新聞,而上到競爭對手的雲上更是新聞。 

 

當時Netflix還諮詢了一些業界專家,專家們認為這種做法非常瘋狂,因為當時很少有企業這麼做,而且企業業務上雲在當時還是一個非常不成熟的策略。但Netflix決定堅持下去,成為首批上雲企業客戶之一。 

接下來,Netflix實驗性地將一些沒有真正面向客戶的應用遷移到AWS上。首先從電影編碼開始,當時其只有數據中心沒有足夠的容量來容納編碼服務器。有一次Netflix申請3000台服務器,結果AWS一個小時內就交付了,這就驗證AWS資源交付的彈性和及時性。而且隨着這項工作的完成,不用的機器即被釋放,這證明了雲計算的“按需使用和付費”特徵。

接下來驗證視頻服務QoS日誌上雲。隨着進入數據中心數據庫的流量越來越多,這些流量正在溢出,而且自己的機房缺乏足夠的存儲空間來保存想要的信息。於是,Netflix利用S3來存儲數據,利用EMR來處理數據。Netflix是Hadoop早期用戶之一,曾與AWS合作將Hive作為基於EMR的處理選項。

 

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

 

到2010年,可行性驗證基本完成,Netflix認為上雲看起來是可行的。於是2011年,Netflix作出決定,不再擴容自有IDC。

 

三、進行

 

Netflix開始真正地要在AWS雲上起飛了。從最簡單的API服務開始,然後是最簡單的Web網頁,然後是更多的API和網頁。

 

到2010年底,Netflix成功地將網站前端都遷移到了AWS上,但後端依然在自有數據中心內。

 

用戶訪問流量還是進入其自有數據中心,但是有選擇地將部分流量利用HTTP Redirect將請求轉向AWS Cloud。這其實也就是我們現在常常提到的金絲雀模式,通過導入部分用戶到新環境上來驗證和逐步地完成系統遷移。

 

 

接下來是數據遷移。2010年的主要工作之一,是將主數據系統放在數據中心,將副本放在雲中,並將數據從本地持續地同步到雲中。

 

 

2011年,Netflix決定將所有數據放到雲上。其中一個問題是如何做數據備份。Netflix沒有採用當時常見的利用本地數據中心中的磁帶來備份雲中數據的做法,而是充分利用了S3的安全性和持久性,用不同的賬戶在不同的AWS區域中創建S3存儲桶,然後將生產數據導入生產區域S3存儲桶,再經過壓縮和加密並傳送到容災區域的桶中。利用不同的賬戶,主要是從安全角度考慮。後來,AWS發布了Glacier后,Netflix利用它來做長期歸檔的數據存儲。

 

 

 

到2015年,除了計費和賬單系統外,其餘所有系統都已經遷移到AWS上了。到2016年1月4日,Netflix完成了最後這兩個系統的遷移,詳細信息請參加其公司博客https://netflixtechblog.com/netflix-billing-migration-to-aws-451fba085a4。

 

 

四、完成

 

2016年2月,Netflix宣布其上雲遷移工作全部完成。這一年,Netflix的用戶數是2008年開始上雲遷移時候的8倍,而用戶的月度觀看視頻數則有幾千倍的增長,用戶遍布全球超過130個國家,Netflix也成為了一家國際化視頻服務提供商。

 

到2017年,除了CDN由其自建外,Netflix使用AWS來滿足其幾乎所有計算和存儲需求,包括數據庫、分析、建議引擎、視頻轉碼等數百種功能。而且,Netflix系統的可用性在持續增加,正在不斷接近99.99%的既定目標。

  • Netflix的視頻服務在高峰時段佔據了高達37%的Internet流量。相比之下,YouTube 僅佔到15.6%,網頁瀏覽約 6%, Facebook約2.7%, Amazon Instant Video 約2.0%。

  • 在AWS上共利用超過10萬個 EC2 Instances 的80萬CPU Cores,且在此基礎上有約 20% 的波動。

  • 在每個服務區域上的 AWS Elastic Load Balancing 的流量超過 50Gbps

  • 在 S3 上存儲和管理超過15億個對象的 60 PB 的數據。其中每天要丟棄超過 400TB 的過期數據以及新增 600TB 的數據。

 

2016年Netflix在AWS上的系統架構:

儘管降低成本支出並不是Netflix上雲的主要出發點之一,但是實際上,現在每個視頻的播放成本是當初利用自有數據中心的幾分之一,這是一種非常可觀的額外收益。這主要歸功於雲的彈性,使得Netflix可以持續地優化實例類型,近乎實時地增加或減少所用的資源,而不需要維持大規模的備用容量,以及公有雲的規模不斷擴大帶來的單位成本下降。 

那為什麼需要7年時間才能完成上雲遷移呢?這是因為全業務上雲是一項艱巨的工作,需要做好多的艱難決策。可以想到的是,最簡單的方式是將所有系統緣分不斷地搬到雲上,但是隨着系統一起搬過去的還有你在傳統數據中心中遇到的所有問題和限制。因此,Netflix選擇了一條另外的道路,重構所有系統,徹底改變公司IT運營方式,將單體應用改變為微服務架構應用、重構數據模型、使用NoSQL數據庫。將過去那種預算嚴格受控制、版本發布嚴格受管控、花幾周時間來做物理容量擴容的傳統方式,改變為持續集成和發布、技術團隊獨立做決策、基於松耦合DevOps環境的新方式。這種方式使得Netflix花了七年時間才完成上雲之旅,但是正是這種轉變,也使得它成為了一家國際化的網絡視頻服務提供商。 

五、筆者感受

 

大膽決策,開先河。不說10年前,就是在現在,要不要上(公有)雲、源代碼和核心數據能不能上雲、雲上安全怎麼搞、以什麼步驟上雲、應用要不要做架構升級等等這些問題,依然是評估上雲時會引發爭論的話題。而十年前的Netflix,從自身業務出發,做出了艱難決策,決定把資金用在核心業務上,將數據中心外包給公有雲,這前無來者,開了業界先河。要為他們的眼光、勇氣和決心點贊!

先易后難,保安全。Netflix並非倉促上陣,而是總體上執行先易后難、先驗證再推廣的策略。從最簡單的API、網頁前端、離線視頻編碼系統等開始,做技術可行性驗證。驗證成功后,再推廣至其它系統,最後做最核心的賬單和支付系統遷移,在保障業務穩定和用戶體驗的前提下,花了七年時間才完成全部遷移工作。要為他們的務實精神點贊!

以終為始,高標準。Netflix並沒有簡單地將其IT系統從其自有數據中心搬到AWS上,而是以終為始,高標準完成遷移工作。“終”是系統的可用性要達到四個九,確保用戶體驗。要實現這個目標,需要在遷移上雲前對應用做分佈式改造。只有這樣,才能充分利用雲的彈性和分佈式能力。而且,Netflix主要利用的是AWS的IaaS,自研了全球分佈的PaaS平台。一方面是因為當時AWS所提供的是以IaaS為主,還考慮到了供應商綁定以及未來多雲等可能。這些做法都具有開創性和前瞻性,不僅這種做法對後來更多用戶如何上雲極具參考價值,而且Netflix將其PaaS中很多組件都開源了,直接促進了行業發展。要為他們對自己的嚴格要求和對業界的貢獻點贊!

 

參考資料:

  • 復盤Netflix發展史:如何用20年成為一家千億美元公司?,克魯斯2018年5月14日。https://www.gelonghui.com/p/179693

  • Completing the Netflix Cloud Migration,https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration,2016.1

  • YouTube video,Globally Distributed Cloud Applications at Netflix,October 2012,Adrian Cockcro

  • Migrating to Cloud – Lessons from Netflix, Brought Up to Date,Adrian Cockcroft,https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration

  • Companies Slowly Join Cloud-Computing,By Brad Stone and Ashlee Vance,https://www.nytimes.com/2010/04/19/technology/19cloud.html

 

感謝您的閱讀,歡迎關注我的微信公眾號:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

記一次接口性能優化實踐總結:優化接口性能的八個建議_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

前言

最近對外接口偶現504超時問題,原因是代碼執行時間過長,超過nginx配置的15秒,然後真槍實彈搞了一次接口性能優化。在這裏結合優化過程,總結了接口優化的八個要點,希望對大家有幫助呀~

  • 數據量比較大,批量操作數據入庫
  • 耗時操作考慮異步處理
  • 恰當使用緩存
  • 優化程序邏輯、代碼
  • SQL優化
  • 壓縮傳輸內容
  • 考慮使用文件/MQ等其他方式暫存,異步再落地DB
  • 跟產品討論需求最恰當,最舒服的實現方式

嘻嘻,先看一下我們對外轉賬接口的大概流程吧

1.數據量比較大,批量操作數據入庫

優化前:

//for循環單筆入庫
for(TransDetail detail:list){
  insert(detail);  
}

優化后:

// 批量入庫,mybatis demo實現
<insert id="insertBatch" parameterType="java.util.List">
insert into trans_detail( id,amount,payer,payee) values
 <foreach collection="list" item="item" index="index" separator=",">(
    #{item.id},	#{item.amount},
    #{item.payer},#{item.payee}
  )
</foreach>
</insert>

性能對比:

單位(ms) for循環單筆入庫 批量入庫
500條 1432 1153
1000條 1876 1425

解析

  • 批量插入性能更好,更加省時間,為什麼呢?
打個比喻:假如你需要搬一萬塊磚到樓頂,你有一個電梯,電梯一次可以放適量的磚(最多放500),
你可以選擇一次運送一塊磚,也可以一次運送500,你覺得哪種方式更方便,時間消耗更少?

2.耗時操作考慮異步處理

耗時操作,考慮用異步處理,這樣可以降低接口耗時。本次轉賬接口優化,匹配聯行號的操作耗時有點長,所以優化過程把它移到異步處理啦,如下:

優化前:

優化后

匹配聯行號的操作異步處理

性能對比:

假設一個聯行號匹配6ms

同步 異步
500條 3000ms ~
1000條 6000ms ~

解析:

  • 因為聯行號匹配比較耗時,放在異步處理的話,同步聯機返回可以省掉這部分時間,大大提升接口性能,並且不會影響到轉賬主流程功能。
  • 除了這個例子,平時我們類似功能,如用戶註冊成功后,短信郵件通知,也是可以異步處理的,這個優化建議香餑餑的~
  • 所以,太耗時的操作,在不影響主流程功能的情況下,可以考慮開子線程異步處理的啦。

3.恰當使用緩存

在適當的業務場景,恰當地使用緩存,是可以大大提高接口性能的。這裏的緩存包括:Redis,JVM本地緩存,memcached,或者Map等。

這次轉賬接口,使用到緩存啦,舉個簡單例子吧~

優化前

以下是輸入用戶賬號,匹配聯行號的流程圖

優化后:

恰當使用緩存,代替查詢DB表,流程圖如下:

解析:

  • 把熱點數據放到緩存,不用每次查詢都去DB拉取,節省了這部分查SQL的耗時,美滋滋呀~
  • 當然,不是什麼數據都適合放到緩存的哦,訪問比較頻繁的熱點數據才考慮緩存起來呢~

4. 優化程序邏輯、代碼

優化程序邏輯、程序代碼,是可以節省耗時的。

我這裏就本次的轉賬接口優化,舉個例子吧~

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

優化前:

優化前,聯行號查詢了兩次(檢驗參數一次,插入DB前查詢一次),如下偽代碼:


punlic void process(Req req){
  //檢驗參數,包括聯行號(前端傳來的payeeBankNo可以為空,但是如果後端沒匹配到,會拋異常)
   checkTransParams(Req req);
   //Save DB
  saveTransDetail(req); 
}

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount);
    //check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo())){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
}

int saveTransDetail(req){
    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
    req.setPayeeBankNo(payeebankNo);
    insert(req);
    ...
}

優化后:

優化后,只在校驗參數的時候插敘一次,然後設置到對象裏面~ 入庫前就不用再查啦,偽代碼如下:

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount);
    //check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo())){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
    //查詢到有聯行號,直接設置進去啦,這樣等下入庫不用再插入多一次
    req.setPayeeBankNo(payeebankNo);
}

int saveTransDetail(req){
    insert(req);
    ...
}

解析:

  • 對於優化程序邏輯、代碼,是可以降低接口耗時的。以上demo只是一個很簡單的例子,就是優化前payeeBankNo查詢了兩次,但是其實只查一次就可以了。很多時候,我們都知道這個點,但就是到寫代碼的時候,又忘記了呀~所以,寫代碼的時候,留點心吧,優化你的程序邏輯、代碼哦。
  • 除了以上demo這點,還有其它的點,如優化if複雜的邏輯條件,考慮是否可以調整順序,或者for循環,是否重複實例化對象等等,這些適當優化,都是可以讓你的代碼跑得更快的。

之前我這篇文章,也提了幾個優化點噢,有興趣的朋友可以看一下哈~

寫代碼有這些想法,同事才不會認為你是複製粘貼程序員

5. 優化你的SQL

很多時候,你的接口性能瓶頸就在SQL這裏,慢查詢需要我們重點關注的點呢。

我們可以通過這些方式優化我們的SQL:

  • 加索引
  • 避免返回不必要的數據
  • 優化sql結構
  • 分庫分表
  • 讀寫分離

有興趣的朋友可以看一下我這篇文章呢,很詳細的SQL優化點:

後端程序員必備:書寫高質量SQL的30條建議

6.壓縮傳輸內容

壓縮傳輸內容,文件變得更小,因此傳輸會更快啦。10M帶寬,傳輸10k的報文,一般比傳輸1M的會快呀;打個比喻,一匹千里馬,它馱着一百斤的貨跑得快,還是馱着10斤的貨物跑得快呢?

解析:

  • 如果你的接口性能不好,然後傳輸報文比較大的話,這時候是可以考慮壓縮文件內容傳輸的,最後優化效果可能很不錯哦~

7. 考慮使用文件/MQ等其他方式暫存數據,異步再落地DB

如果數據太大,落地數據庫實在是慢的話,可以考慮先用文件的方式保存,或者考慮MQ,先落地,再異步保存到數據庫~

本次轉賬接口,如果是併發開啟,10個併發度,每個批次1000筆數據,數據庫插入會特別耗時,大概10秒左右,這個跟我們公司的數據庫同步機制有關,併發情況下,因為優先保證同步,所以并行的插入變成串行啦,就很耗時。

優化前:

優化前,1000筆先落地DB數據庫,再異步轉賬,如下:

優化后:

先保存數據到文件,再異步下載下來,插入數據庫,如下:

解析:

  • 如果你的耗時瓶頸就在數據庫插入操作這裏了,那就考慮文件保存或者MQ或者其他方式暫存吧,文件保存數據,對比一下耗時,有時候會有意想不到的效果哦。

8.跟產品討論需求最恰當,最舒服的實現方式

這點個人覺得還是很重要的,有些需求需要好好跟產品溝通的。

比如有個用戶連麥列表展示的需求,產品說要展示所有的連麥信息,如果一個用戶的連麥列表信息好大,你拉取所有連麥數據回來,接口性能就降下來啦。如果產品打樁分析,會發現,一般用戶看連麥列表,也就看前幾頁因此,奸笑,哈哈 其實,那個超大分頁加載問題也是類似的。即limit +一個超大的數,一般會很慢的~~

總結

本文呢,基於一次對外接口耗時優化的實踐,總結了優化接口性能的八個點,希望對大家日常開發有幫助哦~嘻嘻,有興趣可以逛逛我的github哈,本文會收藏到github里滴哈

https://github.com/whx123/JavaHome

公眾號

  • 歡迎關注我個人公眾號,交個朋友,一起學習哈~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

【python系統學習16】編碼基礎知識_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

編碼

計算機是怎麼傳輸和存儲數據的?

就是把人類認識的中英文字、其他國家語言、数字甚至運算符等符號轉成二進制的0、1,並進行存儲和傳輸。

編碼

人類語言:中英文字、其他國家語言、数字甚至運算符等符號

計算機語言:二進制的0、1【沒錯,計算機只認識0和1】

編碼:將人類語言轉換為計算機語言。

除了0、1這些阿拉伯数字,像a、b、c這樣的52個字母(包括大小寫),還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字錶示哪個符號,理論上每個人都可以有自己的一套規則(這就叫編碼規則,形成編碼錶)。

如果使用了不同的編碼規則,就會有計算機識別不了的情況,出現亂碼

進制

二進制、八進制、十六進制。

八進制和十六進制分別是二進制的3次方和4次方。方便和二進制之間非常直接的相互轉換

二進制

由0和1構成的

二進制 十進制
00 0
01 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
  • 二進制的00,代表十進制的0
  • 二進制的01,代表十進制的1
  • 二進制的10,代表十進制的2【笑話:世界上有10種人,懂二進制的和不懂二進制的】
  • 二進制的11,代表十進制的3
  • 二進制的100,代表十進制的4
  • 以此類推…
  • 當有兩位數時,我們可以表示0到3,共4種狀態,即2的平方
  • 當有三位數時,我們可以表示0到7,共8種狀態,即2的三次方
  • 當有八位數時,我們可以表示0到255,共256種狀態,即2的8次方

八進制

使用0、1、2、3、4、5、6、7組成的

十六進制

使用0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f組成的

ASCII編碼錶中的“K”

二進制 八進制 十進制 十六進制 字母
01001011 113 75 4B K

注意這裏還是大寫的字母K哦~

存儲單位

計算機里的存儲單位

位/比特(bit)

位:又叫比特(bit)是計算機里最小的存儲單位。用來存放一位二進制書,即0或1。

字節(byte)

八個比特是一個字節,是計算機里最常用的單位。簡寫“B”

千字節(Kilobyte)

兆字節(Megabyte)

簡稱“兆”

吉字節(Gigabyte)

又叫千兆

單位換算

1B(byte 字節) = 8bit
1KB(Kilobyte 千字節) = 1024B
1MB(Megabyte 兆字節) = 1024KB
1GB(Gigabyte) = 1024MB

為什麼辦的100兆的寬帶,撐死就只有10幾兆的下載速度?

因為運營商的帶寬是以比特每秒為單位的,比如100M就是100Mbit/s。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

而我們常看到的下載速度KB卻是以字節每秒為單位显示的,1byte = 8bit,所以運營商說的帶寬得先除以8,你的百兆寬帶下載速度,也就是十幾兆了。

編碼錶

為了避免亂碼,人類就約定了一套共同的編碼規則。就像計算機世界的新華字典、牛津英語字典。

編碼錶歷史

ASCII

  • ASCII編碼(讀音:/ˈæski/),美國首先出台。統一規定了常用符號用哪些二進制數來表示。 因為英文字母、数字再加上其他常用符號,也就100來個,因此使用7個比特位(最多表示128位)就夠用了,所以一個字節中被剩下的那個比特位就被默認為0。

  • 但歐洲不光有英語,還有法語字母上的注音符。於是歐洲用了美國剩下的那個比特位,普遍使用一個全字節(8個比特位)進行編碼,最多可表示256位,至此,一個字節就用滿了!

ASCII統一了前面0-127位,但從狀態128到255這一段的解釋就完全亂套了,比如135在法語,希伯來語,俄語編碼中完全是不同的符號。

GB2312和GBK

  • 中國10萬漢字,256位也不夠用。於是一張新編碼錶
    GB2312被中國科學家發明了。 用2個字節,也就是16個比特位,來表示絕大部分(65535個)常用漢字。後來,為了能显示更多的中文,又出台了
    GBK標準。

Unicode

因各個國家的編碼錶都不同。不同國家間通信又會亂碼。

  • 於是
    Unicode(萬國碼)來統一。 這套編碼錶將世界上所有的符號都納入其中。每個符號都有一個獨一無二的編碼,現在Unicode可以容納100多萬個符號,所有語言都可以互通,一個網頁上也可以显示多國語言。

萬國碼的缺點是讓英文字符被迫佔用兩個字節,耗費計算機存儲空間。(如A:用00010001就行,但是為了順從統一,需要用兩個字節:00000000 00010001)

UTF-8

  • UTF-8(8-bit Unicode Transformation Format)被提出。針對Unicode的可變長度字符編碼。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。而當字符在ASCII碼的範圍時,就用一個字節表示,所以UTF-8還可以兼容ASCII編碼。

Unicode與UTF-8這種曖昧的關係一言以蔽之:Unicode是內存編碼的規範,而UTF-8是如何保存和傳輸Unicode的手段。

編碼錶對比

編碼錶 適用性 特點
ASCII碼 英文大小寫,字符,不支持中文 美國人發明,佔用空間小,用一個字節就行
GB2312碼、GBK碼 支持中文 中國人發明,GBK是GB2312的升級,增加了更多原來沒有的文字字符
Unicode碼 支持國際語言,萬國碼 適用性強但佔用空間大。在ASCII碼前面補8個bit位就是Unicode碼
UTF-8碼 支持國際語言 Unicode的升級,兩者容易互相轉化。佔用空間小、適用性強。ASCII碼被UTF-8碼包含。

編碼方案使用情況表

編碼錶 當前使用情況 備註
ASCII碼
GB2312碼、GBK碼 中文的文件和中文網站,使用GBK、GB2312
Unicode碼 計算機內存中處理數據時使用的統一標準格式 Python3中,程序處理我們輸入的字符串使用Unicode編碼
UTF-8碼 數據在硬盤上存儲,或者網絡上傳輸時,用的UTF-8 因為節省空間。程序來轉換編碼。

基於上表,有時候面對不同編碼的數據,我們還需要手動操作實現編碼轉換。就要用到encode(編碼)decode(解碼)

編碼操作和解碼操作

編碼:encode()

語法:

'你想編碼的內容'.encode('你使用的編碼錶名稱')

用法:

print('一天打魚兩個月曬網的小石頭'.encode('utf-8'))
# b'\xe4\xb8\x80\xe5\xa4\xa9\xe6\x89\x93\xe9\xb1\xbc\xe4\xb8\xa4\xe4\xb8\xaa\xe6\x9c\x88\xe6\x99\x92\xe7\xbd\x91\xe7\x9a\x84\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'
print('I Love U'.encode('gbk'))
# b'I Love U'
print('小石頭'.encode('utf-8'))
# b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'

將上述人類語言編碼得到機器語言后的打印結果在註釋里。

字母b

這裏之所以有個字母b,代表他是bytes(字節)類型的數據。 可以用type()函數驗證一下:

print(type(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4')) # <class 'bytes'>

符號\x

另外,幾乎每個字母/数字前邊都有的\x,他的作用是分隔符,用來分隔一個字節和另一個字節。

這樣的分隔符,我們還見過:

<a href="https://www.baidu.com/s?wd=%e5%b0%8f%e7%9f%b3%e5%a4%b4" />

對比發現下邊兩段字符串,你有發現什麼奧妙么!:

%e5%b0%8f%e7%9f%b3%e5%a4%b4
\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4

%\x一樣,都是一種分隔符。只不過%是url中的、\x是python中的

解碼:decode()

語法:

'你想解碼的內容'.encode('你使用的編碼錶名稱')

用法:

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('UTF-8')) # 小石頭

::: warning 注意 你要解碼的內容得跟編碼時用的編碼錶一致。不然會報錯。 :::

也就是說,UTF-8編碼的字節就一定要用UTF-8的規則解碼,其他編碼同理,否則就會出現亂碼或者報錯的情況,

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('GBK'))
# 把utf-8編碼的字符串用GBK來解碼,就報錯了。
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

圖解MySQL索引(二)—為什麼使用B+Tree_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

失蹤人口回歸,近期換工作一波三折,耽誤了不少時間,從今開始每周更新~

索引是一種支持快速查詢的數據結構,同時索引優化也是後端工程師的必會知識點。各個公司都有所謂的MySQL”軍規“,其實這些所謂的優化和規定,並不是什麼高深的技術,只是要求大家正確建立和使用索引而已。工欲善其事必先利其器,想要正確運用索引,需要了解其底層實現原理,本文將探索關於索引的“是什麼”以及”為什麼“。

MySQL中關於索引的概念有很多,為了避免混淆,在上一篇文章中關於索引在不同維度分類設計到的一些名詞進行了解釋,如輔助索引,唯一索引,覆蓋索引,B+Tree索引…., 牆裂建議不明白的小夥伴可以先去看看圖解MySQL索引(上)—聊聊索引的分類,本文中關於索引類型的各種定義不再複述。

一,磁盤IO問題

1.1 磁盤IO

所謂磁盤IO,簡單來講就是就是將磁盤中的數據讀取到內存或者是從內存寫入磁盤。在系統開發與設計過程中,磁盤IO的瓶頸往往不可忽略,因為這是一個相對比較耗時的操作。

上圖是一個机械硬盤,雖然速度不如SSD,但是由於價格低廉,目前仍是主流的存儲介質。它的IO操作通常需要尋道,旋轉和傳輸三個步驟。

尋道,是指將讀寫磁頭移動到正確的磁道,尋道時間越短,IO操作越快,目前磁盤的平均尋道時間一般在3-15ms左右。

旋轉,是指將盤片旋轉到請求數據所在的扇區,這部分所需要的時間由硬盤的配置所決定。旋轉延遲由磁盤轉速所決定,也就是常說的7200轉和5400轉等。

例如,7200轉是指每分鐘可以旋轉7200圈,那麼旋轉一圈所需要的時間就是60*1000/7200 ≈ 8.33ms,而旋轉延遲通常取旋轉一周時間的1/2,也就是大約4.17ms。

傳輸,磁盤傳輸的速度通常在幾十到上百M每秒,假設速度為20M/s,要傳輸的數據為64kb,則傳輸時間則是 64 / 1024 / 20 * 1000 = 3.125ms。不過目前流行的SSD傳輸速度大幅度提升,SATA Ⅱ可以達到300M/s,傳輸速度往往遠小於前兩步操作所以傳輸時間往往可以忽略不記。

机械硬盤的連續讀寫性能很好,但隨機讀寫性能很差,這主要是因為磁頭移動到正確的磁道上需要時間,隨機讀寫時,磁頭需要不停的移動,時間都浪費在了磁頭尋址上,所以性能不高。

上述過程是對傳統机械磁盤IO延遲的粗略介紹,目的是告訴大家磁盤IO過程是個耗時的過程,內存操作往往與之速度不在同一個數量級。即使是目前比較流行的SSD,想必內存中數據讀取性能也差之千里。

1.2 局部性原理

由於磁盤IO是一個比較耗時的操作,而操作系統在設計時則定義一個空間局部性原則,局部性原理是指CPU訪問存儲器時,無論是存取指令還是存取數據,所訪問的存儲單元都趨於聚集在一個較小的連續區域中

在操作系統的文件系統中,數據也是按照page劃分的,一般為4k或8k。當計算機訪問一個地址數據時,不僅會加載當前數據所在的數據頁,還會將當前數據頁相鄰的數據頁一同加載到內存。而這個過程實際上只發生了1次磁盤IO,這個理論對於索引的數據結構設計非常有幫助。

二,索引數據結構演進

索引是一種支持快速查找的數據結構,在運用中往往還要求能夠支持順序查詢,而常見的數據結構有很多,比如數組,鏈表,二叉樹,散列表,二叉搜索樹,平衡搜索二叉樹,紅黑樹,跳錶等。僅僅從數據結構那麼為什麼選擇B+Tree呢?

首先對於數組,鏈表這種線性表來說,適合存儲數據,而不是查找數據,同樣,對於普通二叉樹來說,數據存儲沒有特定規律,所以也不適合。

2.1 哈希索引不能滿足業務需求

哈希(Hash)是一種非常快的查找方法,在一般情況下這種查找的時間複雜度為O(1),即一般僅需要一次查找就能定位到數據。在各種編程語言和數據庫中應用廣泛,如Java,Python,Redis中都有使用。

哈希結構在單條數據的等值查詢是性能非常優秀,但是只能用來搜索等值的查詢, 對於範圍查詢,模糊查詢(最左前綴原則)都不支持,所以不能很好的支持業務需求;所以MySQL並沒有顯式支持Hash索引,而是根據數據的訪問頻次和模式自動的為熱點數據頁建立哈希索引,稱之為自適應哈希索引。

並且由於哈希函數的隨機性,Hash索引通常都是隨機的內存訪問,對於緩存不友好,會造成頻繁的磁盤IO。

2.2 二叉搜索樹退化成鏈表

二叉搜索樹,如果左子樹不為空,則左子樹上所有節點均小於根節點,右子樹節點均大於根節點;由其屬性不難看出,這種樹非常適合數據查找。不過有個致命的缺點是二叉搜索樹的樹型取決於數據的輸入順序,極端情況下會退化成鏈表。

2.3 平衡二叉搜索樹過於嚴格

為了解決上述問題,平衡二叉搜索樹就誕生了。在保證數據順序的基礎上,又能維持樹型,保證每個節點的左右子樹高度相差不超過1。

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

不過由於要維持樹的平衡,在插入數據時可能要進行大量的數據移動。平衡搜索二叉樹過於嚴格的平衡要求,導致幾乎每次插入和刪除節點都會破壞樹的平衡性,使得樹的性能大打折扣。

2.4 紅黑樹高度過高,磁盤IO次數頻繁

有沒有一種數據結構,即能夠快速查找數據,又不需要頻繁的調整以維持平衡呢?這時紅黑樹就閃亮登場了。

紅黑樹和其他二叉搜索樹類似, 都是在進行插入和刪除操作時通過特定操作保持二叉查找樹的性質,從而獲得較高的查找性能。與之不同的是,紅黑樹的平衡性並不像平衡搜索二叉樹一樣嚴格的同時,又能保證在, O(log n) 時間複雜度內做查找和刪除。

紅黑樹通過改變節點的顏色,可以有效減少節點的移動次數,由於紅黑樹的實現比較複雜,本文不再展開,感興趣的小夥伴可以去深入學習。

看似紅黑樹是一種完美的數據結構,能夠勝任索引的工作。但MySQL並未使用其作為索引的實現,主要原因在於紅黑樹的深度過大,數據檢索時造成磁盤IO頻繁,假設一個每個節點存儲在一個page中,樹的高度為10,則每次檢索可能就需要進行10次磁盤IO。

2.5 B-Tree不支持順序查詢

B-Tree是一種自平衡的多叉搜索樹,一個節點可以擁有兩個以上的子節點。適合讀寫相對大的數據塊的存儲系統,例如磁盤。

由於MySQL索引一般都存儲在內存中,如果使用B-Tree作為索引的話,索引和數據存儲在一塊,分佈在各個節點中;而內存資源往往比較寶貴,一定內存的情況下可以存儲的索引數量相對有限,畢竟每條數據的大小一般遠大於索引列的大小,導致內存使用率不高。

數據查詢過程中往往會有順序查詢,而B-Tree和紅黑樹對於順序查詢並不友好

2.6 為什麼選B+Tree

B+Tree是在B-Tree基礎上演進而來的。與之不同的是B+Tree的數據頁只存儲在恭弘=叶 恭弘子節點中,並且恭弘=叶 恭弘子節點之間通過指針相連,為雙向鏈表結構。

B+Tree的優點可以分為以四個:

  1. 充分利用空間局部性原理,適合磁盤存儲。

  2. 樹的高度很低,能夠在存儲大量數據情況下,進行較少的磁盤IO【見下文介紹】。

  3. 能夠很好支持單值,範圍查詢,有序性查詢。

  4. 索引和數據分開存儲,讓更多的索引存儲在內存中。

三,MySQL中索引實現

3.1 巧妙利用B+Tree

MySQL中的數據存儲通常以Page為單位,俗稱數據頁,每個Page對應B+Tree的一個節點。頁是InnoDB磁盤管理的最小單位,默認每個數據頁的大小為16kb,也可以通過參數innodb_page_size將頁的大小設置成其他值。

數據庫的頁大小和操作系統類似,是指存放數據時,每一塊連續區域數據的大小。比如一個1M的數據存放在數據庫中時, 需要大概64個頁來存放(1024=64*16)。如果是在操作系統上安裝的數據庫,最好將數據庫頁大小設置為操作系統頁大小的倍數,才是最佳設置。

3.2 樹的高度-有效減少磁盤IO次數

通常情況下,一張MySQL表中有成千上萬條數據,而磁盤IO次數往往與數的高度成正比。默認情況下一個Page的大小為16kb,由於每個Page中數據通過指針相連,且每個指針大小為6字節。

在工作中,我們通常使用長度為8個字節的bigint類型作為主鍵id的類型。已知,每一條數據都會包含一個6字節的指針(數據頁中每條記錄都有指向下一條記錄的指針,但是沒有指向上一條記錄的指針);所以一條索引數據大約佔用8+6=14個字節,一個Page中能存儲16 * 1024 / 14 ≈ 1170條索引數據。高度為2的B+Tree大約能存儲1170*16 = 18720條這樣的記錄。同理,高度為3的B+Tree的B+Tree大約能存儲1170 * 1170 * 16 = 21902400,大約兩千萬條數據。 (每個節點大約能存儲1170條記錄,可以理解為此時B+Tree為1170叉樹)

例如,要檢索id=008的數據,則需要進行三次磁盤IO找到對應的數據頁(最多三次,因為Page可能在緩存中),然後在數據頁中進行二分查找,定位到對應的記錄。

四,總結

大家耳熟能詳的B+Tree索引是一種非常優秀的數據結構,也是面試熱點問題。本文從數據結構和磁盤IO兩個方面分析了為什麼使用B+Tree,以及MySQL的InnoDB存儲引擎的索引實現。在筆者面試過程中,被問到MySQL索引時通常也是從底層數據結構特點以及結合磁盤IO兩個角度去分析,屢試不爽。

學習一門技術時,我們不僅要知道其優點更要了解其缺點和瓶頸。在分析MySQL索引的實現時,不妨試試從其他數據結構的缺點入手!在Redis中使用跳錶實現了有序集合Zset,同樣支持高效的順序查詢,對比MySQL索引實現,跳錶能否替換B+Tree?如果不行,是因為什麼呢?

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

圖解大頂堆的構建、排序過程_貨運

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

這两天在複習大頂堆和小頂堆,比起兩年前的懵懵懂懂,這次理解起來就容易了一些。又翻看了一下自己之前的筆記數據結構與算法之PHP排序算法(堆排序),發現自己這次查閱資料,和之前的思路不太一樣,遂寫下這篇筆記,算是和以前的筆記做一個對照。

一、什麼是堆

堆是一種非線性結構,可以把堆看作一棵二叉樹,也可以看作一個數組,即:堆就是利用完全二叉樹的結構來維護的一維數組

堆可以分為大頂堆和小頂堆。
大頂堆:每個結點的值都大於或等於其左右孩子結點的值。
小頂堆:每個結點的值都小於或等於其左右孩子結點的值。

如果是排序,求升序用大頂堆,求降序用小頂堆。

一般我們說 topK 問題,就可以用大頂堆或小頂堆來實現,
最大的 K 個:小頂堆
最小的 K 個:大頂堆

二、大頂堆的構建過程

大頂堆的構建過程就是從最後一個非恭弘=叶 恭弘子結點開始從下往上調整。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

最後一個非恭弘=叶 恭弘子節點怎麼找?這裏我們用數組表示待排序序列,則最後一個非恭弘=叶 恭弘子結點的位置是:數組長度/2-1。假如數組長度為9,則最後一個非恭弘=叶 恭弘子結點位置是 9/2-1=3。

比較當前結點的值和左子樹的值,如果當前節點小於左子樹的值,就交換當前節點和左子樹;
交換完后要檢查左子樹是否滿足大頂堆的性質,不滿足則重新調整子樹結構;

再比較當前結點的值和右子樹的值,如果當前節點小於右子樹的值,就交換當前節點和右子樹;
交換完后要檢查右子樹是否滿足大頂堆的性質,不滿足則重新調整子樹結構;

無需交換調整的時候,則大頂堆構建完成。

畫個圖理解下,以 [3, 7, 16, 10, 21, 23] 為例:

代碼如下:

<?php
/**
 * 構建大頂堆
 * 大頂堆的性質:每個結點的值都大於或等於其左右子結點的值。
 */
function buildBigHeap(&$arr, $len) {
    for ($i = floor($len/2) - 1; $i >= 0; $i--) {
        //根節點小於左子樹
        if (2 * $i + 1 < $len && $arr[$i] < $arr[2 * $i + 1]) {
            //交換根節點和左子樹的值
            swap($arr, $i, 2 * $i + 1);
            // $temp = $arr[$i];
            // $arr[$i] = $arr[2 * $i + 1];
            // $arr[2 * $i + 1] = $temp;
            //檢查左子樹是否滿足大頂堆的性質,如果不滿足,則重新調整
            if ((2 * (2 * $i + 1) + 1 < $len && $arr[2 * $i + 1] < $arr[2 * (2 * $i + 1) + 1])
            || (2 * (2 * $i + 1) + 2 < $len && $arr[2 * $i + 1] < $arr[2 * (2 * $i + 1) + 2])) {
                buildBigHeap($arr, $len);
            }
        }
        //根節點小於右子樹
        if (2 * $i + 2 < $len && $arr[$i] < $arr[2 * $i + 2]) {
            //交換根節點和右子樹的值
            swap($arr, $i, 2 * $i + 2);
            // $temp = $arr[$i];
            // $arr[$i] = $arr[2 * $i + 2];
            // $arr[2 * $i + 2] = $temp;
            //檢查右子樹是否滿足大頂堆的性質,如果不滿足,則重新調整
            if ((2 * (2 * $i + 2) + 1 < $len && $arr[2 * $i + 2] < $arr[2 * (2 * $i + 2) + 1])
            || (2 * (2 * $i + 2) + 2 < $len && $arr[2 * $i + 2] < $arr[2 * (2 * $i + 2) + 2])) {
                buildBigHeap($arr, $len);
            }
        }
    }
}

/**
 * 交換兩個值
 * m n 為數組的下標
 */
function swap(&$arr, $m, $n) {
    $temp = $arr[$m];
    $arr[$m] = $arr[$n];
    $arr[$n] = $temp;
}

三、大頂堆的排序過程

將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值,如此反覆執行,便能得到一個有序序列了。

是不是對上面這一大段文字很頭疼?其實排序過程用下面 4 步就能概括:
第 1 步:先 n 個元素的無序序列,構建成大頂堆
第 2 步:將根節點與最後一個元素交換位置,(將最大元素”沉”到數組末端)
第 3 步:交換過後可能不再滿足大頂堆的條件,所以需要將剩下的 n-1 個元素重新構建成大頂堆
第 4 步:重複第 2 步、第 3 步直到整個數組排序完成。

/**
 * 交換交換根節點和數組末尾元素的值
 */
function adjustHeap(&$heap, $len) {
    $temp = $heap[0];
    $heap[0] = $heap[$len - 1];
    $heap[$len - 1] = $temp;
}
/**
 * 堆排序
 */
function heapSort(&$arr) {
    $len = count($arr);
    for ($i = $len; $i > 0; $i--) {
        buildBigHeap($arr, $i);
        adjustHeap($arr, $i);
    }
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

編程必備基礎之操作系統_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

操作系統概述

  操作系統是管理計算機硬件和軟件資源的計算機程序,管理配置內存、決定資源供需順序、控制輸入輸出設備等。操作系統提供讓用戶和系統交互的操作界面。操作系統的種類是多種多樣的,不局限於計算機,從手機到超級計算機,操作系統可簡單也可複雜,在不同的設備上,操作系統可向用戶呈現多種操作。因為我們不可能直接操作計算機硬件,而且設備種類繁多,需要一個統一的界面,因此有了操作系統,操作系統的簡易性使得更多人能使用計算機。常見的操作系統有:Windows、Linux、MacOS、Android等,總結一句話就是:操作系統是管理硬件、提供用戶交互的軟件系統。

  • 操作系統的基本功能
    • 操作系統統一管理着計算機資源。這些計算機資源包括處理器資源、存儲器資源、IO設備資源和文件資源等。
    • 操作系統實現了對計算機資源的抽象。即用戶無需面向硬件接口編程;IO設備管理軟件,提供獨寫接口;文件管理軟件,提供操作文件的接口。
    • 操作系統提供了用戶和計算機之間的接口。例如圖像窗口形式、命令行形式和系統調用形式等。
  • 操作系統的相關概念
    • 併發性:說到併發就不得不提一下并行性,并行性是指兩個或多個事件可以在同一時刻發生,而併發性是指兩個或多個事件可以在同一個時間間隔發生。
    • 共享性:多個程序可以同時使用主存資源,資源共享根據屬性分為互斥共享和同時訪問兩種形式
      • 互斥共享形式:當資源被程序A佔用時,其他想使用的話就只能等待,只有進程A使用完以後,其他進程才可以使用該資源。
      • 同時訪問形式:某種資源在一段時間內併發地被多個程序訪問,這種“同時”是宏觀的,從宏觀去看該資源可以被同時訪問
    • 虛擬性:虛擬性表現為把一個物理實體轉為若干個邏輯實體,物理實體是真實存在的,邏輯實體是虛擬的,虛擬的技術主要有時分復用技術和空分復用技術。
      • 時分復用技術:資源在時間上進行復用,不同程序進行併發使用,多道程序分時使用計算機的硬件資源,提高資源的利用率
        • 虛擬處理器技術:藉助多道程序設計技術,為每個程序建立進程,多個程序分時復用處理器
        • 虛擬設備技術:物理設備虛擬為多個邏輯設備,每個程序佔用一個邏輯設備,多個程序通過邏輯設備併發訪問
      • 空分復用技術:空分復用技術用來實現虛擬磁盤、虛擬內存等,提高資源利用率,提高編程效率
        • 虛擬磁盤技術:物理磁盤虛擬為邏輯磁盤,例如C、D、E等邏輯盤,使用起來更加安全方便
        • 虛擬內存技術:在邏輯上擴大程序的存儲容量,使用比實際內存更大的容量,大大提升編程效率
    • 異步性:在多道程序環境下,允許多個進程併發執行,進程在使用資源時可能需要等待和放棄,進程的執行並不是一氣呵成的,而是以走走停停的形式推進

進程管理

  為什麼需要進程呢?在沒有配置OS(操作系統)之前,資源屬於當前運行的程序,配置OS之後,引入多道程序設計的概念,可以合理的隔離資源、運行環境、提升資源利用率。進程是系統進行資源分配和調度的基本單位,進程作為程序獨立運行的的載體保障程序正常運行,進程的存在使得操作系統資源的利用率大幅提升。

進程管理之進程實體

主存中得進程形態

  • 標識符:標識符唯一標記一個進程,用戶區別其他進程,如進程id
  • 狀態:標記進程的進程狀態,如:運行態
  • 程序計數器:指向進程即將被執行的下一條指令的地址
  • 內存指針:程序代碼,進程數據相關指針
  • 上下文數據(重要):進程執行時處理存儲器的數據
  • IO狀態信息:被進程IO操作時所佔用的文件列表
  • 記賬信息:使用處理器時間、時鐘數總和等。

  由此可知,主存中的進程形態主要包括進程標識符,處理機狀態,進程調度信息,進程控制信息等。其中進程控制塊(PCB)是用於描述和控制進程運行的通用數據結構,記錄進程當前狀態和控制進程進行運行的全部信息,PCB使得進程成為能夠獨立運行的基本單位。PCB是操作系統進行調度經常會被讀取的信息,而且是常駐內存的,存放在系統專門開闢的PCB區域內。

進程與線程

  之前說過進程是操作系統進行資源分配和調度的基本單位,而線程是操作系統進行運行調度的最小單位,線程包含在進程之中,是進程中實際運行的工作單位,一個進程可以併發多個線程,每個線程執行不同任務。

   進程 線程
資源 資源分配的基本單位 不擁有資源
調度 獨立調度的基本單位 獨立調度最小單位
系統開銷 進程系統開銷大 線程系統開銷小
通信 進程IPC 讀寫同一進程數據通信

  一個進程可以有多個線程,一個進程中的線程共享資源,計算機對進程的調度,實際上是對進程中的線程進行調度

五狀態模型

  • 創建狀態:創建進程時擁有PCB但其它資源尚未就緒的狀態稱為創建狀態,操作系統提供fork函數接口創建進程。
  • 就緒狀態:當進程被分配到除CPU以外的所有必要資源后,只要再獲得CPU的使用權,就可以立即運行。其他資源都轉準備好、只差CPU資源的成為就緒狀態。
    • 在一個系統中處於就緒狀態的進程通常排成一個隊列,稱為就緒隊列。
  • 執行狀態:進程獲得CPU,其程序正在執行稱為執行狀態,再單處理機中,在某個時刻只能有一個進程是處於執行狀態。
  • 阻塞狀態:進程因某種原因如:其他設備未就緒而無法繼續執行,從而放棄CPU的狀態稱為阻塞狀態。
  • 終止狀態:程序執行完成。

進程同步

  為什麼需要進程間的同步呢?先讓我們來看一個經典的問題:生產者-消費者問題
生產者-消費者問題:有一群生產者進程在生產產品,並將這些產品提供給消費者進程進行消費,生產者進程和消費者進程可以併發執行,在兩者之間設置了一個具有n可緩衝區的緩衝池,生產者進程需要將所生產的產品放到一個緩衝區中,消費者進程可以從緩衝區取走產品消費

由上圖我們可以看出,單從生產者程序或消費者程序去看是沒問題的,但兩者併發執行時就可能會出現差錯。如下圖:

這裏的緩衝區就相當於臨界資源。
  再來看一個哲學家進餐問題:
有五個哲學家,他們的生活方式時是交替的進行思考和進餐,哲學家們共同使用一張圓桌子,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子。平時哲學家們只進行思考,飢餓時則試圖取靠近他們的左、右兩隻筷子,只有兩支筷子都被他拿到的時候才能進餐,進餐完畢后,放下左右筷子繼續思考。

  出現上圖中的問題是什麼呢?其根源問題是:彼此之間沒有相互通信,如果“生產者通知消費者我已經完成了一件生產”,“哲學家向旁邊哲學家說我要進餐了”,就不會出現上圖中的問題了,也就是需要進程間的同步。

  什麼是進程同步呢?當對競爭資源在多個進程間進行使用次序的協調,使得併發執行的多個進程之間可以有效使用資源和相互合作。這裏的競爭資源也就是上圖中的臨界資源,什麼是臨界資源?臨界資源指的是一些雖作為共享資源,卻又無法同時被多個線程共同訪問的共享資源。當有進程在使用臨界資源時,其他進程必須依據操作系統的同步機制,等待佔用進程釋放該共享資源,才可以重新競爭使用共享資源。
進程同步的原則:

  • 空閑讓進:資源五佔用,允許使用
  • 忙則等待:資源有佔用,請求進程等待
  • 有限等待:保證有限等待時間能夠使用資源
  • 讓權等待:等待時,進程需要讓出CPU

  進程間同步的常用方法:如消息隊列,共享存儲,信號量。當多個線程併發使用進程資源時,進程內的多線程也需要,因為進程中的資源時進程中線程的共享資源。線程同步的方法有:互斥量、讀寫鎖、自旋鎖、條件變量等,這些方法是如何保證線程同步的呢?

  • 互斥量:由於多個線程的指令交叉執行,而互斥量可以保證先後執行,即保證原子性。什麼是原子性呢?原子性是指一系列操作不可被中斷的特性, 這一系列操作要麼全部執行完成,要麼全部沒有執行,不存在部分執行部分未執行的情況
    • 互斥量是最簡單的線程同步方法
    • 互斥量(互斥鎖),處於兩態之一的變量:解鎖和加鎖
    • 兩個狀態可以保證資源的串行
  • 自旋鎖:自旋鎖也是一種多線程同步的變量,使用自旋鎖的線程會反覆檢查鎖變量是否可用,自旋鎖不會讓出CPU,是一種忙等待狀態,即死循環等待鎖被釋放。
    • 自旋鎖避免了進程或線程上下文切換的開銷
    • 操作系統內部很多地方都是使用的自旋鎖
    • 自旋鎖不適合在單核CPU中使用
  • 讀寫鎖:這種鎖適用於臨界資源多讀少寫,讀取的時候並不會改變臨界資源的值。
    • 讀寫鎖是一種特殊的自旋鎖
    • 允許多個讀者同時訪問資源以提高讀的性能
    • 對寫的操作則是互斥的
  • 條件變量
    • 條件變量是一種相對複雜的同步方法
    • 條件變量允許線程睡眠,直到滿足某種條件
    • 當滿足條件時,可以向該線程發送信號,通知喚醒
同步方法 描述
互斥鎖 最簡單的一種線程同步方法,會阻塞線程
自旋鎖 避免切換的一種線程同步方法,屬於“忙等待”
讀寫鎖 為“讀多寫少”的資源設計的線程同步方法,可以顯著提高性能
條件變量 相對複雜的一種線程同步方法,有更靈活的使用場景

進程同步之共享內存
  在某種程度上,多進程是是共同使用物理內存的,由於操作系統的進程管理,進程間的內存空間是獨立的,進程默認是不能訪問進程空間之外的內存空間的

共享內存就可以打破這個限制,因為有這個共享內存,不同進程就可以通過頁表映射到同一個共享內存去,這個共享內存既可以被進程1使用,也可以被進程2使用。

  共享存儲允許不相關的進程訪問同一片物理內存,共享內存是兩個進程之間共享和傳遞數據的最快方式,共享內存未提供同步機制,需要藉助其他機制訪問。通過共享內存同步的過程就是:申請共享內存->連接到進程空間->使用共享內存->脫離進程空間並且刪除。共享內存是高性能後台開發中最常用的同步方式。
進程同步之Unix域套接字
  域套接字是一種高級的進程間通信的方法,Unix域套接字可以用於同一台機器進程間通信。其運行過程是創建套接字->綁定(bind)套接字->監聽(listen)套接字->接收&處理信息。域套接字提供了簡單可靠的進程通信同步服務,只能在單機使用,不能跨機器使用。

Linux的進程管理

Linux進程的相關概念:

進程類型:

  1. 前台進程:前台進程就是具有終端,可以和用戶交互的進程
  2. 後台進程:
    • 與前台進程相對,沒有佔用終端的就是後台進程
    • 後台進程基本上b不和用戶交互,優先級比前台進程低
    • 將需要執行的命令以“&”符號結束
  3. 守護進程(daemon):特殊的後台進程
    • 很多守護進程在系統引導的時候啟動,一直運行到系統關閉
    • Linux系統有很多典型的守護進程。例如:crond,sshd,httpd,mysqld等,進程名字以“d”結尾的一般都是守護進程。
      進程標記:
  • 進程ID
    • 進程ID是進程的唯一標記,每個進程擁有不同的ID
    • 進程ID表現為一個非負整數,最大值由操作系統限定
    • 操作系統提供fork()函數接口創建進程。例如進程A調用fork接口創建了進程B,進程B調用fork接口創建了進程C,那此時進程A和進程B就存在父子進程關係,進程A是父進程,進程B是子進程。進程的父子關係可以通過pstree命令查看。

ID為0的進程是idle進程,是系統創建的第一個進程,ID為1的進程init進程,是0號進程的子進程,完成系統初始化,Init進程是所有用戶進程的祖先進程。

  • 進程的狀態標記

Linux中進程的狀態如下:

狀態符號 狀態說明
R (TASK_RUNNING),進程正處於運行狀態
S (TASK_INTERRUPTIBLE),進程正處於睡眠狀態
D (TASK_UNINTERRUPTIBLE),進程正處於IO等待的睡眠狀態
T (TASK_STOPPED),進程正處於暫停狀態
Z (TASK_DEAD or EXIT_ZOMBIE),進程正處於退出狀態,或殭屍進程

操作Linux進程的相關命令

  • ps命令:ps命令常用於显示當前進程的狀態,ps命令常配合aux參數或ef參數和grep命令檢索特定進程
  • top命令
  • kill命令:kill命令發送指定信號給進程,kill-l可以查看操作系統所支持的系統

作業管理

作業管理之進程調度

  進程調度是指計算機通過決策,決定哪個就緒進程可以獲得CPU使用權。通俗來說就是保留舊進程的運行信息,請出舊進程(收拾包袱),選擇新進程,準備運行環境並分配CPU(新駐進)。那麼是如何進行進程的調度的呢?

  • 就緒隊列的排隊機制:將就緒進程按照一定的方式排成隊列,以便調度程序可以最快找到就緒進程。
  • 選擇運行進程的委派機制:調度程序以一定的策略選擇就緒進程,將CPU資源分配給它
  • 新老進程的上下文切換機制:保存當前進程的上下文信息,裝入被委派執行進程的運行上下文

  進程的調度方式分為搶佔式調度和非搶佔式調度。非搶佔式調度是指處理器一旦分配給某個進程,就讓該進程一直使用下去,調度程序不以任何原因搶佔正在被使用的處理器,直到進程完成工作,或因為IO阻塞才會讓出處理器;搶佔式調度是指允許調度程序以一定的策略,暫停當前運行的進程,保存好進程的上下文信息,分配處理器給新進程。

   搶佔式調度 非搶佔式調度
系統開銷 頻繁切換,開銷大 切換次數少,開銷小
公平性 相對公平 不公平
應用 通用系統 專用系統

進程調度算法

  • 先來先服務調度算法
  • 短進程優先調度算法:調度程序優先選擇就緒隊列中估計運行時間最短的進程;短進程優先調度算法不利於長作業進程的運行
  • 高優先權優先調度算法:進程附帶優先權,調度程序優先選擇權最高的進程,高優先權優先調度算法使得 緊迫的任務可以處理
  • 時間片輪轉調度算法:按先來先服務的原則排列就緒進程,每次從隊列頭部取出待執行進程,分配一個時間片執行;是相對公平的調度算法,但不能保證及時響應用戶

作業管理之死鎖

  死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞現象,若無外力作用,他們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
死鎖的產生

  • 競爭資源:共享資源數量不滿足各個進程需求,各個進程 之間發生資源競爭導致死鎖,
  • 進程調度順序不當
    死鎖的四個必要條件:
  • 互斥條件:進程對資源的使用是排他性的使用,某資源只能由一個進程使用,其他進程需要使用只能等待
  • 請求保持條件:進程至少保持一個資源,又提出新的資源請求,新資源被佔用,請求被阻塞,被阻塞的進程不釋放自己保持的資源
  • 不可剝奪條件:進程獲得的資源在未完成使用前不能被剝奪,獲得的資源只能由進程自生釋放
  • 環路等待條件:發生死鎖時,必然存在進程-資源環形鏈
    死鎖的處理
  • 預防死鎖的方法
    • 摒棄請求保持條件:系統規定進程運行之前,一次性申請所有需要的資源,進程在運行期間不會提出資源的請求,從而摒棄請求保持條件
    • 摒棄步課剝奪條件:當進程請求一個新的資源得不到滿足時,必須釋放佔有的資源,當進程運行時佔有的資源可以被釋放,意味着可以被剝奪
    • 摒棄環路等待條件:可用資源線性排序,申請必須按照需要遞增申請,線性申請不在形成環路,從而摒棄了環路等待條件
  • 銀行家算法:銀行家算法是一個可操作得著名得避免死鎖得方法,以銀行借貸系統分配策略為基礎的算法。
    • 客戶申請的貸款是有限的,每次申請須聲明最大資金量
    • 銀行家在能夠滿足貸款時,都應該給用戶貸款
    • 客戶在使用貸款后,能夠及時歸還貸款。

根據還需要分配的資源表,對比可分配資源表,先給能夠滿足貸款的用戶,給用戶貸款,即圖中的P2,P2使用完資源后,需要及時歸還資源

存儲管理

  早期計算機編程並不需要過多的存儲管理,隨着計算機和程序越來越複雜,存儲管理成為必要。

  • 確保計算機有足夠的內存處理處理數據
  • 確保程序可以從可用內存中,獲取一部分內存使用
  • 確保程序可以歸還使用后的內存,已供其他程序使用

存儲管理之內存分配與回收

內存分配的過程

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

  • 單一連續分配:單一連續分配是最簡單的內存分配方式,只能在單一用戶、單進程的操作系統中使用
  • 固定分區分配:固定分區分配是支持多道程序的最簡單的存儲分配方式,內存空間被劃分成若干個固定大小的區域,每個分區只提供給一個用戶使用,互不干擾
  • 動態分區分配:根據進程實際需要,動態分配內存空間,相關數據結構、分配算法如下:
    • 動態分區空閑表數據結構:對空閑區進行標記,0表示空閑區,1表示已被使用
    • 動態分區空間鏈數據結構
    • 首次適應算法(FF算法):分配內存時從開始,順序查找適合內存區,若沒有合適的空閑區,則該次分配失敗;每次從頭部開始,使得頭部地址不斷被劃分
    • 最佳適應算法(BF算法):最佳適應算法要求空閑鏈表按照容量大小排序,遍歷空閑鏈表找到最佳合適的空閑區
    • 快速適應算法(QF算法):快速適應算法要求有多個空閑區鏈表,每個空閑區鏈表存儲一種容量的空閑區

內存回收的過程

  情況一:不需要新建空閑鏈表節點,只需要把空閑區1的容量增大為空閑區即可;情況二:將回收區與空閑區合併,新的空閑區使用回收區的地址;情況三:將空閑區1、空閑區2和回收區合併,新的空閑區使用空閑區1的地址;情況四:為回收區創建新的空閑節點,插入到相應的空閑區鏈表中去。

存儲管理之段頁式存儲管理

  由於每個進程都有自己獨立的進程空間,那操作系統是如何管理進程的空間呢?

  • 頁式存儲管理:
    • 將進程邏輯空間等分為若干大小的頁面
    • 相應的把物理內存空間分成與頁面大小的物理塊
    • 以頁面為單位把進程空間裝進物理內存中分散的物理塊

      頁表:頁表記錄了進程邏輯空間與物理空間的映射

現代計算機系統中,可以支持非常大的邏輯地址空間(\(2^{32}\)~\(2^{64}\)),這樣,頁表就變得非常大,要佔用非常大的內存空間,如具有32位邏輯地址空間的分頁系統,規定頁面大小為4KB,則在每個進程頁表中的頁表項可達1M(32位系統進程的尋址空間為4G,4G/4KB=1M)個,如果每個頁表項佔用1Byte,故每個進程僅僅頁表就要佔用1M的內存空間。

  • 段式存儲管理
    • 將進程邏輯空間劃分成若干段(非等分)
    • 段的長度由連續邏輯的長度決定
    • 主函數MAIN,子程序段X,系函數Y等

  段式存儲和頁式存儲都離散地管理了進程的邏輯空間。頁是物理單位,段是邏輯單位,分頁是為了合理利用空間,分段是為了滿足客戶需求;頁大小由硬件空間,段長度可動態變化;頁表信息是一維的,段表信息是二維的。

  • 段頁式存儲管理:由於分頁可以有效提高內存利用率(雖然說存在內存碎片),分段可以滿足用戶需求,我們可以將兩者結合,形成段頁式存儲管理。
    • 先將邏輯空間按段式管理分成若干段
    • 再把段內空間按頁式管理等分成若干頁

存儲管理之虛擬內存

  思考:一個遊戲十幾個G,物理內存只有4G,那這個遊戲是如何運行起來的呢?

  有些進程實際需要的內存很大,超過物理內存的容量,多道程序設計,使得每個進程可用物理內存更加稀缺,不可能無限增加物理內存,物理內存總有不夠的時候,這個時候就需要虛擬內存了。虛擬內存是操作系統內存管理的關鍵技術,使得多道程序運行和大程序運行成為現實,把程序使用內存劃分,將部分暫時不使用的內存放置在輔存。

程序的局部性原理:局部原理是指CPU訪問存儲器時,無論是存取指令還是存取數據,所訪問的存儲單元都趨於集中在一個較小的連續區域中。

  • 程序運行時,無需全部裝入內存,裝載部分即可
  • 如果訪問頁不在內存,則發出缺頁中斷,發起頁面置換
  • 從用戶層面看,程序擁有很大的空間,即是虛擬內存
  • 虛擬內存實際是對物理內存的補充,速度接近於內存,成本接近於輔存

虛擬內存的置換算法:和我在《計算機組成原理》這篇博客中的高速緩存的置換策略差不多,這裏就不詳細介紹了。

  • 先進先出算法(FIFO)
  • 最不經常使用算法(LFU)
  • 最近最少使用算法(LRU)

高速緩存的替換策略發生在Cache-主存層次,只要是為了解決速度問題;虛擬內存的替換策略發生在主存-輔存層次,主要是為了解決容量問題。

Linux的存儲管理

Buddy內存管理算法

  • Buddy算法是經典的內存管理算法
  • 算法基於計算機處理二進制的優勢具有極高的效率
  • 算法主要是為了解決內存外碎片的問題

頁內碎片:內部碎片是已經被分配出去(能明確指出屬於哪個進程)的內存空間大於請求所需的內存空間,不能被利用的內存空間就是內部碎片。
頁外碎片:外部碎片是指還沒有被分配出去(不屬於任何進程),但是由於大小而無法被分配給申請內存空間的新進程的內存空閑塊。
Buddy是夥伴的意思,這裏的”夥伴“指的是內存的”夥伴“,一片連續內存的”夥伴“是相鄰的另一片大小一樣的連續內存
Buddy內存管理算法執行過程:創建一系列空閑塊鏈表,每一種都是2的冪 –> 現在需要分配100kb內存 –> 回收剛才分配的內存

Linux的交換空間

  交換空間(Swap)是磁盤的一個分區,Linux物理內存滿時,會把一些內存交換至Swap空間,Swap空間是初始化系統時配置的。

冷啟動內存依賴:對於一些大型的應用程序,在啟動的過程中需要使用大量的內存,但是這些內存很大一部分只是在啟動的時候使用一下,在運行的時候很少使用到這部分內存,因此有了這個交換空間,系統就可以將這個部分不怎麼使用的內存數據保存在SWAP空間中,從而釋放跟多的物理內存,提供給這個系統使用。

系統睡眠依賴: 當Linux系統需要睡眠的時候,它就會把系統中的所有數據都保存在swap空間內,等下次這個系統需要啟動的時候,才把這些數據重新加載到內存中裏面,這樣就可以加快系統的啟動速度。

大進程空間依賴:有些進程確實需要使用大量的內存空間,但是物理內存不夠使用,因此需要把這些進程需要使用的內存暫時保存到交換空間中,使得這個大的進程也可以運行起來

Swap空間和虛擬內存的對比:

Swap空間 虛擬內存
存儲位置 Swap空間存在於磁盤 虛擬內存存在於磁盤
置換層次 Swap空間與主存發生置換 虛擬內存與主存發生置換
所屬概念 Swap空間是操作系統概念 虛擬內存是進程概念
解決的問題 Swap空間解決系統物理內存不足問題 虛擬內存解決進程物理內存不足的問題

操作系統的文件管理

文件的邏輯結構

  • 邏輯結構的文件類型
    • 有結構文件:例如文本文件、文檔、媒體文件等
      • 文件內容由定長記錄和可變記錄組成
      • 定長記錄存儲文件格式、文件描述等結構化數據項
      • 可變長記錄存儲文件具體內容等
    • 無結構文件:例如二進制文件、鏈接庫等
      • 也稱為流式文件,如exe文件、dll文件、so文件等
      • 文件內容長度以字節為單位
  • 順序文件
    • 順序文件是指按順序存放在存儲介質中的文件
    • 磁帶的存儲特性使得磁帶文件只能存儲順序文件
    • 順序文件是所有邏輯文件當中存儲效率最高的
  • 索引文件
    • 可變長文件不適合使用順序文件格式存儲
    • 索引文件是為解決可變長文件存儲而發明的一種文件格式
    • 索引文件需要配合索引表完成存儲的操作

輔存的存儲空間分配

  • 輔存的分配方式
    • 連續分配:順序讀取文件內容非常容易,速度很快,對存儲要求高,要求滿足容量的連續存儲空間
    • 鏈接分配:鏈接分配可以將文件存儲在離散的盤塊中,需要額外的存儲空間存儲文件的盤塊鏈接順序
      • 隱式鏈接:隱式分配的下一個鏈接指向存儲在當前盤塊內,隱式分配適合順序訪問,隨機訪問效率低,可靠性差,任何一個鏈接出問題都會影響整個文件
      • 显示鏈接:不支持高效的直接存儲(FAT記錄項多),檢索時FAT表佔用較大的存儲空間(需要將整個FAT表加載到內存)
    • 索引分配:把文件的所有盤塊集中存儲(索引),讀取某個文件時,將文件索引讀取進內存即可

      每個文件擁有一個索引塊,記錄所有盤塊信息,索引分配方式支持直接訪問盤塊,文件較大時,索引分配方式具有明顯優勢

  • 存儲空間管理
    • 空閑表:空閑盤區的分配與內存的分配相似,首次適應算法、循環適應算法等,回收過程也與內存回收類似
    • 空閑鏈表:空閑鏈表法把所有空閑盤區組成一個空閑鏈表,每個鏈表節點存儲空閑盤塊和空閑的數目
    • 位示圖:位示圖維護成本很低,可以非常容易找到空閑盤塊,位示圖使用0/1比特位,佔用空間小

目錄管理

  任何文件或目錄都只有唯一路徑。文件常見的描述信息有:文件標識符、文件類型、文件權限、文件物理地址、文件長度、文件連接計數、文件存取時間、索引節點編號、文件狀態、訪問計數、鏈接指針等。

Linux文件基本操作

Linux目錄

目錄 描述
/bin 存放二進制可執行文件(ls,cat,mkdir),常用的命令都在該目錄下
/etc 存放系統管理和配置文件
/home 存放所有用戶文件的根目錄,使用戶目錄的基點,比如用戶user的主目錄就是/home/user
/usr 用戶存放系統應用程序,比較重要的目錄/usr/local本地系統管理員軟件安裝目錄
/opt 額外安裝的可選應用程序包所放置的位置
/proc 虛擬文件系統目錄,是系統內存的映射,可直接訪問這個目錄來獲取系統信息
/root 系統管理員的主目錄
/sbin 存放二進制可執行文件,只有root才能當問
/dev 用於存放設備文件
/mnt 系統管理員安裝臨時文件系統的安裝點,系統提供這個目錄是讓用戶臨時掛載其他的文件系統
/boot 存放用於系統引導時使用的各種文件
/lib 存放跟文件系統種的程序運行所需要的共享庫及內核模塊
/var 用於存放運行時需要改變數據得文件

Linux文件常用操作

  創建文件:touch file 修改文件:vim file 查看文件:cat file 刪除文件:rm file 創建文件夾:mkdir dir 刪除文件夾:rm dir/ 該方式會提示,不能刪除文件夾 遞歸刪除文件夾:rm -r dir/ 進入文件后,通過ls -al 命令可以查看該文件的文件類型,即第一個字符

Linux文件類型

  Linux的文件類型有:套接字(s)、普通文件(-)、目錄文件(d)、符號鏈接(b、c)、設備文件、FIFO(p)

Linux文件系統

文件系統概覽

  • FAT(File Allocation Table):例如FAT16、FAT32等,微軟Dos/Windows使用的文件系統,使用一張表保存盤塊的消息
  • NTFS(New Technology File System):WindowsNT環境文件系統,NTFS對FAT進行了改進,取代了舊的文件系統
  • EXT(Extended file System):擴展文件系統,這個是Linux的文件系統,EXT2/3/4數字錶示第幾代。
    • Boot Selector:啟動扇區,安裝開機管理程序
    • Block Group:塊組,存儲數據的實際位置

EXT文件系統

  Inode Table是存放文件Inode的地方,每一個文件(目錄)都有一個Inode,是每一個文件(目錄)的索引節點。文件名不是存放在Inode節點上的,而是存放在目錄的Inode節點上,列出目錄文件的時候無需加載文件的Inode。Inode bitmap即Inode的位示圖,記錄已分配的Inode和未分配的Inode。Data block是存放文件內容的地方,每個block都有唯一的編號,文件的block記錄在文件的Inode上。Block bitmap功能與Inode bitmap類似,記錄Data block的使用情況。superblock是記錄整個文件系統相關信息的地方,包括block和Inode的使用情況,以及時間、控制信息等。

  命令 df -T:查看該系統所掛載的磁盤信息,查看文件系統的Inode信息:dumpe2fs 指定某個一設備,如 dumpe2fs /dev/sda2,使用超級管理員權限查看:sudo dumpe2fs /dev/sda2,查看文件的具體信息:stat dumpe2fs.log,文件重命名: mv dumpe2fs.log dumpe2fs.bak.log。Inode編號才是文件的唯一標記,文件名不是文件的唯一標記。

操作系統的設備管理

廣義的IO設備

  對CPU而言,凡是對CPU進行數據輸入的都是輸入設備;對CPU而言,凡是CPU進行數據輸出的都是輸出設備

  • 按使用特性分類
    • 存儲設備:U盤、內存、磁盤等
    • 交互IO設備:鍵盤、显示器、鼠標等
  • 按信息交換的單位分類
    • 塊設備:磁盤、SD卡
    • 字符設備:打印機、Shell終端
  • 按設備的共享屬性分類:獨佔設備、共享設備、虛擬設備
  • 按傳輸速率分類:底速設備、中速設備、高速設備

IO設備的緩衝區

  由於CPU與IO設備的速率不匹配,所以需要IO設備緩衝區,這樣可以減少CPU處理IO請求的頻率,提高CPU與IO設備之間的并行性。專用緩衝區只適用於特定的IO進程,當這樣的IO進程比較多時,對內存的消耗也很大,操作系統劃出可供多個進程使用的公共緩衝區,稱之為緩衝池。

SPOOLing技術

  SPOOLing技術是關於慢速字符設備如何與計算機主機交換信息的一種技術,利用高速共享設備將低速的獨享設備模擬為高速的共享設備。邏輯上,系統為每一個用戶都分配了一台獨立的高速共享設備。SPOOling技術把同步調用低速設備改為異步調用。SPOOLing技術在輸入、輸出之間增加了排隊轉儲環節(輸入井、輸出井),SPOOLing技術負責輸入(出)井與低速設備之間的調度,邏輯上,進程直接與高速設備交互,減少了進程的等待時間。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

品讀迭部_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

初到迭部,就被這優美的景緻深深地迷住了。

這是一片被自然格外眷顧的土地,森林密布,群峰逶迤高聳,有的雄奇峻偉,有的博大秀美,河谷深切幽長。這裏像是一塊世外桃源,偶爾遇見幾個村民,遠遠地露出燦爛的笑容,熱情地沖我們招手。

在蜿蜒卻平坦的山路上行駛,一路山環路轉,天高雲清,蒼莽的大山如屏似劍,層層疊疊,間或有幾處村落,如珠落玉盤般點綴其間。在一處叫日爾那的村莊,我們發現這村子的每一道門、每一扇窗都蘊藉着厚重的傳統,同時又不乏現代文明的對接。這個村支部書記的弟媳竟是英國人,兒媳是著名的歌唱家,他們的家庭布置,保留着藏民的一切傳統,而家用電器也樣樣齊備。

多年來,各地的古街道、古建築不斷快速消失,幸好,迭部還保留着這些古老的農家小院。曾經看到一篇文章,提到西方不少的現代化富國,卻把“落後”村鎮的歷史文化遺產保護得極好,使之成為他們炫耀於世人的國寶。一個國家的現代與文明和歷史文化遺產有着千絲萬縷的聯繫,誰懂得這一點,誰就擁有了古今互動的輝煌。想必迭部已滲透了這些道理,所以才有如此和諧的景緻。

1935年9月13日-15日,中國工農紅軍長征途經現旺藏鄉政府駐地東南側茨日那村,毛澤東曾居住在該村一幢木樓上,並在這裏向紅四團下達了“以三天的行程奪取臘子口”的命令。在這個與中國革命歷史密切相關的小村莊的河邊,有兩棵大樹,據說紅四團曾在樹底下召開會議。如今,其中一棵經不起歲月的風霜轟然倒地,橫跨在河上,形成一座自然的“獨木橋”,另一顆仍筆直地矗立,見證歷史。

臘子口系藏語之轉音,意為“險絕的山道峽口”,是迭部通往漢族地區的門戶和重要交通孔道。臘子口周圍群山聳立,峽口如刀劈斧削,臘子口河從峽口奔涌而出。沿着盤山公路一路前行,迷濛的細雨不知何時悄然灑落,雨林里的生命籠罩着一層層神秘的面紗。動物都悄無聲息,大多數生物躲藏在豐盛茂密而又綠意盎然的植物簾幕後面,隱秘而又安靜地生活着。

漫步於臘子口的山谷棧道,山崖的石壁上鋪滿苔蘚,一股山泉從茂密的森林深處湧出,經過這石壁時,像不忍攪擾這寂靜的山林,輕輕地放慢了腳步,柔緩地漫過來,在山腳下匯成溪流,又流向山底。空山不見人,我們卻在密林深處看到了一個裝滿了野菜的竹筐,同行的一個人上前背起竹筐,不想試了幾回,這個壯年小伙卻被壓得站不起來。山民天天如此負重,讓我們不由地對他們的隱忍與堅強心生敬意。

“天險臘子口”是舉世聞名的臘子口戰役紀念地。1935年9月,毛澤東、周恩來率領中國工農紅軍第一方面軍,越過雪山草地后,全面攻克臘子口天險,使國民黨企圖阻擋紅軍北上抗日的陰謀徹底破產。1980年,甘肅省人民政府在臘子口戰役紀念地修建了紀念碑,紀念碑南、西兩面鐫刻着楊成武將軍親筆題字“臘子口戰役紀念碑”;北面鐫刻着省人民政府對臘子口戰役的簡介和對革命烈士仰慕緬懷之碑文:“臘子口戰役的輝煌勝利將永遠彪炳我國革命史冊;在臘子口戰役中光榮犧牲的革命烈士永垂不朽!”

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

山腳下,一座座小木屋在雨幕中安靜地佇立着,周圍茂盛的植物以及盛開的花朵毫無保留地張揚着她們的美麗。歷史成為永久的過去,卻可以激勵我們珍惜今天的所有。

迭部的美是一種整體性的空間美,一種生活意境美,一種文化山水美。它與我們的心靈如此貼近,以至於所有的偶遇都彷彿是早有默契。山、水、森林、動物和轉經的風車,此時此地都成為這風景的一部分。時常會經過一片片草場,悠閑的馬和牛點綴在林木蓊鬱、堆翠疊綠之中,如此和諧美妙。

一路上,叫貢保的小伙子陪伴我們,他笑聲爽朗,為我們的行程增添了不少樂趣。貢保的解說下了功夫,他的解說是根據自己的體驗和理解對迭部做出的解讀。這樣的解說,是獨一份的帶着鮮活體驗的、獨屬於貢保的解說。

言談中貢保不經意透露出憂慮,他提醒說,過去植被比現在茂密得多,現在我們看到的已經是被破壞過的植被,我不知道將來會有怎樣的後果。

一個導遊能有如此的悲憫情懷,“先天下之憂而憂”,我不由地對他的經歷產生好奇。他很爽快地告訴我,在蘭州上了幾年大學,畢業后又當導遊。但是父母希望他回到家鄉,他便依依不舍地告別蘭州,回到迭部,當上了小學語文老師。這幾天當導遊,是縣裡通知他得“重操舊業”幾天。他有一個美好的願望,希望能開辦一個旅遊公司,通過旅遊去保護迭部的生態環境。

正是因為這些可敬可愛的迭部人,才使我們深切地感受到自然的眷顧以及人文的關懷,他們以各自不同的表達方式對土地、自然、家園做最高形式的致敬,使我們回歸一種悠久的傳統中。

據說“迭部”藏語意為“大拇指”。傳說在古代,有一位名叫涅甘達娃的神仙路過此地,被密密匝匝的山石擋住了去路。他伸出大拇指輕輕一摁,頓時,山石開裂,驚天動地,顯露出一條長長的通道來。這個美麗的神話傳說,聽起來卻是如此貼切,因為不論是這裏的景緻還是勤勞善良的人民,都一樣令我們由衷地豎起“大拇指”。

本版圖片除署名外均來自網絡

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。