C語言——菜鳥和大神的分水嶺:內存、線程、進程

2020-12-26 騰訊網

作為一門古老的程式語言,C語言已經堅挺了好幾十年了,初學者從C語言入門,大學將C語言視為基礎課程。不管別人如何抨擊,如何唱衰,C語言就是屹立不倒;Java、C#、Python、PHP、Perl 等都有替代方案,它們都可以倒下,唯獨C語言不行。

程序是在內存中運行的(我們將在《載入內存,讓程序運行起來》一節中詳細說明),一名合格的程式設計師必須了解內存,學習C語言是了解內存布局的最簡單、最直接、最有效的途徑,C語言簡直是為內存而生的,它比任何一門程式語言都貼近內存。

所謂內存,就是我們常說的內存條,就是下圖這個玩意,相信你肯定見過。

所有的程序都在拼盡全力節省內存,都在不遺餘力提高內存使用效率,計算機的整個發展過程都在圍繞內存打轉,不斷地優化內存布局,以保證可以同時運行多個程序。

不了解內存,就學不會進程和線程,就沒有資格玩中大型項目,沒有資格開發底層組件,沒有資格架構一個系統,命中注定你就是一個菜鳥,成不了什麼氣候。

工作期間我曾專注於網站開發,雖然能夠設計出界面漂亮、體驗良好的網頁,但是對內存洩漏、多線程、共享內存等底層概念一竅不通,感覺和周圍同事的差距很大,這讓我非常鬱悶,不知道如何突破。我曾多次嘗試學習內存和線程,也找了很多資料,但是無論如何都啃不懂,到頭來還是一頭霧水。

離職後我全職運營C語言中文網,於是決定再次系統、深入、全面地學習C語言,並結合C語言去了解一些內存知識,這個時候我才發現,原來C語言就是為內存而生的,C語言的設計和內存的布局是嚴密貼合的,我因為學習C語言而吃透了內存,了解了計算機內存是如何分布和組織的。

C語言無時無刻不在談內存,內存簡直就是如影隨形,你不得不去研究它。

至關重要的一點是,我能夠把內存和具體的編程知識以及程序的運行過程結合起來,真正做到了學以致用,讓概念落地,而不是空談,這才是最難得的。

攻克內存後基本上也能夠理解進程和線程了,進程和線程是圍繞內存打轉的,從一定程度上講,它們的存在也是為了更加高效地利用內存。

從C語言到內存,從內存到進程和線程,環環相扣:不學C語言就吃不透內存,不學內存就吃不透進程和線程。

我感覺自己瞬間升華了,達到了一個新的高度,之前的很多謎團都解開了,和大神交流也沒有障礙了。

「內存 + 進程 + 線程」這幾個最基本的計算機概念是菜鳥和大神的分水嶺,也只有學習C語言才能透徹地理解它們。Java、C#、PHP、Python、JavaScript 程式設計師工作幾年後會遇到瓶頸,有很多人會回來學習C語言,重拾底層概念,讓自己再次突破。

