大峽谷里的甜蜜事業_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

  王文攝(影像中國)

  登高臨水,車窗外,在高黎貢山和碧羅雪山的夾擊下,怒江艱難盤旋,峽谷之中左沖右突,闖前撞后,鐘鼓雷鳴,奔騰不息,和瀾滄江、金沙江一起衝激“三江併流”的奇瑰壯麗景象。我想,那些奔波在怒江峽谷間的扶貧隊伍,不就是一道道奮力衝出貧困大峽谷的瑰麗激流嗎?

   

  一

  許多人都讀過楊朔的散文名篇《荔枝蜜》,文中主人公“老梁”如今成了“梁老”,是廣東省蜂產品協會的名譽會長。不久前,偶然得知“梁老”被珠海市駐雲南省怒江傈僳族自治州扶貧工作組請了過去,到怒江考察養蜂扶貧。他不顧高齡,翻山越嶺考察之後,認為怒江十分適合養蜂,還順道給怒江的幹部們傳授了生動的“養蜂經”。隨後,珠海在怒江幫扶了兩百多個本地中華蜂養殖點,幫助當地群眾成就甜蜜的事業。

  中秋節前,為了看個究竟,我馬不停蹄去怒江州跑了幾天。古人曾以“水無不怒石,山有欲來峰”來描寫怒江。我震撼於高山峽谷、石裂川奔的壯美景色,目睹水石相搏、響之激越的驚濤駭浪,親見碧羅雪山和高黎貢山“兩山夾一江,一江拽二山”的畫面:“掛”在陡坡的耕地,木棚屋的篝火塘,危險的溜索,以及茶馬古道。正如宋代王安石所言:“世之奇偉、瑰怪,非常之觀,常在於險遠,而人之所罕至焉,故非有志者不能至也。”壯麗的風景往往綻放有志者非同尋常的壯美人生。

  珠海駐怒江扶貧工作組組長張松,一上車就說起他的養蜂扶貧經歷:從珠海帶來的企業,考察一遍多數都跑了。為啥?交通不便,百分之九十八的高山峽谷,怒江五十多萬人口,貧困的佔了一半。當地無機場、無火車、無航運、無高速公路,進出一趟要幾天時間。一年兩百多天都在下雨,道路常見塌方。

  一路顛簸一路看,我逐漸對怒江作為我國最貧困的“三區三州”之一有了切身認識。怒江的大山裡,很多地方風景優美,卻也是與貧困作鬥爭的一線。海拔越低,平地越少,山頂的村民除了在緩坡上種些玉米等糧食外,少有可脫貧致富的產業。

  怒江,渾身透露着大自然的那股韌勁兒。一邊雲霧繚繞,風光旖旎,幽谷懸岩,絕壑奔流,穠花異草,山水如畫;一邊面臨着艱巨的脫貧攻堅任務。鮮紅的三角梅,一簇簇迎風搖曳,山坡上開得正艷。張松說,扶貧還是要結合怒江當地實際,找准產業扶貧項目。“這不,我們把梁老請了過來,一番考察,發現怒江生態環境好,蜂蜜質量高,技術容易學,當地就有樹桶養蜂的傳統。而養蜂最需要的花源和蜜源,怒江都具備。玉米多,有充足的花粉供養小蜜蜂,利於蜂群繁殖。崇山峻岭,生態植被好,野桂花、杜鵑花、板栗花、草果花、油菜花……各種花多,有充足的蜜源,缺的是技術培訓和扶貧引領。”

  扶貧先扶志,有志者事竟成。扶貧項目確定后,工作組找到珠海專業養蜂的何伯農業公司合作,請他們派技術人員負責培訓,雙方一拍即合。一年來,派駐的一百多名珠海養蜂人行走在怒江的高山峽谷間,風餐露宿,披星戴月,培訓了兩千多名怒江養蜂人。

  養蜂人的到來打破了峽谷的寧靜,給怒江的山水增添了幾分熱鬧,也為我重新審視怒江打開了想象空間。怒江州因怒江而聞名。我以前覺得,怒江之美,最壯觀的是大峽谷,但現在覺得,怒江之美,還有那行走峽谷間,日夜與貧困頑強抗爭的養蜂人的堅韌。對為幫助他人實現美好生活而奔走的人,我們應該表達足夠的敬意!這正是人們綿延不息、不屈不撓、砥礪前行的精神偉力!

  登高臨水,車窗外,在高黎貢山和碧羅雪山的夾擊下,怒江艱難盤旋,峽谷之中左沖右突,闖前撞后,鐘鼓雷鳴,奔騰不息,和瀾滄江、金沙江一起衝激“三江併流”的奇瑰壯麗景象。我想,那些奔波在怒江峽谷間的扶貧隊伍,不就是一道道奮力衝出貧困大峽谷的瑰麗激流嗎?

  二

  扶貧工作組的同志熱情邀請我們去一個養蜂培訓點看看。綿綿細雨中,車子從丙中洛出發,沿怒江而行,崎嶇山路,斗折蛇行。遠眺山峰,一座座高腳木樓,錯落有致。約一個小時,來到一處山坡。坡地一字形擺放好幾排蜂箱,小蜜蜂從箱底沿小孔忙碌地進進出出。

  這裡是貢山獨龍族怒族自治縣閃當村吉木登小組的養蜂培訓點。村小組幹部領我們爬上山坡,鑽進一個簡陋的塑料棚。地上幾個木箱,箱上鋪着軍大衣,這就是守夜的床了。剛一坐下,他就介紹起小組養蜂培訓情況。

  “包了五十箱蜂,有一箱跑了蜂王,還有四十九箱蜂。”

  “大夥培訓了一個多月,每天傍晚5點到9點,集中培訓三四個小時。”

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

  他指着蜂箱旁邊席地散坐的十餘個村民說:“來培訓的都是建檔立卡貧困戶,免費培訓,我們村幹部要先學會,再教組裡的人。我有信心帶領大家學好養蜂技術,帶動脫貧。”

  老譚,是珠海何伯公司派駐的技術員,負責吉木登村小組培訓。他一身黃色的技術員服,十分醒目。談起養蜂,老譚滔滔不絕:“先要學習分蜂,繁育蜂群,一箱分成兩箱,一群分成兩群,也就幾天工夫。再有十多天就可以產蜜了。”

  “分群就要育王,育王先要製作育王杯。”

  老譚舉起一排蜂蠟製作的蜂巢說:“瞧,這就是育王杯,把一到三天的蜜蜂幼蟲放進去,喂以蜂王漿,長大就是蜂王,再挑選出強壯的放進蜂箱就可以分群了。”

  “新蜂王放進去前,先要把老蜂王關起來,不然會打架。”老譚小心地打開蜂箱,從箱角拿起一個火柴盒大小的白塑料盒,有細欄杆遮攔。細瞅,裏面關着一隻大個頭的黑蜂王。“蜂王個頭大,鑽不出蜂盒,瞧,那幾隻進出忙碌的小蜜蜂在忙着喂它呢。”

  “蜂群如果沒有蜂王,蜜蜂就會四散而去。剛放的新蜂王需要老蜂王壓壓陣容,等到新蜂王立穩了,就可以和老蜂王分開,分出新的群。蜂群多,產蜜才多啊!”

  我好奇地問:“為什麼老要換新蜂王呢?”

  “蜂王壽命三年,繁殖能力下降。新蜂王年輕力壯,蜂群的繁殖就快。年輕的蜂王一天多的可產八百多粒子。”

  面對眾人的好奇,老譚小心翼翼取出一巢框蜜蜂給我們看,巢框密密麻麻爬滿蜜蜂。蜂王早早躲藏起來。他指着巢框白色的部分說:“白色的是蜂蠟,下面覆蓋的就是蜂蜜。取蜜時要先割掉蠟。黃色的部分是花粉,哺喂花粉長大的就是小蜜蜂。”

  “蜂蜜是蜜蜂的糧食,人類都取走後,蜜蜂怎麼辦?”

  老譚笑着說:“不用擔心,每次取蜜,都會給蜜蜂留口糧的。蜜蜂雖然很勤勞,但是,當蜂蜜充足的時候,蜜蜂也會懶惰不再工作。人們取走蜂蜜后,小蜜蜂就又會辛勤勞動了。”

  我開始為蜜蜂着迷。蜜蜂的團結合作、勤勞奉獻,給我留下了深刻印象。它們以自己獨特的方式“參与”到東西部結對扶貧事業中。今年,珠海投入幫扶資金三千多萬元,向怒江一百八十七個養殖點贈送一萬八千餘箱蜜蜂。村裡每個建檔立卡貧困戶可分到五箱蜜蜂,按一箱年產十斤蜜、每斤五十元計算,一戶年收入兩千五百元。如果學會分箱技術,收入就更高,並且由何伯公司以保底價收購。貧困戶可以採取承包養、合作社養等多種方式。

  “收蜜啦,收蜜啦!”山花綻放,老窩河歡快地匯入怒江,清脆的歡呼聲傳遍山林。瀘水新寨村的養蜂點,第一次收蜜就搖出三百斤純蜜,不等收購,被本地市場一掃而光。去年,怒江三十個養殖點,就幫扶建檔立卡貧困戶一千五百多戶,六千五百多人受益,其中七百四十多人當年脫貧。

  養蜂扶貧賬,越算越開心。“這中間還有個小曲折,剛開始貢山縣個別同志對引進外地中蜂養殖有疑慮,我趕到縣裡組織養蜂座談會,從科學角度作解釋,說服大家同意引進珠海中蜂養殖。”梁老的一番話解開了謎底,“過去怒江人也養蜂,是從樹洞、岩穴里的蜂窩獵蜜取子,毀巢取蜜,方法原始。如今科學馴化養蜂,送蜂上門、技術幫扶、保底收購,加上其他種養項目,收入倍增,很快邁上脫貧奔小康之路……”

  短短几天,我目睹了峽谷萬物從不放棄生長的強大生命力。樹木枝繁恭弘=叶 恭弘茂,灌木千姿百態。野薔薇,就跟裝了彈簧似的,要蹦到太陽身邊去。萬物生長,增添了我對蜜蜂的喜愛,也啟迪我找到了此行的收穫:扶貧一定要扶到群眾心坎上。只有切合實際的精準扶貧,村民收穫才會更大。不僅要扶智扶志,還要做好技術服務,這樣扶貧會更有生命力。

  養蜂的知識還沒學夠,催生植物的雨水又到了,滴滴答答地送來了漫山遍野的花期。像蜜蜂抓緊花期釀蜜一樣,怒江也到了脫貧攻堅的關鍵期。讓我感動的是,梁老以七十七歲高齡與三百多名珠海扶貧幹部一起,奔走在怒江的高山峽谷間,為消除貧困而跋山涉水。珠海市三年來在此地投入幫扶資金近九億元,支持了養蜂、中藥種植、蔬菜基地、扶貧搬遷等四百多個扶貧項目,帶動建檔立卡貧困群眾兩萬多人脫貧。當地群眾正在擺脫深度貧困,迎來新的歷史性跨越。

  望着飛來飛去的小蜜蜂,我也忽然想到,這些勤勞的小蜜蜂知不知道自己的辛勤勞動,也是在為怒江脫貧攻堅而釀造甜蜜的未來呢?

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

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

