導航:首頁 > 程序命令 > 程序員獨自寫系統

程序員獨自寫系統

發布時間:2022-11-05 08:37:39

⑴ 現在程序員都是自己寫代碼嗎還是直接復制網上的 那還有技術核心可言嗎

代碼的可變通性很高的,寫一個刪除垃圾的代碼是自我發明,我把刪除垃圾的代碼改成刪除系統文件的代碼(改變擴展名);也是自我發明.這個不好講,不管他復制不復制,互聯網的根基就是資源共享,只要能達到造福彼此的目的,就夠了吧我覺得.

⑵ 寫ios系統和安卓系統的人到底有多牛

一句話來形容:牛掰的不像地球上的人物。

我們不談技術,就簡單介紹一下這寫出IOS和安卓的兩位大神。

很多朋友都以為IOS是喬布斯的作品,實際不然,IOS系統實際上更多的是出自斯科特·福斯特之手。但這個人實在太低調了,以至於很多人都沒有聽過他的名字。

喬布斯開創了蘋果公司的巔峰,拉開了智能手機的新時代,而福斯特正是那個時代最亮眼的星。這位大神是斯坦福大學計算機系的高材生,才華橫溢的他多負責幕後工作,曾被認為是喬布斯最理想的接班人。

福斯特爾是蘋果的王牌軟體設計師,他是Mac OS X系統以及Aqua用戶界面的最初設計者之一,iOS廣為人知的多點觸控界面就出自福斯特爾的手筆,備受好評的IOS生態也借鑒了不少他的研究成果。

遺憾的是,福斯特在後期有些膨脹了,再加上漏洞百出的蘋果地圖,讓他得罪了不少領導。喬布斯病逝後,福斯特與上層不和,最終選擇辭職,一代大神從此銷聲匿跡。

這個名字聽上去好像還是聽陌生的,但說起另一個名詞大家肯定不會陌生:安卓。

而安德·魯賓正是寫出安卓系統的人。

安德·魯賓有多厲害呢,焊接,編程,運維,PLC……幾乎就沒有他不會的東西。他23歲的時候就是卡爾蔡司機器人公司的設計師,這份履歷足以讓他吃香喝辣的了。但安德·魯賓並不滿足,1986年他進入了蘋果公司,那時候蘋果還是以技術人員為主。魯賓剛去蘋果公司就搞了個大新聞——他對公司的內部電話系統進行了重新編程,結果很多同事在那天都接到了老闆的電話,聲稱要給他們股票獎勵。

安德·魯賓在蘋果公司主要搞研發,蘋果首款塔式電腦Quadra和 歷史 上第一個軟modem就出自他手。這人是個工作狂,一天24小時吃住全在辦公室,他曾設計出一款智能手機操作系統和UI——Magic Cap,卻因為理念太過超前沒有被大眾認可,1997年,心高氣傲的他離開了蘋果,又去了微軟。

在微軟他也閑不住,很快又闖了大禍,他做一款機器人被黑客入侵,微軟安全小組表示這會泄露公司機密。在微軟沒呆夠三年的他又跑路了,跑去斯坦福大學當教授了。

也是在這段時間,安德·魯賓設計出了安卓的雛形,也遇到了貴人——谷歌創始人拉里·佩奇和謝爾蓋·布林。不久後谷歌收購了安卓,安德•魯賓也成為了谷歌的副總裁。

最後說個題外話,相比美國,我們確實缺少這樣的才華橫溢的技術性人才,也許是大環境的原因,我們至今也做不出像安卓和IOS這樣優秀的操作系統。希望鴻蒙能在做好系統生態後,給大家帶來驚喜吧。

本人10年開發培訓經驗,期間經歷了Java Web,android,H5,大數據,PHP等多個不同的方向的開發,也做過軟體培訓公司的金牌講師,很有興趣回答你這個問題。

以我自身的體會來說吧,程序員也是要分三六九等的。這個世界上絕大多數程序員都是做應用層面開發的,什麼意思呢?就是說都是開發具體的App,網站,應用等的程序員。

但是這些程序員數量這么多,為啥子呢?因為大多數程序員達不到開發操作系統的能力唄,當然包括我自己。

所以這個世界上,也就只有一小部分程序員可以參與到操作系統的研發之中,他們可以說是程序員這個金字塔的塔尖部分。

而iOS或Android,都屬於操作系統,那麼開發這種系統的人,當然是很牛了。就好比Linux系統內核的開發者Linus,他很狂妄的說過:I'm your God! 沒辦法,人家有狂妄的資本。


如果有Java,Android,H5等開發方面的問題,或者是開發求職方面的問題,都可以在評論區留言,或者私信我!

研發一個系統不難,難的是如何讓系統活下來並且佔有較高的市場份額,除了大家熟悉的安卓和iOS之外,三星的Bada和Tizen、微軟的Windows Phone、黑莓的BlackBerry OS、諾基亞的塞班等等,加在一起也有十餘個了,但是最終還是被安卓和iOS分攤了市場。

這些系統並不是因為本身的技術問題死在了沙灘上,更多的原因是因為沒有形成一個生態鏈!

在iOS剛開發出來時,喬布斯甚至打算讓iOS全封閉,拒絕蘋果公司以外的人開發應用程序,iPhone剛推出時,喬布斯表示將拒絕外部開發人員開發iOS應用程序,他認為這些外部開發人員開發iOS應用程序會破壞iPhone的體驗完整性,把iPhone搞得亂七八糟, 讓iPhone感染病毒 帶來安全隱患。

好在後來被說服讓開發者進來,不然現在我們很可能都見不到iOS系統了,因為生態圈的建設是最重要的,光有一個系統沒有應用的支持也是白瞎,而安卓由於做的是開源系統,因此有巨量的開發者進入安卓開發應用,iOS和安卓的生態圈已經形成並且趨於穩定,其它企業要想再研發一個系統就比較困難了。

