C++原理

進(jìn)程與線程

進(jìn)程(Process)是計算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動膀跌,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位号俐,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)皆怕。在早期面向進(jìn)程設(shè)計的計算機(jī)結(jié)構(gòu)中娃殖,進(jìn)程是程序的基本執(zhí)行實體值戳;在當(dāng)代面向線程設(shè)計的計算機(jī)結(jié)構(gòu)中,進(jìn)程是線程的容器炉爆。程序是指令堕虹、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實體芬首。

線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位赴捞。它被包含在進(jìn)程之中,是進(jìn)程中的實際運(yùn)作單位郁稍。一條線程指的是進(jìn)程中一個單一順序的控制流螟炫,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)艺晴。在Unix System V及SunOS中也被稱為輕量進(jìn)程(lightweight processes)昼钻,但輕量進(jìn)程更多指內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程封寞。

  • 同一進(jìn)程中的多條線程將共享該進(jìn)程中的全部系統(tǒng)資源然评,如虛擬地址空間,文件描述符信號處理等等狈究。但同一進(jìn)程中的多個線程有各自的調(diào)用棧(call stack)碗淌,自己的寄存器環(huán)境(register context),自己的線程本地存儲(thread-local storage)抖锥。
  • 在早期面向進(jìn)程設(shè)計的計算機(jī)結(jié)構(gòu)中亿眠,進(jìn)程是程序的基本執(zhí)行實體;在當(dāng)代面向線程設(shè)計的計算機(jī)結(jié)構(gòu)中磅废,進(jìn)程是線程的容器纳像。在多線程OS中,線程是能獨立運(yùn)行的基本單位拯勉,因而也是獨立調(diào)度和分派的基本單位竟趾。由于線程很“輕”憔购,故線程的切換非常迅速且開銷小(在同一進(jìn)程中的)岔帽。在多線程OS中玫鸟,進(jìn)程不是一個可執(zhí)行的實體。
  • 線程之間的通信更方便犀勒,同一進(jìn)程下的線程共享全局變量屎飘、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行贾费。不過如何處理好同步與互斥是編寫多線程程序的難點钦购。
  • 在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分配資源的基本單位铸本,而把線程作為獨立運(yùn)行和獨立調(diào)度的基本單位肮雨。

線程與進(jìn)程的區(qū)別可以歸納為以下4點:

1)地址空間和其它資源(如打開文件):進(jìn)程間相互獨立遵堵,同一進(jìn)程的各線程間共享箱玷。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。

2)通信:進(jìn)程間通信IPC陌宿,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助锡足,以保證數(shù)據(jù)的一致性。

3)調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多壳坪。

4)在多線程OS中舶得,進(jìn)程不是一個可執(zhí)行的實體。

  • 進(jìn)程是資源分配的最小單位爽蝴,線程是程序執(zhí)行的最小單位沐批。
  • 進(jìn)程有自己的獨立地址空間,每啟動一個進(jìn)程蝎亚,系統(tǒng)就會為它分配地址空間九孩,建立數(shù)據(jù)表來維護(hù)代碼段、堆棧段和數(shù)據(jù)段发框,這種操作非常昂貴躺彬。而線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間梅惯,因此CPU切換一個線程的花費遠(yuǎn)比進(jìn)程要小很多宪拥,同時創(chuàng)建一個線程的開銷也比進(jìn)程要小很多。
  • 線程之間的通信更方便铣减,同一進(jìn)程下的線程共享全局變量她君、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行葫哗。不過如何處理好同步與互斥是編寫多線程程序的難點犁河。
  • 但是多進(jìn)程程序更健壯鳖枕,多線程程序只要有一個線程死掉,整個進(jìn)程也死掉了桨螺,而一個進(jìn)程死掉并不會對另外一個進(jìn)程造成影響宾符,因為進(jìn)程有自己獨立的地址空間

https://foofish.net/thread-and-process.html

堆和棧

棧 stack:

存放函數(shù)的參數(shù)值、局部變量灭翔,由編譯器自動分配釋放

堆heap:

是由new分配的內(nèi)存塊魏烫,由應(yīng)用程序控制,需要程序員手動利用delete釋放肝箱,如果沒有哄褒,程序結(jié)束后,操作系統(tǒng)自動回收