Intel 發表新一代 Optane SSD 系列,並同步推出三款採 144 層單元 TLC、QLC 的新款 SSD_貨運

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

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

等了許久的時間,Intel 終於推出了新一代 Optane SSD 系列,分別為專為資料中心設計的 Intel Optane SSD P5800X,以及專為消費端打造的 Intel Optane Memory H20。另外,這次還同步亮相 3 款導入 144 層單元的 NAND SSD。

Intel 發表新一代 Optane SSD 系列與三款採 144 層單元的 SSD

Intel Optane Memory H20 結合 Intel  Optane Memory 與 Intel QLC 3D NAND 技術,為下一世代輕薄筆電所設計,可放入更有限的空間內,透過 PCIe 的高效傳輸速度,讓使用者體驗到更快的反應速度,如:搜尋檔案、執行應用程式等等:

Intel Optane SSD P5800X 是 Intel 首款導入 PCIe 4.0 控制器的 SSD,相較於前一世代產品,效能上提升 3 倍以上,並擁有更出色的耐用性:

D7-P5600 與P5800X 的 KIOPS 差異:

而 3 款 144 層單元的 NAND SSD 分別為:「Intel SSD 670p」、「Intel SSD D7-P5510」與「Intel SSD D5-P5316」。

Intel SSD 670p 採用 144 層 QLC 3D NAND 設計,提供端到端資料保護與 Pyrite 2.0 的安全性和斷電通知:

跟上一代 660p 相比,670 的動態 SLC Cache 提升 11%:

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

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

Intel SSD D7-P5510 為全球首款 144 層 TLC NAND 設計的 SSD,專為雲端高容量儲存市場打造,具備 U.2 外型,容量部分有 3.84TB 與 7.68TB 兩種選擇,也內建改進後的裝置健康監控,預計 2020 年底開賣:

Intel SSD D5-P5316 是業界首款針對大容量儲存裝置研發的 144 層 QLC NAND SSD,每個晶粒具備 128GB 容量,預計提供 15.36TB 與 30.72TB 兩種容量。而藉由 QLC 優勢,相較於傳統硬碟不僅提升 200% 的讀取效能與 38% 隨機讀取效能,也降低 48% 的存取延遲。外型方面有 U.2 與 E1.L 兩種,預計 2021 上半年開賣:

至於詳細推出日期與價格部分目前都還不知道,但猜測離開賣時間越近,Intel 就會公布更詳細的售價資訊。

部分圖片來源:anandtech

Intel Evo 平台認證筆電精銳盡出,絕佳效能讓你搶佔先機

您也許會喜歡:

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

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

※回頭車貨運收費標準

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

Netflix 正在悄悄向部分Android 版用戶推出音訊播放模式_網頁設計公司

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

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

有些時候,你會不會只想聽電影或電視節目的音訊而不想看影片?有些節目確實用聽的就好,Netflix 想要覆蓋全部用戶所希望的功能,如果你是一個 Android 裝置的用戶,那你可得好好期待一下。已經有用戶發現自己的應用程式中出現了音訊播放的選項,下次去跑步時就聽著你最愛的影集吧!

Netflix 正在悄悄向部分Android 版用戶推出音訊播放模式

早在今年 10 月間,XDA Developer 就已經在 Android 應用程式中發現了音訊模式的蹤跡,只是當時設定中的該選項併不能使用,而現在 Netflix 似乎開始正式推出這項功能供用戶選擇。據國外媒體 Android Police 報導,這項功能出現在應用程式版本 7.84.1 build 28 35243 中,當你獲得該功能並且於設定中啟用它後,當影片全螢幕播放時,你會看到一個新的影片關閉按鈕,只要啟動音訊模式,Netflix 用戶將能在不看影片的情況下單純聆聽喜愛的節目、影集與電影。

▲圖片來源:Android Police

在介面上你還是可以看到熟悉的控制項,包含改變播放的速度、倒帶、快轉、暫停等,與看影片時的體驗一模一樣,只是少了影像而已。對於某些行動網路沒有辦理吃到飽方案的人,又或是網路費用較高的國家來說,光只有音訊播放可以節省下一些網路流量。你可以把它想像成就像在聽 Podcast,但又不太一樣,對於很多電影與節目來說,影像對整體來說並不是關鍵,特別像是家庭情境喜劇、脫口秀、記錄片之類的節目。

▲圖片來源:Android Police

對於提供線上串流影片服務來說,很多人會覺得光只有聲音這點怪怪的,但有時一卯起來看就是會讓人欲罷不能,音訊模式在家裡可能比較沒有意義,但在通勤途中或當作工作時的背景噪音就會很實用。

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

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

◎資料來源:Android Police、

您也許會喜歡:

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

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

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

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

考研經驗分享(上岸南理工)_包裝設計

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

 

前言

對於很多人來說,考研(升學)是一個不可避免的話題,這其中也面臨着很大的抉擇和猶豫之中。如果是其他專業的話,這方面的猶豫和掙扎可能少一點,但是對於計算機專業的我們來說,這方面的猶豫可能會更多一些。今天藉著這個話題聊聊考研以及自己路途的所見所聞。以下均代表個人意見,請斟酌查看!

為什麼考研

首先,對於考研的群體來說,大致可能分為下面幾種類型:

  • 提升學歷、學校層次、擴大更好機會
  • 深入研究科研(算法類),不想搞工程
  • 不想工作,也沒工作技能,考研緩衝
  • 跟風考研

對於上面的幾種類型,你要弄清楚你當前階段想要的和得到的是什麼,不滿足的是什麼。考研的選擇你要充分考慮你自己的需求,而你自己當前的能力水平、學歷學校層次、家庭條件、熱愛技術的方向等等因素都是需要你進行綜合考慮的。

首先計算機專業的考研我一直覺得一定要慎重選擇的。這是一個機會的選擇問題

  • 首先考研肯定有風險,風險也挺大,好的學校報考人數較多,這是其中一個需要進行考慮得東西
  • 其次考研基本就是要放棄大三暑期實習生招聘、大四秋招。然而在這個期間很多大廠、互聯網企業會提供很多機會、優質的待遇。如果實例夠強、運氣不那麼差還是有很大機會找到心儀的工作的。
  • 還有很多人懷揣夢想想搞算法,到了研究生階段沒有自己的方向跟着導師盲目研究,就業時跟985本碩等其他大佬競爭,難。
  • 還有成長平台的問題,三年(兩年半)時間。你可能會遇到0成長外包,也可能遇到高成長上進的公司。也可能遇到伯樂研究三年,也可能給了低微的報酬幫導師打三年的工。
  • 最直接的就是錢的問題。工作存款和升學消費這也是挺大數據的一個對比。

當然,考研是有很多好處的,比如提升學歷,提升學校,更多機會,更優秀的圈子等等。

對於我為啥考研其實原因也挺多:

  • 首先,從我自己來說很想擺脫雙非的帽子吧,想在研究生專心搞一些自己更喜歡的東西,然後有更大的機會進大廠
  • 其次,地處農村,身邊高學歷確實不多,這個不累述懂就行了吧。
  • 最後,在考的時候有算法夢,但考完之後還是打算工程,但是多認識一些人,擴個圈子、和有趣的人做些有趣的事也是一方面目的。

擇校選擇

考研擇校一般在考研初中期決定,一個學校也能部分的代表考研的價值和含金量,但是這個考研很容易部分學校扎堆,部分學校沒人考這種。

首先我覺得要考研的話就是要對學校層次定位,這個分為主觀和客觀條件。

  • 從客觀來講,考研群體擇校大致是這樣的:二(三)本更多報考部分211或一本,一本報考更多部分985或211,211報985更多一些。也就是大部分人考研選擇的層次都比自己當前院校強一點或高那麼一個層次。
  • 從主觀來講,要看你個人的學習能力和決心,你如果處在專業頂尖的存在和期望,那你可能比普通的同等次的人擇校高一些層次,還有有些懷揣名校夢的大佬肯定選擇也會不同。別太飄也別太慫了。
    在這裏插入圖片描述