開發手機系統是個很龐大的工程,不但要有雄厚的資金還要有一支技術過硬的開發團隊,別所自主研發系統,有時候開發一款軟體都要需要一支團隊晝夜不休的工作幾個月甚至更長時間。

android操作系統本身是使用Java開發,使用JNI調用本地的C語言庫,由操作系統實現對底層調用。iOS系統是蘋果自己開發的,核心合適C語言。

一個新操作系統要運轉起來,不只意味著上億行代碼,還需要生態系統運轉起來,獲得用戶和開發者的支持。所以不是新開發操作系統是否容易,而是要養成新生態要花多久的時間。

當然是非常厲害了,看看我們身邊的程序員在干什麼事就知道了(很多根本就不夠資格入行),能夠進行系統開發的那部分人都是頂級高手,能寫出安卓IOS那就更是高手中的高手了。

蘋果IOS系統是由一位叫斯科特·福斯特爾帶隊孵化出的產品,至於這個系統的優點就不多說,毫無疑問目前沒有任何移動端系統能與之媲美。蘋果能一直領先業界,這款系統是有很大功勞的。那麼斯科特是一位厲害的人嗎,答案是肯定的,若光憑運氣沒有智慧是絕不可能把如此優秀的系統做出來的。

與一般的學霸差別並不大,福斯特的經歷算不上傳奇,在斯坦福大學獲得符號系統學位和計算機科學學位後,97年一起和喬布斯加入了蘋果。可能是習慣於幕後吧,大概是十年後大家才知道這位厲害的人物。2008年,提升為高級副總裁;12年,轉任CEO庫克的個人顧問,後因個人原因離職。

在進入蘋果之前,他已經有一家自己軟體公司,IOS就是在原有的基礎上開發出來。IOS雖然是團隊的產物,但若沒有原始的積累是不可能發展如此順利。

安卓最初的創始人是安迪·魯賓,與福斯特的經歷比較相似,最初的獨立闖盪並沒有出眾的作品讓他出名,都是在找到志同道合的合作夥伴才逐漸將自己的才華展現出來。不過魯賓的從業經驗的確非常豐富,可能也正是這些經歷,讓他在後來的職業生涯中能充滿靈感。

1986年,取得尤蒂卡學院計算機學學士學位後,成為了卡爾·蔡司公司擔任機器人工程師,當時的他只有23歲。1989年,他又順利進入蘋果,並且在蘋果還狠狠幹了一票。不久後又溜到了微軟,只不過因為搞個人項目太猖狂,微軟領導看不慣他,沒有讓他的作品發行。

可能安迪也想不到,他還能覓到知音,在斯坦福大學的一次授課中,安迪遇到了他人生中最懂他的兩位貴人,他們就是谷歌創始人拉里·佩奇和謝爾蓋·布林。幾人不謀而合,終於做出了世界上最流行的手機操作系統——安卓。

如很多朋友所言,可能做一款系統難度的確不是最高的,很多國家都能辦到,但是要做到像IOS或者安卓這么受歡迎也不是易事。所以連網路、阿里這樣的巨頭都曾放棄過,原因不言而喻。從現在華為鴻蒙的動作同樣能看出,雖然谷歌苦苦相逼,但鴻蒙上線並不幹脆。

不管是什麼原因,這兩個人能夠做出如此優秀的系統,肯定不是一般軟體開發人員能相比的。不過要論個人魅力,安迪可能要更加全面,動手能力、動腦能力、口才都非常厲害,安卓能在如此短的時間超越IOS規模離不開他的謀略。

當然,人都是有審美疲勞的,雖然現在的系統已經非常好用,但若有新系統出現,比如現在的鴻蒙,個人還是非常願意一試的。

亂世出英雄,時代不同環境不同,如果谷歌總想著通過不良競爭打壓別人,那麼後來者的機會可能也就來了。

有的人總是說生態的問題,那是看新聞看多了,外行人看熱鬧看多了,難道真的以為這世界上只有熱鬧就夠了,沒有真正的技術了?

做一個操作系統是非常難的,全世界那麼多軟硬體巨頭,而操作系統的數量一個手就能數的過來。常說的生態難,那隻是第二步,而第一步是要把操作系統做出來,這絕不是簡單的事。

一個操作系統,是創造一片生態,讓全世界都能在你創造的環境內生存,並且還要用你定的規則來開發各種各樣的軟體。這裡面需要做的事太多太多,需要一個很強大的團隊,用數年的時間才能開發出來。然後就是核心問題了,你做的系統好不好用,功能合不合理?強不強大?萬一系統設計的不行,不好用,沒人用,那你這前期巨大的資金和數年的時間可就全白費了!這就算是世界級巨頭也難以承受的損失。

正因為如此難,所以全世界也沒有幾個做操作系統的,現在華為做的系統,也是在安卓系統的基礎上做的,也就是說,別人做好的系統,拿來改一改,都已經花了幾千億了。而最近宣傳的電腦端的深度Deepin系統,也是在LINUX基礎上做的,也就是說:還是別人的系統,咱們只是拿過來改了改而已!

一、當然挺牛的

iOS的負責人是福斯特,1997年陷入困境的蘋果收購了喬布斯創立的NeXT公司,喬布斯帶領福斯特等人加入蘋果公司,隨後福斯特負責了MAC OS的開發,將NeXTSTEP一些架構和設計理念引入MAC OS中。

後來喬布斯計劃開發智能手機,委派福斯特負責iOS系統的開發,並且從那時候起他就是iOS系統負責人,直到離職,可以說福斯特是這兩大操作系統的奠基者和長期負責人。

而Android操作系統最初由Andy Rubin開發的,他最開始想做的是互聯網手機,所以創辦Android,開始啟動下一代智能手機的開發。最後安卓被谷歌收購,開啟了安卓的輝煌歷程。

二、但更牛的是生態,比系統本身難多了

當然,再加到系統本身,其實研發一個系統,本身並不是那麼的難,國內很多廠商都有研發系統的能力,比如阿里有系統,華為有系統,要研發系統,再發展出一個成熟的生態,才是真的困難。