2煌张、因為堆的分配需要使用頻繁的new/delete呐赡,造成內(nèi)存空間的不連續(xù),會有大量的碎片

3骏融、堆的生長空間向上链嘀,地址越大,棧的生長空間向下档玻,地址越小

malloc/free 和new/delete 區(qū)別

相同點:都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存

不同點:

簡單點說怀泊,malloc只分配指定大小的堆內(nèi)存空間,而new可以根據(jù)對象類型分配合適的堆內(nèi)存空間误趴,當(dāng)然還可以通過重載operator new 自定義內(nèi)存分配策略霹琼,其次還能夠構(gòu)造對象,free釋放對應(yīng)的堆內(nèi)存空間凉当,delete,先執(zhí)行對象的析構(gòu)函數(shù)枣申,在釋放對象所占空間。

malloc與free是C++/C 語言的標(biāo)準(zhǔn)庫函數(shù)看杭,new/delete 是C++的運(yùn)算符忠藤。malloc分配時的大小是人為計算的,返回類型是void*,使用時需要類型轉(zhuǎn)換泊窘,而new在分配時熄驼,編譯器能夠根據(jù)對象類型自動計算出大小,返回類型是指向?qū)ο箢愋偷闹羔樅姹浞庋b了sizeof和類型轉(zhuǎn)換功能瓜贾,實際上new分為兩步,第一步是通過調(diào)用operator new函數(shù)分配一塊合適携悯,原始的祭芦,未命名的內(nèi)存空間,返回類型也是void *,而且operator new可以重載憔鬼,可以自定義內(nèi)存分配策略龟劲,甚至不做內(nèi)存分配胃夏,甚至分配到非內(nèi)存設(shè)備上,而malloc無能為力昌跌,第二步仰禀,調(diào)用構(gòu)造函數(shù)構(gòu)造對象,new將調(diào)用constructor蚕愤,而malloc不能答恶;delete將調(diào)用destructor,而free不能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萍诱,一起剝皮案震驚了整個濱河市悬嗓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕坊,老刑警劉巖包竹,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異籍凝,居然都是意外死亡周瞎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門静浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堰氓,“玉大人挤渐,你說我怎么就攤上這事苹享。” “怎么了浴麻?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵得问,是天一觀的道長。 經(jīng)常有香客問我软免,道長宫纬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任膏萧,我火速辦了婚禮漓骚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榛泛。我一直安慰自己蝌蹂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布曹锨。 她就那樣靜靜地躺著孤个,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沛简。 梳的紋絲不亂的頭發(fā)上齐鲤,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天斥废,我揣著相機(jī)與錄音,去河邊找鬼给郊。 笑死牡肉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淆九。 我是一名探鬼主播荚板,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吩屹!你這毒婦竟也來了跪另?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤煤搜,失蹤者是張志新(化名)和其女友劉穎免绿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擦盾,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡嘲驾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迹卢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽故。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腐碱,靈堂內(nèi)的尸體忽然破棺而出誊垢,到底是詐尸還是另有隱情,我是刑警寧澤症见,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布喂走,位于F島的核電站,受9級特大地震影響谋作,放射性物質(zhì)發(fā)生泄漏芋肠。R本人自食惡果不足惜揪垄,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一扮超、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慌申,春花似錦吭净、人聲如沸睡汹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帮孔。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間文兢,已是汗流浹背晤斩。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留姆坚,地道東北人澳泵。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像兼呵,于是被迫代替她去往敵國和親兔辅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,717評論 0 4
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,703評論 0 73
  • 多線程击喂、特別是NSOperation 和 GCD 的內(nèi)部原理维苔。運(yùn)行時機(jī)制的原理和運(yùn)用場景。SDWebImage的原...
    LZM輪回閱讀 2,008評論 0 12
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用懂昂,...
    LZM輪回閱讀 3,315評論 0 6
  • 過年是個大節(jié)介时,總是讓人盼望。后天就要放假了凌彬,一早就接到玉婷預(yù)約要做臉部微針沸柔。是的,美美過個年是所有熱愛生活的人最自...
    歸元宏灸心秋閱讀 232評論 0 5