其次就是同層次院校的(區域)選擇問題:

  • 考研分旱區和澇區,差不多水平院校有些地方的研究生可能要比有些地方的好考一些,比如東北地區,西部等地區有些985,211上岸的難度還是很可觀的,而幾大直轄市、江浙以及部分發達地區和城市的院校報考的真是扎堆。這真的挺讓人糾結的:學計算機當然在大城市,發達地區更好,但這些地方的院校競爭太大 考的性價比還不如部分其他地區,這就讓人進退兩難。同時自己也要考慮好自己是否有地域偏好等問題。

最後學校的專業也考客觀考慮一下,某些院校的不同專業、專學碩考起來的難度也不同,當然有的學校偶爾可能爆熱,,有時也可能爆冷。

幾個問題

有個別學弟妹問幾個問題在這裏闡述一下。
是否需要報班?

  • 可以但沒必要,報班挺貴的,你跟着身邊研友,看着各個老師出的視頻、練習跟上進度(用某度雲可以嫌慢偶爾開個會員)。就差不多了,報班有作用但個人覺得這個短期衝刺每天都在高強度學習自我規劃好完全沒必要去花那一大筆錢,加個該校考研群,買個資料進個vip群就行了。可能也就2-3百左右然後還有他們學校專業課歷年試題之類。

怎麼確定自己要報的方向?

  • 這個挺重要,有的學校其實進去之後方向每那麼明顯主要跟導師,但有的學校計算機和軟件可能不在同一個校區(地區),有的可能支持校內調劑,並且有的專碩、學碩年限可能相同或不太相同,但是我個人覺得:學校相比來說更重要些,學院專業次之。能狗進去就好。當然,能選擇好的地理,教育資源當然最好,具體政策要看你報考的學校了。

對自己報考的方向知識淺薄,複試是否會受影響?

  • 有點影響但不致命,如果考名校那可能壓力比較大,每年跨考計算機上岸的其實都挺多的,不過跨考或者你專業技能較弱在複習無論初試還是複試可能要花更多時間,更累。當下定決心、肝就完事了,千萬不要因為跨考、專業知識薄弱自卑。其實客觀來說,考研的除了個別真的強,大部分其實是偏向本科期間考試偏強的那部分人。很多專業技能強得要麼保了,還有進大廠了。剩下考研群體強得,多但是沒那麼多。所以你跟他們的差距真的沒那麼大。好好準備,好好學習沒啥問題,別擔心!

如何正確看待分數:

  • 分數這個東西,不同專業、不同省份、不同學校都可能不同,不能只光光拿分數來看,有的省份政治英語壓分,這就低一些,有的省份(學校)專業課偏難,均分降低這分又低了,分數只能代表部分或者其他大部分人水平但是絕對不能代表所有的水平。

初試準備

談起準備,老學長不由得羞愧起來,我是去年7月份初才真正意義上開始準備考研,並且在準備初期做了無用得功——不看視頻直接看書刷各個章節測試,這樣也浪費了幾天後來開始買了1000題跟着宇哥得視頻開始刷題。

準備開始時間問題

  • 這個準備得時間,當然是越早越好,但是個人覺得大三下部分時間+暑期+大四上時間上應該是足夠了,當然奮戰清北復交那種或者專業課爆炸多、難那種另外可以特殊考慮。如果專業課2門,其實暑假開始時間上還行,如果專業課比較多,那建議提前開始。比如我的專業課三門,然後開始準備比較晚,效率也不是很高,專業課考的就比較一般。
  • 另外,如果對數據結構、高數掌握不太好得童鞋一定要提早開始,因為這兩門佔用得時間相對較多,學習起來較慢,如果開始得很晚如果學習時候遇到障礙,(隊友研友如果都掌握了)心態很可能會崩塔。這時就要穩住心態了。我很多研友在大三下就開始準備很多,等我複習得時候暑期他們高數和1800的高數部分都差不多了,當他們開始線性代數的時候我還在搞高數,晚上跑步時候他們談論線性代數的問題,,我啥都聽不懂。。。。插不上一句話。。。。在這裏插入圖片描述
  • 當然最後如果此時看到的你如果非常想考研,也是不晚的,也有部分人開學后三四個月上岸,這取決於個人當前學習能力和知識儲備決心。當然,未雨綢繆肯定最最穩妥的做法。

對於學科的看法,我覺得最主要要穩住的就是數學、專業課,英語政治順帶搞搞就行。

數學:

  • 個人覺得考研最重要的就是數學了。講真,英語政治只要稍微搞搞,那種差距沒那麼明顯(個別大佬請pass此條),主要數學不能炸,數學最近幾年是一年容易一年難,但是總體難度還是趨向上升的階段,在這個時間段內你能否以平和的心態寫完這張數學卷,或者會算就是算錯,那是非常傷的。
  • 對於高數的複習,可能近半時間都在搞得是高數,大部分暑假當然也是在搞高數,刷完1800或1000或者其他配套的練習,至於跟誰的視頻,我覺得各個老師風格不同,蘿蔔青菜,各有喜愛,我當時跟的是宇哥。高數怎麼開始?就是看視頻+刷題,就是看視頻+套公式刷題+總結+回顧。簡單粗暴而又高效。對於比較好的習題冊,1800、1000題(難一點)、660比較適合開始。開學后可以閉關修鍊之類強化,最後真題模擬題開涮。
  • 高數還是要搞得穩一點,提高速度和正確率,掌握部分偏難題,有些卷子可能容易一些,如果考難了可能會比較懵逼會直接爆炸。我有些研友平時就刷高數基礎題,難題不碰他說考研難得也做不出來,結果20考研這卷子他就炸了。。。
  • 線代跟李永樂老師就得了
    在這裏插入圖片描述

專業課:

專業課這個地方也有坑的,專業課的難度看學校。有的學校專業課門數多,還難那種我們俗稱壓分,所以有時候我們有時經常聽到 誰誰考了啥350360複試都沒進,,還有時候聽到誰誰310320都上岸了某好學校。這個雖然專業課不是全部,但是佔大部分。

專業課難度:

  • 有的學校專業課真的考的又難又多門數也多(我就是),上岸的人專業課可能專業課均分只有8090分,這樣的直接影響就是你的整體分數會被拉低不易調劑,如果專業課均分90和專業課均分130的那就是40分的差距,,如果這個人320涼了可能不一定好調劑,,但是360涼了調劑相比320肯定選擇就多了很多,調劑不看專業課是啥,只看分數。有些院校、區域可能都有這種壓分的傾向,所以在報考時候也要慎重選擇,考慮清楚。如果你是一鼓作氣只想該學校,那就沒啥顧慮,如果你是只想有更好的學上,那就得認真打聽了。