微軟多厲害,三星也多厲害,但微軟的手機系統,三星的手機系統都可以說是失敗了,這個才是真正的難點。

目前華為推出HMS,其實也是為了生態,而鴻蒙發布了沒有使用在手機上,也是因為生態不行,華為不敢也不能冒這個險,繼續便宜安卓。

當年,紅極一時的諾基亞我想大家不陌生吧。當年素有"機王"的稱號,據相關信息顯示,自1996年起,諾基亞連續14年占據手機市場份額第一。當時搭載的是塞班系統。2011年的時候,諾基亞手機被安卓跟蘋果系統反超。錯失世界第一的霸主地位。盡管諾基亞的暗淡有自己的決策問題,但是蘋果跟安卓系統對他也是致命的打擊。我有時候在想,當初的諾基亞是不是對這兩哥們恨之入骨呢?這點不難看出這兩哥們是蠻牛。

目前國內市場品牌手機商,比如華為,小米,oppo對android進行了修改,完善。有了自己的EMUI MIUI ColorOS系統。國人的手機要麼是安卓機,要麼是蘋果機。其他系統的份額很小。盡管我們有華為的操作系統,但是不夠完美。如果沒有這兩牛人系統,會不會影響到我們手機的使用呢?這點不難看出這兩哥們是蠻牛。

近幾年,移動互聯網一直很火爆,也正因為這兩系統。才使得這么多安卓與iOS開發人員那麼多。試想,如國沒有這個系統了,那會有多少開發人員會出現短暫的失業呢?從這點不難看出這兩哥們是蠻牛。


跟喬幫主相比,可能很多人都不認識他,但是不管怎麼樣。他所做的貢獻是鐵板釘釘的事了。iOS出自他手。這哥們是蘋果軟體業務的靈魂人物,他在軟體設計方面非常有天賦。外界一致認為他是繼喬幫主之後的下一位幫主人選。但是喬幫主走後,他也沒能繼位。反而是選擇了辭職。根據相關資料顯示,也有他自己的原因吧,大神的世界我們不懂啊。

鼎鼎有名的安卓系統就是出自他手,我覺得有技術在手就是拽,他的就業跳槽經歷也是蠻豐富的。1986年獲得計算機學士學位。1989年僅26歲的他加入蘋果公司。到後面加入微軟。又再從微軟離職。人生當中一直沒有遇到伯樂啊。幾經波折,最後遇到了伯樂谷歌,2005年他寫的安卓系統被谷歌收購。他從蘋果的一個開發人員,憑借著Android一直干到了Google移動平台副總裁、Android主管。並於2014年10從谷歌離職。

以上講了這么多足足可以看出這兩系統的優秀。以及市場份額龐大。但值得慶幸的是近幾年面對美國的管制,為了不受制於人。我國 科技 巨頭似乎也明白這個道理,也在涉足操作系統的研發。雖然目前完全取代Android系統是不可能的,但是未來可期啊。

你覺得我國的操作系統會超過安卓系統嗎?歡迎評論區留言討論!

謝謝您的問題。福斯特與魯賓,確實有過人之處。

福斯特在蘋果公司的牛。 福斯特於1992年加入了喬布斯創辦的NeXT公司,1997年蘋果收購NeXT,福斯特跟隨喬布斯加盟蘋果。按照蘋果與喬布斯安排,福斯特先後負責了MAC OS與iOS系統的開發,是兩大重要貢獻的重要貢獻者、奠基者。之後,福斯特負責的軟體業務出現了兩大失誤,包括失敗的蘋果地圖與不完善的Siri服務,福斯特不願意道歉,他很可能是蘋果公司設計、硬體兩方高管意見不合、決策失誤的犧牲品。作為喬布斯繼任人選之一,福斯特不想在蘋果繼續任職,2012年離開蘋果。

福斯特離開蘋果公司的牛。 福斯特離職後,隨著蘋果產品的更加豐富、生態愈加完善,優化iOS系統更不容易,iOS系統升級後問題增加,iOS和MacOS的繼任者顯然不如福斯特深刻理解自己的產品。另一方面,福斯特又開啟了自己另外一段開掛的人生,他聯合製作的百老匯新音樂劇《歡樂窩》成功上映,技術狂人也有浪漫滿屋。

安迪·魯賓(Andy Rubin)的牛與不牛 。魯賓也是技術發燒友,而且能做成產品。他設計了家庭影院系統、電腦程序控制的直升機、無人值守的POS 系統,很多想法在現在都是前瞻性。 2003 年,魯賓基於長期持有的域名 Android.com 開發了 Android,安卓系統關鍵在於其開源,兼容五花八門的智能手機,逐步佔有市場,其間魯賓又投資了谷歌自動駕駛事業。不過,魯賓有提前預判10年的眼光與能力,但是缺乏耐心、出手過急,技術之後的 社會 、文化和 科技 環境並不成熟,市場並不買賬,導致其翻了一些跟頭。
歡迎關注,批評指正。

一座摩天大樓,從來都不是憑空而來。同樣的道理,好操作系統和生態環境,也都非一朝一夕。

這個世界上主流的操作系統內核,為什麼只有Windows NT和Linux Kernel,因為他們的確很優秀啊,但是為什麼基於這兩種內核,最強大的生態系統只有Windows Desktop和Android?不僅僅是因為有個強大的爹,召集了全世界的開發者去幫它完善生態,但同樣,它們自身也要足夠優秀對不對?

所以,不要總是想著,人家的生態環境已經佔領了市場,我們無法與之匹敵。那當年的Android又是如何把諾基亞,黑莓,微軟等一眾強大到可怕的敵人一一淘汰的?

⑶ 程序員的夢想:自己寫一個操作系統有多難

就如同你一個人造一艘航空母艦。windows系統是召集了全世界最優秀的2000多個技術人員寫的,你可以思考一下,你什麼時候能進入全世界優秀的人才中的2000人內,就是第一步。

⑷ 程序員必備知識(操作系統5-文件系統)

本篇與之前的第三篇的內存管理知識點有相似的地方