相關焦點

  • 該如何學習學進程和線程 下
    進程可以在任何需要的時候調用管程中的程序,但是它們不能從管程外部訪問數據結構和程序。下面展示了一種抽象的,類似 Pascal 語言展示的簡潔的管程。不能用 C 語言進行描述,因為管程是語言概念而 C 語言並不支持管程。
  • 進程和線程常見的19個問題
    1)硬體壓入堆棧程序計數器等;2)硬體從中斷向量裝入新的程序計數器;3)彙編語言過程保存寄存器值;4)彙編語言過程設置新的堆棧;5)C中斷服務例程運行(典型的讀和緩衝輸入);6)調度程序決定下一個將運行的進程;7)C過程返回到彙編代碼;8)彙編語言過程開始運行新的當前進程。
  • Java 內存模型與線程
    在命令式編程中,線程之間的通信機制有兩種:共享內存和消息傳遞。線程同步是指程序用於控制不同線程之間操作發生相對順序的機制。優點:每個輕量級進程都由一個內核線程支持,因此每個都成為一個獨立的調度單元,即使有一個輕量級進程在系統調用中阻塞,也不會影響整個進程繼續工作缺點:1.由於基於內核線程實現,所以各種線程操作(創建、析構及同步)都需要進行系統調用,代價相對較高,需要在用戶態和內核態
  • JVM內存區域之線程私有區域
    對於java程式設計師來說,在虛擬機自動內存管理機制的幫助下,不再需要為沒一個new操作去配對的free/delete(C、C++語言對對象的刪除和內存釋放操作),不容易出現內存洩漏和內存溢出問題,看起來由虛擬機管理內存一切看起來很美好。
  • C語言編程核心要點
    類型C是強類型語言,有short、long、int、char、float、double等build-in數據類型,類型是貫穿c語言整個課程的核心概念。struct、union、enum屬於c的構造類型,用於自定義類型,擴充類型系統。變量變量用來保存數據,數據是操作的對象,變量的變字意味著它可以在運行時被修改。
  • 深度好文|面試官:進程和線程,我只問這19個問題
    1)硬體壓入堆棧程序計數器等;2)硬體從中斷向量裝入新的程序計數器;3)彙編語言過程保存寄存器值;4)彙編語言過程設置新的堆棧;5)C中斷服務例程運行(典型的讀和緩衝輸入);6)調度程序決定下一個將運行的進程;7)C過程返回到彙編代碼;8)彙編語言過程開始運行新的當前進程。
  • 優雅終止線程?系統內存佔用較高?
    系統內存佔用較高且不準確在線程中運行過程中定義的普通的局部變量,非ThreadLocal型,一般而言會隨著線程結束而得到回收。我所遇到的現象是上面的那個線程無法停止的bug解決之後,線程停下來了,但是在linux上運行top命令相應進程內存佔用還是很高。
  • 進程、線程基礎知識全家桶,30 張圖一套帶走
    ,畢竟物理內存空間是有限的,被阻塞狀態的進程佔用著物理內存就一種浪費物理內存的行為。,因為線程具有相同的地址空間(虛擬內存共享),這意味著同一個進程的線程都具有同一個頁表,那麼在切換的時候不需要切換頁表。
  • 《Dump進程內存鏡像並查找字符串工具》的舉例應用
    本文轉載自【微信公眾號:MicroPest,ID:gh_696c36c5382b】今天是母親節,我祝全天下的母親們幸福安康!!!《Dump進程內存鏡像並查找字符串工具》一文引發了眾多「號」友(公眾號)的留言,給予了很高的評價,我非常開心,感謝你們的熱情支持!應廣大號友的要求,我今天來介紹個「獲取密碼框中密碼」的例子,這也是我開發這個工具軟體的初衷原因;通過這個場景,希望你能舉一反三,開拓出它的更多的用法。
  • Linux的strace命令跟蹤線程死鎖
    strace命令,是Linux提供的跟蹤系統調用的命令,需要sudo或root權限,可以查看進程(線程)使用的系統調用。基本用法:sudo strace -p 進程號如果一個線程遞歸獲取同一個鎖,或者多個線程以不同的順序獲取多個鎖,那麼就會導致至少有一個線程在持有鎖的情況下再次等待在一個鎖上(持有的鎖和等待的鎖可能相同或不同),導致死鎖(deadlock)。
  • 概述:JVM內存模型、線程隔離數據區、線程共享數據區
    在程序運行的這一過程中,jvm會將其管理的內存空間劃分為不同的區域,這些區域各有各的用途,我們將其分為五類:方法區堆虛擬機棧本地方法棧程序計數器其中方法區和堆是線程共享的,隨jvm啟動和停止而創建和銷毀;而虛擬機棧、本地方法棧和程序計數器則是線程私有的,隨線程的創建和結束而創建和銷毀。
  • C語言函數調用過程中的內存變化解析
    打開APP C語言函數調用過程中的內存變化解析 TOMORROW 星辰 發表於 2020-12-11 16:21:13 這個調用不是指C 語言上的函數調用的語法,而是在內存的視角下,函數的調用過程。本文將從C 語言調用實例,內存視角,反彙編代碼來探討C 語言函數的調用過程,也可以說是C 語言函數調用過程圖解。通過這個C 語言函數調用過程圖解,同學們將會知道,C 語言函數在調用時,內存空間是怎樣變化的。 要想理解這一個過程還好涉及到函數棧幀的概念。
  • Python和C語言有什麼區別?
    提及程式語言,大家肯定會想到各種各樣的答案,比如說Java、Python、C。這其中,很多人經常分不清楚Python和C之間的關係,Python語言屬於後起之秀,C語言屬於行業的老大哥,又是Python的底層語言,他們到底有著怎樣的區別呢?我們來看看吧。
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。2、內存管理:Python使用自動垃圾收集器進行內存管理;在C語言中,程式設計師必須自己進行內存管理。3、應用:Python是一種通用程式語言,多範式的,支持面向對象編程、程序編程以及函數編程;C是結構化程式語言,允許使用函數、選擇、迭代,主要用於硬體相關的應用程式。
  • 終於把多線程和多進程徹底講明白了!
    這就涉及到計算機中的兩個重要概念:多進程和多線程了。(PS:萬字長文,講得很詳細,建議先收藏再好好看!)同樣,在編寫爬蟲程序的時候,為了提高爬取效率,我們可能想同時運行多個爬蟲任務。這裡同樣需要涉及多進程和多線程的知識。
  • Python和C語言的語法有什麼不同?
    Python和C語言的語法有什麼不同? python與C的區別如下: 1、語言類型:Python是一種基於解釋器的語言,會逐行讀取代碼,將Python編譯為字節碼,由大型C程序解釋;C是一種編譯語言,完整的原始碼將直接編譯為機器代碼,由CPU直接執行。
  • Ruby 3發布,為何性能能提升3倍|應用程式|內存|線程|調用|編譯器...
    我們終於在聖誕期間迎來了Ruby 3.0.0,它為這種高級通用程式語言提供了更高的性能和其他功能,這不啻給我們最好的聖誕節禮物。現在是時候拆開禮品盒了,看看我們得到的所有Ruby 3功能。    Matz坦承:「在Ruby語言的設計中,我們主要集中在生產力和編程樂趣上。結果,Ruby太慢了。」  可以衡量性能的區域有兩個:內存和CPU。CPU優化  Ruby中已進行了一些增強,以提高速度。Ruby團隊從以前的版本中優化了JIT(Just In Time)編譯器。Ruby MJIT編譯器最早是在Ruby 2.6中引入的。
  • 探討Linux作業系統虛擬內存和物理內存的關係
    更不要說內存) 一個進程能夠申請到這麼恐怖的內存空間?這不但超過了物理內存、超過了物理內存+交換區、還超過了硬碟大小啊。這不科學啊。 但是從 status 讀出來的數據錯不了的。 首先,虛擬內存,顧名思義,虛擬的、並不是事實上存在,在一個進程的虛存空間裡,只存在進程自己和系統內核,而不存在其他進程。
  • JVM中十種內存溢出的解決方法
    元空間(Metaspace)元空間的本質和永久代類似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。2.虛擬機棧(JVM Stacks)每個線程有一個私有的棧,隨著線程的創建而創建。
  • 了解這個,從菜鳥變大神
    了解這個,從菜鳥變大神相思雕塑2018-03-20如果喜歡的話動動手指點擊關注並轉發,謝謝。01-java高級架構師設計-基礎深入J2SE深入講解Java多線程與並發庫高級應用視頻教程下載java反射機制java設計模式視頻數據結構視頻教程Eclipse視頻教程.zipMyEclipse視頻教程.zip02-java高級架構師設計-JavaEE拓展