數據結構:

  • 這門專業課應該是計算機必不可少的,專業課都可以使用王道或其他專業考研教材刷題都挺好的,如果數據結構基礎較好,那麼學起來、刷起來可能會容易很多,如果基礎不太好,多看看視頻。在這裏推薦B站,哪裡不會搜哪裡,數據結構的話青島大學的王卓老師講的課程真的挺好的,當然鄙人也總結了部分各位可以觀摩,我當初就用個平板忘記了就看看,不過我有數據結構的基礎,在這方面也沒花太多時間。
  • 不過可能很多人的數據結構可能並不是很好,尤其是入門時候可能很痛苦,抽象的鏈表二叉樹搞不明白,遞歸算法想不通順。剛開始入門需要多看基礎類的視頻和博文,看的多了慢慢就消化了,總的來說這就是一個時間花費的問題。如果你是大二或者大三上看到此文章,這或許也是n年後的事情,提早刷題、多刷題還是非常有必要的,有算法基礎學數據結構其實還是很容易的。

買對應學校資料

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

  • 考研除了408統考之外基本各個學校各自出題這樣,都是他們學校自己的老師出題,那你搞到他們的題庫和歷年真題就是很重要了,加入他們的考研群、購買他們的考研專業課資料、試題很有必要的。跟着王道學完一遍專業課到了秋天就要抱着他們歷年考研試題,期末試題等進行研究了。當然有些學校沒歷年真題但是只有回憶版,你要通過他們學校的學長的考研小機構進行操作一番了。重要一點:他們學校真題和題集很重要! 你的考研專業課試卷可能就是他們學校普通2-3門科目的期末考試組合起來的一張試卷。所以考本校的話專業課這方面優勢可能要大一些的。

英語

英語這個東西比較玄學,有人天生英語好,不努力不怎麼花試卷也能每次都考的不行。英語個人覺得前中期每天早晚稍微背背單詞就行了,但是對於可能很多二本的學弟學妹們可能英語是個必殺砍,這樣的話你們就要在英語方面每天堅持花時間背單詞。然後有時間搞搞其他模塊。

對於英語整張試捲來說,無聽力,完型分值較低,閱讀理解佔比最大,差距都靠閱讀理解拉開。20個閱讀理解每空2分,學的好的人可能錯4個以內(篇均錯1以內),有的人每篇5個平均錯2個那就錯8個,這樣8分差距就出來了。所以有時間多練閱讀理解即可。

歷年真題考前做完。而我英語的複習比較懶,,單詞沒怎麼背,,真題就做了10-19的前面部分。。新題型考前一天做了兩篇,,大小作文考前一晚整理模板,,,說來真慚愧。這樣準備導致最終結果也很一般,各位一定要提早準備好該準備的東西。。

在這裏插入圖片描述

政治

政治最後搞,考前一兩個月這樣搞搞,部分不理解的地方可以看徐濤老師視頻(不用全看),本來想背濤哥 核心考岸,後來說等肖8背肖8,後來又覺得肖8大題太多背肖4,,再後來覺得肖4所有題還是有點多再背重點題,,不重點的看看,,最後考試時候瘋狂胡扯、瘋狂套就得了。。當然,政治選擇題其實有點難的,想拿高分也得花時間的,要根據自己需求去中和時間。

總結

對於各科來說,數學和專業課是拉分較大的地方(重點關注),政治和英語可能是個別人 的強勢(不建議頭鐵花太多時間,個別大佬例外)。跟着各個考研老師的大節奏,穩重求進。前期剛高數,中期高數專業課,後期習題真題各科齊頭並進。考前多看看專業課(類似考前突擊)。

複試準備

對於不同學校,複試內容也不同,各個學校複試佔比也不同,有6:4的,還有5:5的。雖然初試很重要,但是複試的落差也可能造成不小的波動。我們常看到某新聞,某某某高分被刷,那可能真的就是以為自己穩了複試隨便搞結果涼涼了。有的學校複試有機試、筆試。有的可能主要面試。並且有機試的一定要準備好因為機試拉分比較大,筆試也是同樣的。對於大部分的複試來說都是公平的,但是有些院校不保護一志願,比如蘭某大學,寧某大學。大量等待雙985調劑生的學校也是存在的,這些也要慎重考慮。

如果時間來得及,提升硬實力還是很有必要的,多參賽,多證書,GPA高點,四六級好點也都挺好的。

我的南理準備

專業課

我是考的20軟工專碩,本來是825(數據結構+操作系統)然後在7月初轉成824(數據結構+操作系統+離散數學),因為數據結構有基礎,但是我的複習進度比較慢,9分月開開始操作系統的複習,10月份才開始離散數學的複習,離散對於剛開始的我確實是蒙的一批,都不知道怎麼搞了。因為離散的那本書的內容太多了,課後習題也比較多,後來還好找到了一份答案再繼續看。

對於專業課的複習,我剛開始就是第一遍跟着王道把數據結構和操作系統學完題目做完。9月(可以早點)後來就做他們學校的考研專業課資料了,我買的是蘭碼計算機考研資料。價格其實算算的話也還行。關鍵是買了資料後進群就有一群同樣考研的人,你不進去的話別人都在討論的問題每天的進度都有一定約束力。並且一些注意點的話,學習資源之類也可以分享,雖然表面上各個確實是競爭對手,但實際上還是比較熱心的幫助的。並且裏面學長的話也會分享很多經驗可以借鑒。可能各個學校都有這樣的群,加入其實還是很有必要的。

不過我自己最後考研專業課有點難,考的懵逼炸了,比估分低了20,,分數出來就知道涼了,然後就投身 苦逼的春招去了。。

南理考研

對於很多網上黑理航倆兄弟,怎麼說,大部分還行,可能以往複試、出成績就是有點慢吧。就今年來說,計算機和軟工擴招挺多,複試線290左右(專業課均分低)。競爭雖然挺高但是光看分數來說其實還行。因為咱們這種低分黨比價多所以有點危險,但是你如果準備充足,選擇對的方法、找的對的隊友。其實來說也還行。並且複試來說流程非常公平的。至於找不找導師其實都是錄取后的事情了,,因為錄取前導師一般不會理你,或者最多說:加油,請錄取后再聯繫之類。複試有筆試、機試、面試適合能力較強的人準備。

在這裏比較吹一波南理的考研群確實是挺好的,裏面的學長挺負責人也挺人性化的,基本複試的內容群里也都分享ppt之類的資料,也會帶領大家進行刷題,其實很多小白在這麼疫情幾個月的訓練算法提升確實挺大挺有收穫的。

其實每個學校可能都有那麼些挺好的組織,這個需要你來斟酌,如果你想考南理的話可以加他們蘭碼的企鵝號(良心推薦)801169280