對於運行的進程來說,內存就像一個紙箱子, 僅僅是一個暫存數據的地方, 而且空間有限。如果我們想要進程結束之後,數據依然能夠保存下來,就不能只保存在內存里,而是應該保存在 外部存儲 中。就像圖書館這種地方,不僅空間大,而且能夠永久保存。

我們最常用的外部存儲就是 硬碟 ,數據是以文件的形式保存在硬碟上的。為了管理這些文件,我們在規劃文件系統的時候,需要考慮到以下幾點。

第一點,文件系統要有嚴格的組織形式,使得文件能夠 以塊為單位進行存儲 。這就像圖書館里,我們會給設置一排排書架,然後再把書架分成一個個小格子,有的項目存放的資料非常多,一個格子放不下,就需要多個格子來進行存放。我們把這個區域稱為存放原始資料的 倉庫區 。

第二點,文件系統中也要有 索引區 ,用來方便查找一個文件分成的多個塊都存放在了什麼位置。這就好比,圖書館的書太多了,為了方便查找,我們需要專門設置一排書架,這裡面會寫清楚整個檔案庫有哪些資料,資料在哪個架子的哪個格子上。這樣找資料的時候就不用跑遍整個檔案庫,在這個書架上找到後,直奔目標書架就可以了。

第三點,如果文件系統中有的文件是熱點文件,近期經常被讀取和寫入,文件系統應該有 緩存層 。這就相當於圖書館裡面的熱門圖書區,這裡面的書都是暢銷書或者是常常被借還的圖書。因為借還的次數比較多,那就沒必要每次有人還了之後,還放回遙遠的貨架,我們可以專門開辟一個區域, 放置這些借還頻次高的圖書。這樣借還的效率就會提高。

第四點,文件應該用 文件夾 的形式組織起來,方便管理和查詢。這就像在圖書館裡面,你可以給這些資料分門別類,比如分成計算機類.文學類.歷史類等等。這樣你也容易管理,項目組借閱的時候只要在某個類別中去找就可以了。

在文件系統中,每個文件都有一個名字,這樣我們訪問一個文件,希望通過它的名字就可以找到。文件名就是一個普通的文本。 當然文件名會經常沖突,不同用戶取相同的名字的情況還是會經常出現的。

要想把很多的文件有序地組織起來,我們就需要把它們成為 目錄 或者文件夾。這樣,一個文件夾里可以包含文件夾,也可以包含文件,這樣就形成了一種 樹形結構 。而我們可以將不同的用戶放在不同的用戶目錄下,就可以一定程度上避免了命名的沖突問題。

第五點,Linux 內核要在自己的內存裡面維護一套數據結構,來保存哪些文件被哪些進程打開和使用 。這就好比,圖書館里會有個圖書管理系統,記錄哪些書被借閱了,被誰借閱了,借閱了多久,什麼時候歸還。

文件系統是操作系統中負責管理持久數據的子系統,說簡單點,就是負責把用戶的文件存到磁碟硬體中,因為即使計算機斷電了,磁碟里的數據並不會丟失,所以可以持久化的保存文件。

文件系統的基本數據單位是 文件 ,它的目的是對磁碟上的文件進行組織管理,那組織的方式不同,就會形成不同的文件系統。

Linux最經典的一句話是:「一切皆文件」,不僅普通的文件和目錄,就連塊設備、管道、socket 等,也都是統一交給文件系統管理的。

Linux文件系統會為每個文件分配兩個數據結構: 索引節點(index node) 和 目錄項(directory entry) ,它們主要用來記錄文件的元信息和目錄層次結構。

●索引節點,也就是inode, 用來記錄文件的元信息,比如inode編號、文件大小訪問許可權、創建時間、修改時間、 數據在磁碟的位置 等等。 索引節點是文件的唯一標識 ,它們之間一一對應, 也同樣都會被 存儲在硬碟 中,所以索引節點同樣佔用磁碟空間。

●目錄項,也就是dentry, 用來記錄文件的名字、索引節點指針以及與其他目錄項的層級關聯關系。多個目錄項關聯起來,就會形成 目錄結構 ,但它與索引節點不同的是,目錄項是由內核維護的一個數據結構,不存放於磁碟,而是 緩存在內存 。

由於索引節點唯一標識一個文件,而目錄項記錄著文件的名,所以目錄項和索引節點的關系是多對一,也就是說,一個文件可以有多個別字。比如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。

注意,目錄也是文件,也是用索引節點唯一標識,和普通文件不同的是,普通文件在磁碟裡面保存的是文件數據,而目錄文件在磁碟裡面保存子目錄或文件。

(PS:目錄項和目錄不是一個東西!你也不是一個東西(^_=), 雖然名字很相近,但目錄是個文件。持久化存儲在磁碟,而目錄項是內核一個數據結構,緩存在內存。

如果查詢目錄頻繁從磁碟讀,效率會很低,所以內核會把已經讀過的目錄用目錄項這個數據結構緩存在內存,下次再次讀到相同的目錄時,只需從內存讀就可以,大大提高了 文件系統的效率。

目錄項這個數據結構不只是表示目錄,也是可以表示文件的。)

磁碟讀寫的最小單位是 扇區 ,扇區的大小隻有512B大小,很明顯,如果每次讀寫都以這么小為單位,那這讀寫的效率會非常低。

所以,文件系統把多個扇區組成了一個 邏輯塊 ,每次讀寫的最小單位就是邏輯塊(數據塊) , Linux中的邏輯塊大小為4KB,也就是一次性讀寫 8個扇區,這將大大提高了磁碟的讀寫的效率。

以上就是索引節點、目錄項以及文件數據的關系,下面這個圖就很好的展示了它們之間的關系:

索引節點是存儲在硬碟上的數據,那麼為了加速文件的訪問,通常會把索引節點載入到內存中。

另外,磁碟進行格式化的時候,會被分成三個存儲區域,分別是超級塊、索引節點區和數據塊區。

