目錄
- 堆內(nèi)存與棧內(nèi)存
- 進(jìn)程和線程
- 同步與異步
- 阻塞與非阻塞
- ...
1. 內(nèi)存區(qū)域
- 區(qū)域劃分
1. 堆區(qū):由new分配的內(nèi)存塊,由程序員手動(dòng)分配和釋放,分配和釋放的過(guò)程中可能出現(xiàn)內(nèi)存泄漏,若
程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收
2. 棧區(qū):由操作系統(tǒng)自動(dòng)分配和釋放,無(wú)需程序員手動(dòng)操作
3. 全局區(qū)(靜態(tài)區(qū)):存放全局變量和靜態(tài)變量,程序開始時(shí)分配,結(jié)束時(shí)釋放
4. 常量區(qū):存放常量的區(qū)域,程序開始時(shí)分配,結(jié)束時(shí)釋放
5. 代碼區(qū):存放二進(jìn)制代碼的區(qū)域

內(nèi)存區(qū)域劃分
- 堆區(qū)與棧區(qū)的區(qū)別
1. 管理方式:棧類似數(shù)據(jù)結(jié)構(gòu)中的棧,采用先進(jìn)后出的方式;堆則是鏈表
2. 碎片問(wèn)題:棧區(qū)是一段連續(xù)的內(nèi)存區(qū)域,不存在碎片問(wèn)題;堆區(qū)采用鏈表的方式,內(nèi)存區(qū)域不連續(xù),
頻繁的分配和釋放會(huì)造成大量的碎片
3. 空間大?。?2位系統(tǒng)下,堆內(nèi)存可以達(dá)到4GB;棧最大不超過(guò)8MB,棧空間不足時(shí)提示棧溢出
4. 生長(zhǎng)方向:棧由高地址向低地址分配;堆由低地址向高地址分配
5. 分配方式:棧區(qū)內(nèi)存由系統(tǒng)自動(dòng)分配和釋放;堆區(qū)內(nèi)存由程序員手動(dòng)控制,分配時(shí)需要指明大小,容
易造成內(nèi)存泄露,不過(guò)進(jìn)程結(jié)束時(shí)會(huì)由系統(tǒng)回收
6. 分配效率:棧由系統(tǒng)自動(dòng)分配,速度較快,程序員無(wú)法控制;堆是由new分配的內(nèi)存,一般速度較慢,
使用方便
2. 進(jìn)程和線程
- 關(guān)系
1. 一個(gè)進(jìn)程中至少含有一個(gè)線程(主線程)
1. 存在多線程時(shí),線程間相互共享進(jìn)程用戶地址空間(虛擬地址空間)
3. 進(jìn)程銷毀時(shí),進(jìn)程內(nèi)的所有線程都會(huì)被同時(shí)銷毀
- 區(qū)別
1. 進(jìn)程是資源分配的最小單位,線程是程序執(zhí)行/資源調(diào)度的最小單位
2. 進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程系統(tǒng)都會(huì)為它分配地址空間,并建立數(shù)據(jù)表來(lái)維護(hù)代碼
段、堆棧段和數(shù)據(jù)段;同一進(jìn)程中的多個(gè)線程共享代碼段,數(shù)據(jù)段(全局變量和靜態(tài)變量),擴(kuò)展段(堆
存儲(chǔ))。但是每個(gè)線程擁有自己的棧段,用來(lái)存放所有局部變量和臨時(shí)變量。
3. 線程之間通信更方便,同一進(jìn)程的多個(gè)線程共享全局變量、靜態(tài)變量等數(shù)據(jù);進(jìn)程間的通信需要以通
信的方式(IPC)進(jìn)行
4. 多進(jìn)程程序更健壯,多線程程序只要有線程死掉,整個(gè)進(jìn)程也會(huì)跟著死掉,而進(jìn)程之間則互不影響
- 進(jìn)程間通信方式
1. 管道:半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系(父子關(guān)系)的進(jìn)程間使用
2. 命名管道:半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),允許無(wú)親緣關(guān)系進(jìn)程間的通信
3. 消息隊(duì)列:消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí),是 UNIX 下不同進(jìn)程之間可實(shí)現(xiàn)共
享資源的一種機(jī)制,其中的消息具有特定的格式以及特定的優(yōu)先級(jí),獨(dú)立于發(fā)送與接收進(jìn)程
4. 信號(hào)量:用于實(shí)現(xiàn)進(jìn)程間的互斥與同步的計(jì)數(shù)器,而不是用于存儲(chǔ)進(jìn)程間通信數(shù)據(jù)
5. 共享內(nèi)存:映射一段能被其他進(jìn)程訪問(wèn)的內(nèi)存,共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)
6. 套接字:可以讓不在同一臺(tái)計(jì)算機(jī)但通過(guò)網(wǎng)絡(luò)連接計(jì)算機(jī)上的進(jìn)程進(jìn)行通信
3. 同步與異步
- 同步:在發(fā)出一個(gè)調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回,調(diào)用者主動(dòng)等待這個(gè)調(diào)用的結(jié)果
- 異步:調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒(méi)有返回結(jié)果,被調(diào)用者通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用
4. 阻塞與非阻塞
- 阻塞:調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回
- 非阻塞:在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程