結語

對於我自己來說,,我是渣渣中被擴招擴進來的幸運兒,,本來初試成績在擴招名次之外差10名,然後得知進複試準備複試內容(10分鐘筆試,8分鐘機試,10+分鐘面),也是疫情影響遠程複試。不過最後順利的逆襲綜合成績前進了20名進了(所以務必好好準備複試)。本來都簽了工作也準備解約了。確實蠻幸運的。

通過找工作那麼久了解市場、需求。結合自身的特長和能力,還是在研究生階段打算搞工程,算法工程師還是太難了,其實工程相對來說對更多人來說可能真的挺好的。不少無方向啥都不懂進去就是跟導師搞算法,結果最終搞着搞着根本不夠格作為一名算法工程師還是去搞開發,何必呢!所以無論搞啥一定要有自己選擇的目標和方面,分析市場,分析自己。包括考不考研也是一樣的問題!

在這裏插入圖片描述

在考研過程,感謝所有認可和支持認為我還行的人,以及身邊的研伴和朋友的支持。後面我會繼續知識輸出,歷所能及得分享!

在這裏插入圖片描述
下面是20年和前幾年考研學長統計得一些情況:
在這裏插入圖片描述
最後,我是一枚幸運的渣渣,只是運氣好而已在最底層僥倖上岸。如果是看到的你,奉勸:要早、要堅持、要進群、要有隊友。我想起崔的一首詩:

 

  • 昔人已乘黃鶴去,此地空餘黃鶴樓。
    黃鶴一去不復返,白雲千載空悠悠。

未來是你們的,不管考研與否,向著自己喜歡的東西和方向,加油!

歡迎關注微信公眾號:bigsai 一直分享技術和經驗的bigsai哥哥。

在這裏插入圖片描述
在這裏插入圖片描述

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

AirPods Max 各種顏色耳罩搭配看起來如何?試試這網站,自由搭配出個人專屬配色耳機_包裝設計

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

日前 Apple 的首款頭戴式主動降噪藍牙耳機 AirPods Max 無預警突然在 Apple 台灣官網開放訂購,當時最早一批訂購的消費者可在 2 月初收到產品,如果有另外使用官網的免費鐫刻服務添加文字、表情符號或數字的消費者則需要再多等幾天。即便對不少人而言這組耳機的售價可能有些難以負擔,但對於 Apple 的忠實顧客或其他有需求的族群,仍然是款不錯的耳機。

AirPods Max 各種顏色耳罩搭配看起來如何?試試這網站,自由搭配出個人專屬配色耳機

在 Apple 台灣官網比外界預期還早開放 AirPods Max 訂購,雖然開賣時間早卻也讓許多原本已有計劃入手 AirPods Max 的消費者有些措手不及,因為這次光是耳機就有銀色、太空灰色、綠色、天藍色以及粉紅色共五種顏色選擇,消費者還能依照個人的需求添購其他顏色的耳罩,搭配出更多種不同的專屬風格。

倘若各位在 AirPods 顏色挑選上猶豫不決,不知道每種耳機和耳罩顏色在實際搭配看起來如何,現在就有個 AirPods Max 耳罩搭配的模擬網站(點我前往),讓使用者可以直接選擇各種顏色的 AirPods 耳機、左耳耳罩襯墊、右耳耳罩襯墊,同時也能計算出需要付出的費用,可說是相當貼心呀!當然,如果本來也沒有要買,只是想玩玩體驗一下顏色搭配的樂趣,也是能試試看(點我前往)。
假如只是一般選購一組耳機和耳罩襯墊都同色的 AirPods Max ,建議售價為 549 美元(台灣建議售價為 18,490 元新台幣):

如果只添購一組不同色的 AirPods Max 耳罩襯墊, AirPods Max 耳機本體加上 AirPods 耳罩襯墊的建議售價為 618 美元(台灣建議售價為 20,780 元):

當然,選購一組不同色的 AirPods Max 耳罩襯墊,原本耳機標配的同色耳罩襯墊也是能拿來搭配一下:

如果 AirPods Max 耳機、左耳耳罩襯墊與右耳耳罩襯墊都要不同的顏色,則總共需要購買兩組 AirPods Max 耳罩襯墊,那麼售價總共需要 687 美元(台灣建議售價為 23,070 元):

以下也整理幾種配色也不錯的搭配方式,可以提供給之後想另外加購耳罩襯墊的 AirPods Max 的消費者參考:

像是銀色是許多果粉心中最能代表 Apple 的產品配色,不過實際使用上擔心銀色的耳罩襯墊容易髒,搭配黑色耳罩襯墊就是低調又不會太難與服裝搭配:

今年 iPhone 12 系列、 iPad Air 4 或 Apple Watch SE 都推出藍色的配色,銀色的 AirPods Max 搭配藍色耳罩襯墊也相當好看:

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

如果想左右耳都用不同顏色,粉紅色和藍色也相當搶眼:

綠色的 AirPods Max 則推薦能選擇黑色或銀色的耳罩襯墊進行搭配:

雖然 AirPods Max 耳機已經突然在 Apple 台灣官網開放訂購,不過目前 AirPods Max 其他耳罩襯墊至截稿前還沒有辦法購買的。因此,如果未來想另外添購其他顏色耳罩進行搭配,還是先多試試看這次分享的 AirPods Max 配色模擬網評估一番囉!畢竟光是訂購一組 AirPods Max 和添購一款其他配色耳罩襯墊備用,就已經要花費超過兩萬元不算太便宜的開銷。

AirPods Max 商品頁面:點我前往訂購(Apple 台灣官網)
*Apple 官網訂購享最高 12 期 0% 利率分期付款
AirPods 耳罩襯墊:點我前往(Apple 台灣官網)

假如想買 AirPods Max ,卻仍遲遲無法決定要訂購哪款配色的 AirPods Max ,亦不確定之後會不會加購其他顏色的耳罩襯墊,那麼像是太空灰色或銀色的 AirPods Max 都是顏色上比較耐看的,最早一批訂購的台灣消費者預計能在 2021 年 2 月 4 日收到。

延伸閱讀:
Apple M1 版 MacBook Pro、MacBook Air、Mac mini 通過 NCC 認證

iPhone 12 Pro Max 對決三星 Galaxy Note20 Ultra 電池續航測試:兩陣營大尺寸旗艦擔當,究竟誰輸誰贏?

您也許會喜歡:

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

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

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

[leetcode] 並查集(Ⅱ)_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

最長連續序列

題目[128]:鏈接。

解題思路