●超級塊,用來存儲文件系統的詳細信息,比如塊個數、塊大小、空閑塊等等。

●索引節點區,用來存儲索引節點;

●數據塊區,用來存儲文件或目錄數據;

我們不可能把超級塊和索引節點區全部載入到內存,這樣內存肯定撐不住,所以只有當需要使用的時候,才將其載入進內存,它們載入進內存的時機是不同的.

●超級塊:當文件系統掛載時進入內存;

●索引節點區:當文件被訪問時進入內存;

文件系統的種類眾多,而操作系統希望 對用戶提供一個統一的介面 ,於是在用戶層與文件系統層引入了中間層,這個中間層就稱為 虛擬文件系統(Virtual File System, VFS) 。

VFS定義了一組所有文件系統都支持的數據結構和標准介面,這樣程序員不需要了解文件系統的工作原理,只需要了解VFS提供的統一介面即可。

在Linux文件系統中,用戶空間、系統調用、虛擬機文件系統、緩存、文件系統以及存儲之間的關系如下圖:

Linux支持的文件系統也不少,根據存儲位置的不同,可以把文件系統分為三類:

●磁碟的文件系統,它是直接把數據存儲在磁碟中,比如Ext 2/3/4. XFS 等都是這類文件系統。

●內存的文件系統,這類文件系統的數據不是存儲在硬碟的,而是佔用內存空間,我們經常用到的/proc 和/sys文件系統都屬於這一類,讀寫這類文件,實際上是讀寫內核中相關的數據。

●網路的文件系統,用來訪問其他計算機主機數據的文件系統,比如NFS. SMB等等。

文件系統首先要先掛載到某個目錄才可以正常使用,比如Linux系統在啟動時,會把文件系統掛載到根目錄。

在操作系統的輔助之下,磁碟中的數據在計算機中都會呈現為易讀的形式,並且我們不需要關心數據到底是如何存放在磁碟中,存放在磁碟的哪個地方等等問題,這些全部都是由操作系統完成的。

那麼,文件數據在磁碟中究竟是怎麼樣的呢?我們來一探究竟!

磁碟中的存儲單元會被劃分為一個個的「 塊 」,也被稱為 扇區 ,扇區的大小一般都為512byte.這說明即使一塊數據不足512byte,那麼它也要佔用512byte的磁碟空間。

而幾乎所有的文件系統都會把文件分割成固定大小的塊來存儲,通常一個塊的大小為4K。如果磁碟中的扇區為512byte,而文件系統的塊大小為4K,那麼文件系統的存儲單元就為8個扇區。這也是前面提到的一個問題,文件大小和佔用空間之間有什麼區別?文件大小是文件實際的大小,而佔用空間則是因為即使它的實際大小沒有達到那麼大,但是這部分空間實際也被佔用,其他文件數據無法使用這部分的空間。所以我們 寫入1byte的數據到文本中,但是它佔用的空間也會是4K。

這里要注意在Windows下的NTFS文件系統中,如果一開始文件數據小於 1K,那麼則不會分配磁碟塊來存儲,而是存在一個文件表中。但是一旦文件數據大於1K,那麼不管以後文件的大小,都會分配以4K為單位的磁碟空間來存儲。

與內存管理一樣,為了方便對磁碟的管理,文件的邏輯地址也被分為一個個的文件塊。於是文件的邏輯地址就是(邏輯塊號,塊內地址)。用戶通過邏輯地址來操作文件,操作系統負責完成邏輯地址與物理地址的映射。

不同的文件系統為文件分配磁碟空間會有不同的方式,這些方式各自都有優缺點。

連續分配要求每個文件在磁碟上有一組連續的塊,該分配方式較為簡單。

通過上圖可以看到,文件的邏輯塊號的順序是與物理塊號相同的,這樣就可以實現隨機存取了,只要知道了第一個邏輯塊的物理地址, 那麼就可以快速訪問到其他邏輯塊的物理地址。那麼操作系統如何完成邏輯塊與物理塊之間的映射呢?實際上,文件都是存放在目錄下的,而目錄是一種有結構文件, 所以在文件目錄的記錄中會存放目錄下所有文件的信息,每一個文件或者目錄都是一個記錄。 而這些信息就包括文件的起始塊號和佔有塊號的數量。

那麼操作系統如何完成邏輯塊與物理塊之間的映射呢? (邏輯塊號, 塊內地址) -> (物理塊號, 塊內地址),只需要知道邏輯塊號對應的物理塊號即可,塊內地址不變。

用戶訪問一個文件的內容,操作系統通過文件的標識符找到目錄項FCB, 物理塊號=起始塊號+邏輯塊號。 當然,還需要檢查邏輯塊號是否合法,是否超過長度等。因為可以根據邏輯塊號直接算出物理塊號,所以連續分配支持 順序訪問和隨機訪問 。

因為讀/寫文件是需要移動磁頭的,如果訪問兩個相隔很遠的磁碟塊,移動磁頭的時間就會變長。使用連續分配來作為文件的分配方式,會使文件的磁碟塊相鄰,所以文件的讀/寫速度最快。

連續空間存放的方式雖然讀寫效率高,但是有 磁碟空間碎片 和 文件長度不易擴展 的缺陷。

如下圖,如果文件B被刪除,磁碟上就留下一塊空缺,這時,如果新來的文件小於其中的一個空缺,我們就可以將其放在相應空缺里。但如果該文件的大小大於所

有的空缺,但卻小於空缺大小之和,則雖然磁碟上有足夠的空缺,但該文件還是不能存放。當然了,我們可以通過將現有文件進行挪動來騰出空間以容納新的文件,但是這個在磁碟挪動文件是非常耗時,所以這種方式不太現實。

另外一個缺陷是文件長度擴展不方便,例如上圖中的文件A要想擴大一下,需要更多的磁碟空間,唯一的辦法就只能是挪動的方式,前面也說了,這種方式效率是非常低的。

那麼有沒有更好的方式來解決上面的問題呢?答案當然有,既然連續空間存放的方式不太行,那麼我們就改變存放的方式,使用非連續空間存放方式來解決這些缺陷。