節點本身的值作為節點的標號,兩節點相鄰,即允許合併(x, y)的條件為x == y+1

因為數組中可能會出現值為 -1 的節點,因此不能把 root[x] == -1 作為根節點的特徵,所以採取 root[x] == x 作為判斷是否為根節點的條件。默認較小的節點作為連通分量的根。

此外,使用 map<int, int> counter 記錄節點所在連通分量的節點個數(也是merge 的返回值)。

class Solution
{
public:
    unordered_map<int, int> counter;
    unordered_map<int, int> root;
    int longestConsecutive(vector<int> &nums)
    {
        int len = nums.size();
        // use map to discard the duplicate values
        for (int x : nums)
            root[x] = x, counter[x] = 1;
        int result = len == 0 ? 0 : 1;
        for (int x : nums)
        {
            if (root.count(x + 1) == 1)
                result = max(result, merge(x, x + 1));
        }
        return result;
    }
    int find(int x)
    {
        return root[x] == x ? x : (root[x] = find(root[x]));
    }
    int merge(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (x != y)
        {
            root[y] = x;
            counter[x] += counter[y];
        }
        return counter[x];
    }
};

連通網絡的操作次數

題目[1319]:Link.

解題思路

考慮使用並查集。

考慮到特殊情況,要使 N 個點連通,至少需要 N-1 條邊,否則返回 -1 即可。

通過並查集,可以計算出多餘的邊的數目(多餘的邊是指使得圖成環的邊),只要 findroot(x) == findroot(y) 說明邊 (x,y) 使得圖成環。

遍歷所有邊,在並查集中執行合併 merge 操作(多餘的邊忽略不合併,只進行計數)。設 components 為合併后后 root 數組中 -1 的個數(也就是連通分量的個數),要想所有的連通分支都連起來,需要 components - 1 個邊,所以要求「多餘的邊」的數目必須大於等於 components - 1

一個簡單的例子如下:

0--1         0--1                0--1
| /    =>    |          =>       |  | 
2  3         2  3                2  3
             components = 2
             duplicateEdge = 1

代碼實現

class Solution
{
public:
    vector<int> root;
    int result = 0;
    int makeConnected(int n, vector<vector<int>> &connections)
    {
        int E = connections.size();
        // corner cases
        if (n == 0 || n == 1)
            return 0;
        if (E < n - 1)
            return -1;
        root.resize(n), root.assign(n, -1);
        // merge
        for (auto &v : connections)
        {
            int a = v[0], b = v[1];
            merge(a, b);
        }
        int components = count(root.begin(), root.end(), -1);
        if (counter >= (components - 1))
            return components - 1;
        // should not be here
        return -1;
    }
    int find(int x)
    {
        return root[x] == -1 ? x : (root[x] = find(root[x]));
    }
    // the number of duplicate edges
    int counter = 0;
    void merge(int x, int y)
    {
        x = find(x), y = find(y);
        if (x != y)
            root[y] = x;
        else
        {
            // there is a duplicate edge
            counter++;
        }
    }
};

等式方程的可滿足性

題目[990]:Link.

解題思路

考慮並查集。遍歷所有的包含 == 的等式,顯然,相等的 2 個變量就合併。對於不等式 x!=y ,必須滿足 findroot(x) != findroot(y) 才不會出現邏輯上的錯誤。也就是說,不相等的 2 個變量必然在不同的連通分支當中。

#define getidx(x) ((x) - 'a')
class Solution
{
public:
    vector<int> root;
    bool equationsPossible(vector<string> &equations)
    {
        root.resize('z' - 'a' + 1, -1);
        vector<int> notequal;
        int len = equations.size();
        for (int i = 0; i < len; i++)
        {
            auto &s = equations[i];
            if (s[1] == '!')
            {
                notequal.emplace_back(i);
                continue;
            }
            int a = getidx(s[0]), b = getidx(s[3]);
            merge(a, b);
        }
        for (int i : notequal)
        {
            auto &s = equations[i];
            int a = getidx(s[0]), b = getidx(s[3]);
            if (find(a) == find(b))
                return false;
        }
        return true;
    }
    int find(int x)
    {
        return (root[x] == -1) ? x : (root[x] = find(root[x]));
    }
    void merge(int x, int y)
    {
        x = find(x), y = find(y);
        if (x != y)
            root[y] = x;
    }
};

盡量減少惡意軟件的傳播 II

題目[928]:這題有點難。

解題思路

參考 題解1 和 題解2 。

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

首先,對原來的並查集結構添加一點改進,利用 vector<int> size[N] 記錄某個連通分量中節點的數目,注意當且僅當 x 是該連通分量的根節點時,size[x] 才表示該連通分量的節點數目。這是因為在 merge 中,只對根節點的 size 進行了處理。

vector<int> root;
vector<int> size;
int find(int x)
{
    return root[x] == -1 ? (x) : (root[x] = find(root[x]));
}
void merge(int x, int y)
{
    x = find(x), y = find(y);
    if (x != y)
        root[y] = x, size[x] += size[y];	// pay attention here
}
// get the size of the connected component where node x is in
int getComponentSize(int x)
{
    return size[find(x)];
}

然後,建立一個基本圖,該圖是原圖 graph 去除所有感染節點 initial 的結果,並把這個基本圖轉換為上述改進后的並查集。把這個基本圖中的節點暫且稱為 clean nodes 或者 non-infected nodes .

從直覺上來說,我們應該在 initial 中找到那個標號最小,感染最多 non-infected nodes 的節點,但是這樣是否符合預期?

顯然是不符合的,來看個例子,設 initial nodes = [a,b,c] ,並設 2 個沒有被感染的連通分量為 N1, N2 ,且這 2 個連通分量的點數滿足 size(N1) > size(N2),原圖 graph 結構如下:

a--N1--c

b--N2

根據題目的意思,需要找到的是使得最終感染數目 M(initial) 最小的節點。

如果我們按照上述所謂的「直覺」:“在 initial 中找到那個感染最多 non-infected nodes 的節點”,應該去除的是節點 a ,但是由於 c 的存在,N1 依舊會被感染,這樣 M(initial) = size(N1) + size(N2)。(也就是說,某個連通分量相鄰的感染節點多於 1 個,該連通分量最終是必然被感染的,因為我們只能去除一個感染節點。)

實際上,這種情況下正確答案是去除 b ,因為除 b 后:M(initial) = size(N1) ,該結果才是最小的。

所以,我們要找的是:在 initial 中找到那個感染最多 non-infected nodes 的節點 ans,但這些 non-infected nodes 節點只能被 ans 感染,不能被其他的 initial 節點感染(即只能被感染一次)。

代碼實現

class Solution
{
public:
    vector<int> root;
    vector<int> size;
    int minMalwareSpread(vector<vector<int>> &graph, vector<int> &initial)
    {
        int N = graph.size();
        root.resize(N, -1);
        size.resize(N, 1);

        // use hash table to mark infected nodes
        vector<bool> init(N, false);
        for (int x : initial)
            init[x] = true;
        // change the non-infected graph into disjoint union set
        for (int i = 0; i < N; i++)
        {
            if (init[i])
                continue;
            for (int j = 0; j < i; j++)
            {
                if (init[j])
                    continue;
                if (graph[i][j] == 1)
                    merge(i, j);
            }
        }
        // table[x] = {...}
        // the set {...} means the non-infected components which initial node x will infect
        // counter[x] = k
        // k means that the non-infected component x will be infected by initial nodes for k times
        vector<int> counter(N, 0);
        unordered_map<int, unordered_set<int>> table;
        for (int u : initial)
        {
            unordered_set<int> infected;
            for (int v = 0; v < graph[u].size(); v++)
            {
                if (!init[v] && graph[u][v] == 1)
                    infected.insert(find(v));
            }
            table[u] = infected;
            for (int x : infected)
                counter[x]++;
        }

        // find the node we want
        int ans = N + 1, maxInfected = -1;
        for (int u : initial)
        {
            int sum = 0;
            for (int x : table[u])
                if (counter[x] == 1)	// must be infected only once
                    sum += getComponentSize(x);
            if (sum > maxInfected || (sum == maxInfected && u < ans))
            {
                ans = u;
                maxInfected = sum;
            }
        }
        return ans;
    }

    int find(int x)
    {
        return root[x] == -1 ? (x) : (root[x] = find(root[x]));
    }

    void merge(int x, int y)
    {
        x = find(x), y = find(y);
        if (x != y)
            root[y] = x, size[x] += size[y];
    }

    int getComponentSize(int x)
    {
        return size[find(x)];
    }
};

盡量減少惡意軟件的傳播

題目[924]:做了上面那題之後簡單一點。

解題思路

依然是使用上題中 盡量減少惡意軟件的傳播 II 改進后的並查集結構。

對整個原圖處理,轉換為並查集。然後,模擬處理。即 \(\forall x \in initial\) ,使用集合 \(newSet = initial – \{x\}\) 去模擬感染原圖,得到最終的感染節點數 t,選取感染節點數 t 最小且標號值最小的 \(x\) 作為返回結果。

代碼實現

class Solution
{
public:
    vector<int> root, size;
    int minMalwareSpread(vector<vector<int>> &graph, vector<int> &initial)
    {
        int N = graph.size();
        root.resize(N, -1);
        size.resize(N, 1);

        for (int i = 0; i < N; i++)
            for (int j = 0; j < i; j++)
                if (graph[i][j] == 1)
                    merge(i, j);

        int ans = N + 1, minval = N + 1;
        // assume that discard the node x in the initial set
        // get the injected value
        for (int x : initial)
        {
            int t = getInjected(x, initial);
            if (t < minval || (t == minval && ans > x))
            {
                minval = t;
                ans = x;
            }
        }
        return ans;
    }
    // use set initial - {x} to inject the graph
    int getInjected(int x, vector<int> &initial)
    {
        unordered_set<int> s;
        for (int k : initial)
        {
            if (k == x)
                continue;
            s.insert(find(k));
        }
        int sum = 0;
        for (int t : s)
            sum += size[find(t)];
        return sum;
    }
    int find(int x)
    {
        return root[x] == -1 ? (x) : (root[x] = find(root[x]));
    }
    void merge(int x, int y)
    {
        x = find(x), y = find(y);
        if (x != y)
            root[y] = x, size[x] += size[y];
    }
};

被圍繞的區域

題目[130]:本題難度一般。

解題思路

本題最特殊的節點是邊界上的 O 以及內部與邊界 O 相鄰的節點。

首先,通過邊界的 O 入手,從它開始進行 DFS 搜索,把所有這些的特殊節點標記為 Y 。然後,在 board 中剩下的 O 就是普通的節點(必然是不與邊界 O 相鄰且被 X 所圍繞的),可以把它們全部換成 X 。最後,把所有的 Y 還原為 O

對於搜索方法,既可以是 DFS 也可以是 BFS

代碼實現

class Solution
{
public:
    const vector<vector<int>> direction = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    int row, col;
    void solve(vector<vector<char>> &board)
    {
        row = board.size();
        if (row == 0)
            return;
        col = board[0].size();
        #define func bfs
        for (int j = 0; j < col; j++)
        {
            if (board[0][j] == 'O')
                func(0, j, board);
            if (board[row - 1][j] == 'O')
                func(row - 1, j, board);
        }

        for (int i = 0; i < row; i++)
        {
            if (board[i][0] == 'O')
                func(i, 0, board);
            if (board[i][col - 1] == 'O')
                func(i, col - 1, board);
        }

        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                if (board[i][j] == 'O')
                    board[i][j] = 'X';
                if (board[i][j] == 'Y')
                    board[i][j] = 'O';
            }
        }
    }

    void dfs(int i, int j, vector<vector<char>> &board)
    {
        board[i][j] = 'Y';
        for (auto &v : direction)
        {
            int a = i + v[0], b = j + v[1];
            if (a < 0 || b < 0 || a >= row || b >= col)
                continue;
            if (board[a][b] == 'O')
                dfs(a, b, board);
        }
    }

    void bfs(int i, int j, vector<vector<char>> &board)
    {
        typedef pair<int, int> node;
        queue<node> q;
        q.push(node(i, j));
        board[i][j] = 'Y';
        while (!q.empty())
        {
            node n = q.front();
            q.pop();
            for (auto &v : direction)
            {
                int a = n.first + v[0], b = n.second + v[1];
                if (!(a < 0 || b < 0 || a >= row || b >= col) && board[a][b] == 'O')
                    board[a][b] = 'Y', q.push(node(a, b));
            }
        }
    }
};

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

檢查硬碟完整性竟導致系統資料毀損,外媒發現 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元/分

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

※回頭車貨運收費標準

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

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

※回頭車貨運收費標準

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

這两天在複習大頂堆和小頂堆,比起兩年前的懵懵懂懂,這次理解起來就容易了一些。又翻看了一下自己之前的筆記數據結構與算法之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技術負責輸入(出)井與低速設備之間的調度,邏輯上,進程直接與高速設備交互,減少了進程的等待時間。

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

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

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