非連續空間存放方式分為 鏈表方式 和 索引方式 。

鏈式分配採取離散分配的方式,可以為文件分配離散的磁碟塊。它有兩種分配方式:顯示鏈接和隱式鏈接。

隱式鏈接是只目錄項中只會記錄文件所佔磁碟塊中的第一塊的地址和最後一塊磁碟塊的地址, 然後通過在每一個磁碟塊中存放一個指向下一 磁碟塊的指針, 從而可以根據指針找到下一塊磁碟塊。如果需要分配新的磁碟塊,則使用最後一塊磁碟塊中的指針指向新的磁碟塊,然後修改新的磁碟塊為最後的磁碟塊。

我們來思考一個問題, 採用隱式鏈接如何將實現邏輯塊號轉換為物理塊號呢?

用戶給出需要訪問的邏輯塊號i,操作系統需要找到所需訪問文件的目錄項FCB.從目錄項中可以知道文件的起始塊號,然後將邏輯塊號0的數據讀入內存,由此知道1號邏輯塊的物理塊號,然後再讀入1號邏輯塊的數據進內存,此次類推,最終可以找到用戶所需訪問的邏輯塊號i。訪問邏輯塊號i,總共需要i+ 1次磁碟1/0操作。

得出結論: 隱式鏈接分配只能順序訪問,不支持隨機訪問,查找效率低 。

我們來思考另外一個問題,採用隱式鏈接是否方便文件拓展?

我們知道目錄項中存有結束塊號的物理地址,所以我們如果要拓展文件,只需要將新分配的磁碟塊掛載到結束塊號的後面即可,修改結束塊號的指針指向新分配的磁碟塊,然後修改目錄項。

得出結論: 隱式鏈接分配很方便文件拓展。所有空閑磁碟塊都可以被利用到,無碎片問題,存儲利用率高。

顯示鏈接是把用於鏈接各個物理塊的指針顯式地存放在一張表中,該表稱為文件分配表(FAT, File Allocation Table)。

由於查找記錄的過程是在內存中進行的,因而不僅顯著地 提高了檢索速度 ,而且 大大減少了訪問磁碟的次數 。但也正是整個表都存放在內存中的關系,它的主要的缺點是 不適 用於大磁碟 。

比如,對於200GB的磁碟和1KB大小的塊,這張表需要有2億項,每一項對應於這2億個磁碟塊中的一個塊,每項如果需要4個位元組,那這張表要佔用800MB內存,很顯然FAT方案對於大磁碟而言不太合適。

一直都在,加油!(*゜Д゜)σ凸←自爆按鈕

鏈表的方式解決了連續分配的磁碟碎片和文件動態打展的問題,但是不能有效支持直接訪問(FAT除外) ,索引的方式可以解決這個問題。

索引的實現是為每個文件創建一個 索引數據塊 ,裡面存放的 是指向文件數據塊的指針列表 ,說白了就像書的目錄一樣,要找哪個章節的內容,看目錄查就可以。

另外, 文件頭需要包含指向索引數據塊的指針 ,這樣就可以通過文件頭知道索引數據塊的位置,再通過索弓|數據塊里的索引信息找到對應的數據塊。

創建文件時,索引塊的所有指針都設為空。當首次寫入第i塊時,先從空閑空間中取得一個塊, 再將其地址寫到索引塊的第i個條目。

索引的方式優點在於:

●文件的創建、增大、縮小很方便;

●不會有碎片的問題;

●支持順序讀寫和隨機讀寫;

由於索引數據也是存放在磁碟塊的,如果文件很小,明明只需一塊就可以存放的下,但還是需要額外分配一塊來存放索引數據,所以缺陷之一就是存儲索引帶來的開銷。

如果文件很大,大到一個索引數據塊放不下索引信息,這時又要如何處理大文件的存放呢?我們可以通過組合的方式,來處理大文件的存儲。

先來看看 鏈表+索引 的組合,這種組合稱為 鏈式索引塊 ,它的實現方式是在 索引數據塊留出一個存放下一個索引數據塊的指針 ,於是當一個索引數據塊的索引信息用完了,就可以通過指針的方式,找到下一個索引數據塊的信息。那這種方式也會出現前面提到的鏈表方式的問題,萬一某個指針損壞了,後面的數據也就會無法讀取了。

還有另外一種組合方式是 索引+索引 的方式,這種組合稱為多級索引塊,實現方式是通過一個索引塊來存放多個索引數據塊,一層套一層索引, 像極了俄羅斯套娃是吧๑乛◡乛๑ 

前面說到的文件的存儲是針對已經被佔用的數據塊組織和管理,接下來的問題是,如果我要保存一個數據塊, 我應該放在硬碟上的哪個位置呢?難道需要將所有的塊掃描一遍,找個空的地方隨便放嗎?

那這種方式效率就太低了,所以針對磁碟的空閑空間也是要引入管理的機制,接下來介紹幾種常見的方法:

●空閑表法

●空閑鏈表法

●點陣圖法

空閑表法

空閑表法就是為所有空閑空間建立一張表,表內容包括空閑區的第一個塊號和該空閑區的塊個數,注意,這個方式是連續分配的。如下圖:

當請求分配磁碟空間時,系統依次掃描空閑表裡的內容,直到找到一個合適的空閑區域為止。當用戶撤銷一個文件時,系統回收文件空間。這時,也需順序掃描空閑表,尋找一個空閑表條目並將釋放空間的第一個物理塊號及它佔用的塊數填到這個條目中。

這種方法僅當有少量的空閑區時才有較好的效果。因為,如果存儲空間中有著大量的小的空閑區,則空閑表變得很大,這樣查詢效率會很低。另外,這種分配技術適用於建立連續文件。

空閑鏈表法

我們也可以使用鏈表的方式來管理空閑空間,每一個空閑塊里有一個指針指向下一個空閑塊,這樣也能很方便的找到空閑塊並管理起來。如下圖:

當創建文件需要一塊或幾塊時,就從鏈頭上依次取下一塊或幾塊。反之,當回收空間時,把這些空閑塊依次接到鏈頭上。

這種技術只要在主存中保存一個指針, 令它指向第一個空閑塊。其特點是簡單,但不能隨機訪問,工作效率低,因為每當在鏈上增加或移動空閑塊時需要做很多1/0操作,同時數據塊的指針消耗了一定的存儲空間。

空閑表法和空閑鏈表法都不適合用於大型文件系統,因為這會使空閑表或空閑鏈表太大。

點陣圖法

點陣圖是利用二進制的一位來表示磁碟中一個盤塊的使用情況,磁碟上所有的盤塊都有一個二進制位與之對應。

當值為0時,表示對應的盤塊空閑,值為1時,表示對應的盤塊已分配。它形式如下:

在Linux文件系統就採用了點陣圖的方式來管理空閑空間,不僅用於數據空閑塊的管理,還用於inode空閑塊的管理,因為inode也是存儲在磁碟的,自然也要有對其管理。

前面提到Linux是用點陣圖的方式管理空閑空間,用戶在創建一個新文件時, Linux 內核會通過inode的點陣圖找到空閑可用的inode,並進行分配。要存儲數據時,會通過塊的點陣圖找到空閑的塊,並分配,但仔細計算一下還是有問題的。

數據塊的點陣圖是放在磁碟塊里的,假設是放在一個塊里,一個塊4K,每位表示一個數據塊,共可以表示4 * 1024 * 8 = 2^15個空閑塊,由於1個數據塊是4K大小,那麼最大可以表示的空間為2^15 * 4 * 1024 = 2^27個byte,也就是128M。

也就是說按照上面的結構,如果採用(一個塊的點陣圖+ 一系列的塊),外加一(個塊的inode的點陣圖+一系列的inode)的結構能表示的最大空間也就128M,

這太少了,現在很多文件都比這個大。

在Linux文件系統,把這個結構稱為一個 塊組 ,那麼有N多的塊組,就能夠表示N大的文件。

最終,整個文件系統格式就是下面這個樣子。

最前面的第一個塊是引導塊,在系統啟動時用於啟用引導,接著後面就是一個一個連續的塊組了,塊組的內容如下:

● 超級塊 ,包含的是文件系統的重要信息,比如inode總個數、塊總個數、每個塊組的inode個數、每個塊組的塊個數等等。

● 塊組描述符 ,包含文件系統中各個塊組的狀態,比如塊組中空閑塊和inode的數目等,每個塊組都包含了文件系統中「所有塊組的組描述符信息」。

● 數據點陣圖和inode點陣圖 ,用於表示對應的數據塊或inode是空閑的,還是被使用中。

● inode 列表 ,包含了塊組中所有的inode, inode 用於保存文件系統中與各個文件和目錄相關的所有元數據。

● 數據塊 ,包含文件的有用數據。

你可以會發現每個塊組里有很多重復的信息,比如 超級塊和塊組描述符表,這兩個都是全局信息,而且非常的重要 ,這么做是有兩個原因:

●如果系統崩潰破壞了超級塊或塊組描述符,有關文件系統結構和內容的所有信息都會丟失。如果有冗餘的副本,該信息是可能恢復的。

●通過使文件和管理數據盡可能接近,減少了磁頭尋道和旋轉,這可以提高文件系統的性能。

不過,Ext2 的後續版本採用了稀疏技術。該做法是,超級塊和塊組描述符表不再存儲到文件系統的每個塊組中,而是只寫入到塊組0、塊組1和其他ID可以表示為3、5、7的冪的塊組中。

在前面,我們知道了一個普通文件是如何存儲的,但還有一個特殊的文件,經常用到的目錄,它是如何保存的呢?

基於Linux 一切切皆文件的設計思想,目錄其實也是個文件,你甚至可以通過vim打開它,它也有inode, inode 裡面也是指向一些塊。

和普通文件不同的是, 普通文件的塊裡面保存的是文件數據,而目錄文件的塊裡面保存的是目錄裡面一項一項的文件信息 。

在目錄文件的塊中,最簡單的保存格式就是 列表 ,就是一項一項地將目錄下的文件信息(如文件名、文件inode.文件類型等)列在表裡。

列表中每一項就代表該目錄下的文件的文件名和對應的inode,通過這個inode,就可以找到真正的文件。

通常,第一項是「則」,表示當前目錄,第二項是.,表示上一級目錄, 接下來就是一項一項的文件名和inode。

如果一個目錄有超級多的文件,我們要想在這個目錄下找文件,按照列表一項一項的找,效率就不高了。

於是,保存目錄的格式改成 哈希表 ,對文件名進行哈希計算,把哈希值保存起來,如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應的塊裡面。

Linux系統的ext文件系統就是採用了哈希表,來保存目錄的內容,這種方法的優點是查找非常迅速,插入和刪除也較簡單,不過需要一些預備措施來避免哈希沖突。

目錄查詢是通過在磁碟上反復搜索完成,需要不斷地進行/0操作,開銷較大。所以,為了減少/0操作,把當前使用的文件目錄緩存在內存,以後要使用該文件時只要在內存中操作,從而降低了磁碟操作次數,提高了文件系統的訪問速度。

感謝您的閱讀,希望您能攝取到知識!加油!沖沖沖!(發現光,追隨光,成為光,散發光!)我是程序員耶耶!有緣再見。<-biubiu-⊂(`ω´∩)

⑸ 微軟的一個程序員編一個計算機操作系統需要多長時間

首先一個操作系統不可能是又一個人進行完成的,微軟的操作系統都是有一個極其龐大的團隊花費數年的時間才可以完成一個新的操作系統。
就那server系統舉例,server2003、server2008、server2012。一般都是時隔幾年才會出一個新的系統。
所以你問題一個程序員編寫一個計算機操作系統基本上是不可能完成的任務。都需要一個團隊多年的努力才能寫出來。

⑹ 程序員如何在電腦上編程的

說到如何在電腦上編程。首先需要知道下面這個問題的答案:「程序到底是什麼?」計算機程序是指令集,它告訴計算機如何執行特殊的任務。VB~VC~VF~C~C#~C++~JAVA~.NET~這些都是編程 ASP~CGI~PHP~JSP這些是WEB編程。。 雖然都是編程,但編出來的程序可是不一樣的。 目標是什麼?開發?創業?還是去公司上班?還是業余愛好? 如果想業余編小程序,推薦VB~VC~容易上手。簡單。也蠻強大。 如果想學好了去企業上班,推薦C++~~~.net~~~JAVA之類的大型項目開發。 如果想做網站,就學ASP~CGI~PHP~JSP,這4個就JSP最最最難,先學ASP。現在是人工智慧時代,國家出台了很多政策鼓勵人工智慧發展,無人超市、無人駕駛、無人銀行、AI人臉識別層出不窮,我覺得以後人工智慧滲透的領域肯定也會越來越多,所以我推薦讓孩子學習python語言,python語言適合做人工智慧的開發。簡單容易上手,學好了以後對學習、出國留學、就業什麼的也會有好處。首先,工程師根據你的需求給你一個合適的方案,這個方案包括硬體搭建、軟體架構。 然後,在你滿意的方案下為你選用設備 最後,程序員按照你的要求編寫軟體 各種設備有自己的命令解釋器,程序員寫出來的軟體是可以按照機器能解讀的編碼編寫的,這些不需要用戶知道,用戶只要知道怎麼使用,怎麼維護就可以了,如果知道的更多,那就可以成了開發者

⑺ 微軟的一個程序員編一個計算機操作系統需要多長時間

這個我認為不可能吧,一個程序員給它一百年都難,因為作為一個操作系統,要開發規范性硬體介面支持、網路標准、外設、移動產品介面,除非回到八十年代的DOS時代還說的過去。一個操作系統的開發要許多程序員共同開發、規范、技術經驗積累等等。我們不說遠的,就安桌和蘋果系統就當初由十三家公司共同制定和部分開發,谷哥公司投入更大。

⑻ 單獨找程序員寫一套簡單的crm後台系統,大概多少錢

根據復雜程度和所需時間定價。
其實你不如買個現成的,稍微加一點定製開發費用讓供應商幫你改,
或者找個熟悉你購買的系統的程序員二次開發,這樣來的快而且代價小。
找程序員從頭開發,就算你找到了靠譜的技術好有責任心的也代價不小。

⑼ 程序員是做什麼的

程序員一般的工作是從事程序開發、程序維護。

程序員是從事程序開發、程序維護的專業人員。一般將程序員分為程序設計人員和程序編碼人員,軟體從業人員分為初級程序員、中級程序員、高級程序員(現為軟體設計師)、系統分析員,系統架構師,測試工程師六大類。具體工作職責如下:

1、負責軟體項目的詳細設計、編碼和內部測試的組織實施,對小型軟體項目兼任系統分析工作,完成分配項目的實施和技術支持工作。

2、協助項目經理和相關人員同客戶進行溝通,保持良好的客戶關系。

3、參與需求調研、項目可行性分析、技術可行性分析和需求分析。

4、熟悉並熟練掌握交付軟體部開發的軟體項目的相關軟體技術。

5、負責向項目經理及時反饋軟體開發中的情況,並根據實際情況提出改進建議。

6、參與軟體開發和維護過程中重大技術問題的解決,參與軟體首次安裝調試、數據割接、用戶培訓和項目推廣。

7、負責相關技術文檔的擬訂。

8、負責對業務領域內的技術發展動態。

(9)程序員獨自寫系統擴展閱讀:

職業要求

一般的程序員都有四年的在專業領域的學習,需要一個在程序領域的學士學位獲得者,不論是數學方面的還是工程方面的都是可以的。

大約有20%的人在這一領域的計算機科學和工程學擁有更高的學位。還有很小一部分程序員是自學的,盡管一些專業性的學校或者綜合大學可以提供,但是也需要一些別的途徑來提供相關的人才。

盡管學歷是比較重要的,但是公司經常把重點放在應聘者的工作經驗上,很多剛從大學畢業的大學生雖然有引人注目的學位證書,但是他們找不到工作是因為他們缺乏經驗。

一個程序員雖然沒有正規的學歷,但是如果一個人擁有程序設計的深厚知識背景或者豐富的工作經驗的話,那麼他的機會要比有學歷的應屆畢業生大得多。

對於職業程序員,另外一個重要的方面就是,程序員需要不斷提升自己的業務技術,他的技術必須一直保持在一個較高的水平,並且要不斷發展,程序員也要尋找貿易的機會,要參加研討會,在周刊上發表文章和接受職業教育,這些使程序員在自己的領域中分級或者不斷並排前進。

閱讀全文

與程序員獨自寫系統相關的資料

熱點內容
文件系統pdf 瀏覽:762
原神安卓區服什麼意思 瀏覽:34
貝殼app怎麼線上發布 瀏覽:157
如何挑選安卓系統機頂盒 瀏覽:53
安卓快充使用有什麼注意事項 瀏覽:909
黑馬程序員的雲計算網課 瀏覽:946
endnotestyle文件夾怎麼導入 瀏覽:460
講解少兒編程演講會開頭 瀏覽:424
思科交換機基礎命令 瀏覽:497
便簽可以設置加密嗎 瀏覽:339
免費漫畫app怎麼看書 瀏覽:27
華為筆記本電腦怎麼安裝抖音app 瀏覽:412
阿里雲國際版試用的伺服器怎麼搞 瀏覽:895
java正則表達式工具 瀏覽:160
oa伺服器怎麼設置ftp 瀏覽:10
安卓如何安裝obb 瀏覽:442
QQ聊天記錄journal文件夾 瀏覽:118
蘋果公司雲伺服器地址 瀏覽:85
加密記事本手機 瀏覽:437
汽車壓縮機變頻閥 瀏覽:95