八股2
除了brk+mmap,malloc還有以下實(shí)現(xiàn)方式:
- sbrk:sbrk是brk的一個(gè)變體,它可以增加或減少進(jìn)程數(shù)據(jù)段的大小。與brk不同的是,sbrk只能增加或減少數(shù)據(jù)段的大小,而不能直接設(shè)置數(shù)據(jù)段的大小。
- mmap:mmap可以將一個(gè)文件或者一個(gè)匿名映射區(qū)映射到進(jìn)程的地址空間中。通過mmap可以在進(jìn)程的地址空間中創(chuàng)建一個(gè)新的映射區(qū),這個(gè)映射區(qū)可以用來存儲(chǔ)malloc分配的內(nèi)存。
- buddy算法:buddy算法是一種內(nèi)存分配算法,它將內(nèi)存分成大小相等的塊,并將這些塊組織成一棵二叉樹。每個(gè)節(jié)點(diǎn)表示一個(gè)內(nèi)存塊,節(jié)點(diǎn)的左右子節(jié)點(diǎn)表示該內(nèi)存塊被分成的兩個(gè)子塊。當(dāng)需要分配內(nèi)存時(shí),buddy算法會(huì)在二叉樹中找到一個(gè)大小合適的內(nèi)存塊,并將其分配出去。
- slab分配器:slab分配器是一種內(nèi)存分配器,它將內(nèi)存分成大小相等的塊,并將這些塊組織成一個(gè)或多個(gè)slab。每個(gè)slab包含若干個(gè)大小相等的內(nèi)存塊,slab分配器會(huì)根據(jù)需要從slab中分配內(nèi)存塊,并在內(nèi)存塊不再使用時(shí)將其返回給slab。
Page cache(頁緩存)是操作系統(tǒng)中的一種內(nèi)存區(qū)域,用于緩存磁盤上的文件數(shù)據(jù)。它與一般的內(nèi)存區(qū)域(如用戶空間和內(nèi)核空間)有以下區(qū)別:
- 功能:Page cache主要用于提高文件系統(tǒng)的性能,通過將磁盤上的文件數(shù)據(jù)緩存在內(nèi)存中,減少對(duì)磁盤的讀寫操作,從而加快文件的訪問速度。而一般的內(nèi)存區(qū)域用于存儲(chǔ)程序的代碼和數(shù)據(jù),以及操作系統(tǒng)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。
- 分配方式:Page cache的內(nèi)存是通過文件系統(tǒng)緩存管理機(jī)制分配的,它是按需分配的,根據(jù)文件的訪問情況動(dòng)態(tài)調(diào)整大小。而一般的內(nèi)存區(qū)域是通過操作系統(tǒng)的內(nèi)存管理機(jī)制分配的,通常在程序啟動(dòng)時(shí)就會(huì)分配一定的內(nèi)存空間。
- 內(nèi)存回收:Page cache的內(nèi)存可以被操作系統(tǒng)回收,以便為其他進(jìn)程或文件提供更多的緩存空間。而一般的內(nèi)存區(qū)域通常只有在進(jìn)程退出或被操作系統(tǒng)終止時(shí)才會(huì)被釋放。
分界的方式通常是通過操作系統(tǒng)的虛擬內(nèi)存管理機(jī)制來實(shí)現(xiàn)的。操作系統(tǒng)將整個(gè)內(nèi)存空間劃分為多個(gè)頁(通常是4KB大?。總€(gè)頁可以被分配給不同的內(nèi)存區(qū)域,包括Page cache和一般的內(nèi)存區(qū)域。操作系統(tǒng)根據(jù)需要將文件數(shù)據(jù)加載到Page cache中,并根據(jù)訪問模式進(jìn)行緩存管理。當(dāng)需要訪問文件數(shù)據(jù)時(shí),操作系統(tǒng)首先檢查Page cache中是否存在相應(yīng)的數(shù)據(jù),如果存在則直接返回,否則從磁盤讀取數(shù)據(jù)并將其緩存到Page cache中。
智能指針是一種用于管理動(dòng)態(tài)內(nèi)存的工具,它可以自動(dòng)化內(nèi)存的分配和釋放,從而減少程序員手動(dòng)管理內(nèi)存的出錯(cuò)可能性。然而,智能指針也有一些缺點(diǎn),包括以下幾點(diǎn):
1.性能開銷:智能指針需要進(jìn)行額外的內(nèi)存管理和引用計(jì)數(shù)操作,這可能會(huì)導(dǎo)致程序的性能下降。相比于原始指針,智能指針需要更多的計(jì)算資源和時(shí)間來完成內(nèi)存管理任務(wù)。
2.循環(huán)引用:如果智能指針被用于管理對(duì)象之間的循環(huán)引用,就可能會(huì)出現(xiàn)內(nèi)存泄漏的問題。當(dāng)兩個(gè)對(duì)象相互引用時(shí),它們的引用計(jì)數(shù)永遠(yuǎn)不會(huì)達(dá)到零,因此它們的內(nèi)存也永遠(yuǎn)不會(huì)被釋放。
3.難以調(diào)試:由于智能指針管理的內(nèi)存是自動(dòng)分配和釋放的,因此在程序運(yùn)行時(shí),很難確定哪個(gè)指針指向哪個(gè)內(nèi)存塊,以及哪個(gè)指針可能導(dǎo)致內(nèi)存泄漏或懸掛指針等問題。這使得調(diào)試非常困難。
4.不適用于某些場(chǎng)景:智能指針通常適用于單線程環(huán)境,但在某些多線程或異步環(huán)境中,智能指針的使用可能會(huì)導(dǎo)致競(jìng)態(tài)條件或死鎖等問題。此外,智能指針也不適用于需要在不同的進(jìn)程之間共享內(nèi)存的場(chǎng)景。
erase"和"remove"都是用于刪除容器中的元素的函數(shù),但它們的實(shí)現(xiàn)方式和使用場(chǎng)景略有不同。"erase"是一個(gè)成員函數(shù),用于從容器中刪除指定位置的元素或指定范圍內(nèi)的元素。例如,可以使用vector的erase函數(shù)刪除指定位置的元素:
std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(vec.begin() + 2); // 刪除第三個(gè)元素,即3
"remove"是一個(gè)算法函數(shù),用于從容器中刪除指定值的元素。例如,可以使用vector的erase和remove函數(shù)刪除所有值為3的元素:
std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end()); // 刪除所有值為3的元素
需要注意的是,remove函數(shù)并不會(huì)真正刪除元素,而是將所有需要?jiǎng)h除的元素移到容器的末尾,并返回一個(gè)指向新的末尾的迭代器。因此,需要再使用erase函數(shù)將這些元素真正刪除。
vector與deque不同,其內(nèi)存占用空間只會(huì)增長(zhǎng),不會(huì)減小。比如你首先分配了10,000個(gè)字節(jié),然后erase掉后面9,999個(gè),則雖然有效元素只有一個(gè),但是內(nèi)存占用仍為10,000個(gè)。所有空間在vector析構(gòu)時(shí)回收。
empty()是用來檢測(cè)容器是否為空的,clear()可以清空所有元素。但是即使clear(),所占用的內(nèi)存空間依然如故。如果你需要空間動(dòng)態(tài)縮小,可以考慮使用deque。如果非要用vector,這里有一個(gè)辦法:
在《effective STL》和其實(shí)很多C++文章中都有指明,用clear()無法保證內(nèi)存回收。但是swap技法可以。具體方法如下所示:vector<int> nums;nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(2);vector<int>().swap(nums); //或者nums.swap(vector<int>());
oracle和mysql的區(qū)別:規(guī)模、費(fèi)用、權(quán)限管理、表空間、自動(dòng)提交(事務(wù))、性能、穩(wěn)定性、擴(kuò)展性、是否支持全外連接、性能診斷工具
SQL加鎖規(guī)則:原則 1:加鎖的基本單位是 next-key lock。next-key lock 是前開后閉區(qū)間。原則 2:查找過程中訪問到的對(duì)象才會(huì)加鎖。優(yōu)化 1:索引上的等值查詢,給唯一索引加鎖的時(shí)候,next-key lock 退化為行鎖。優(yōu)化 2:索引上的等值查詢,向右遍歷時(shí)且最后一個(gè)值不滿足等值條件的時(shí)候,next-key lock 退化為間隙鎖。一個(gè) bug:唯一索引上的范圍查詢會(huì)訪問到不滿足條件的第一個(gè)值為止。加何種鎖與where條件的字段是否有索引以及是否是唯一索引以及where條件的數(shù)據(jù)是否存在有關(guān),比如:
在 update 語句的 where 條件使用了唯一索引,那么 next-key 鎖會(huì)退化成記錄鎖,也就是只會(huì)給一行記錄加鎖。在 update 語句的 where 條件沒有使用索引,就會(huì)對(duì)所有記錄和間隙加上 next-key 鎖(記錄鎖 + 間隙鎖),相當(dāng)于把整個(gè)表鎖住了。
總之,非唯一索引就會(huì)加next key 鎖
redis的線程模型:所以,Redis 的多線程部分只是用來處理網(wǎng)絡(luò)數(shù)據(jù)的讀寫和協(xié)議解析,執(zhí)行命令仍然是單線程順序執(zhí)行,也就不存在并發(fā)安全問題。
TCP長(zhǎng)連接:本來就是HTTP長(zhǎng)連接:就是keepalive,不斷開TCPTCP keepalive:一段時(shí)間沒有消息自動(dòng)關(guān)閉
HTTP/2.0:
- 采用二進(jìn)制協(xié)議,而不是HTTP/1.x的文本協(xié)議,可以更快地傳輸數(shù)據(jù)。
- 支持多路復(fù)用,可以在一個(gè)連接上同時(shí)發(fā)送多個(gè)請(qǐng)求和響應(yīng),減少了延遲和網(wǎng)絡(luò)擁塞。
- 強(qiáng)制使用加密傳輸,提高了安全性。
- 支持服務(wù)器推送,可以在客戶端請(qǐng)求之前主動(dòng)向客戶端發(fā)送資源,提高了性能。
HTTP/3.0:
- 采用QUIC協(xié)議,而不是TCP協(xié)議,可以更快地建立連接和傳輸數(shù)據(jù)。
- 支持多路復(fù)用和服務(wù)器推送,與HTTP/2.0類似。
- 支持0-RTT連接,可以在第一次連接時(shí)就發(fā)送數(shù)據(jù),減少了延遲。
- 支持快速恢復(fù),可以在網(wǎng)絡(luò)中斷后更快地恢復(fù)連接。
虛函數(shù)能內(nèi)聯(lián)嗎:一般人肯定說不能用對(duì)象調(diào)用可以內(nèi)聯(lián),用基類指針調(diào)用不能內(nèi)聯(lián)
HTTP包格式:請(qǐng)求行:請(qǐng)求方法。URI。協(xié)議版本消息頭:
- Accept:指定客戶端能夠接收的內(nèi)容類型。
- Accept-Charset:指定客戶端能夠接收的字符集。
- Accept-Encoding:指定客戶端能夠接收的內(nèi)容編碼。
- Accept-Language:指定客戶端能夠接收的自然語言。
- Authorization:包含客戶端提供的認(rèn)證證書,用于訪問受密碼保護(hù)的資源
- Cache-Control:指定請(qǐng)求/響應(yīng)鏈上所有緩存機(jī)制必須服從的指令。
- Connection:指定與連接相關(guān)的選項(xiàng)。
- Content-Length:指定請(qǐng)求體的長(zhǎng)度。
- Content-Type:指定請(qǐng)求體的MIME類型。
- Cookie:包含客戶端發(fā)送的Cookie
- Host:指定請(qǐng)求的服務(wù)器的域名和端口號(hào)。
- If-Modified-Since:指定只有在指定日期之后修改過的資源才會(huì)被返回。
- If-None-Match:指定只有在指定的ETag與服務(wù)器上對(duì)應(yīng)資源的ETag不同時(shí)才會(huì)被返回。
- Referer:指定當(dāng)前請(qǐng)求的來源頁面。
- User-Agent:指定客戶端使用的瀏覽器類型和版本號(hào)。 消息體
只有vector.deque.array.string 支持隨機(jī)訪問迭代器
線程共享的資源:文件描述符列表、進(jìn)程空間、代碼、全局?jǐn)?shù)據(jù)、堆、共享庫(kù)
數(shù)據(jù)庫(kù)優(yōu)化的方法:數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)的設(shè)計(jì):是否滿足第幾范式查詢語句是否高效、是否進(jìn)行了全表掃描。查詢加索引了嗎、是否是二級(jí)索引、是否是聚簇索引:查看慢查詢表,或者分庫(kù)分表、負(fù)載均衡、主從數(shù)據(jù)庫(kù)同步redis緩存:緩存預(yù)熱。緩存雪崩、緩存擊穿、緩存穿透,server層緩存,引擎層緩存并發(fā)事務(wù)優(yōu)化:更換隔離級(jí)別硬件優(yōu)化:合理配置硬件資源可以提高數(shù)據(jù)庫(kù)性能。增加內(nèi)存、優(yōu)化磁盤讀寫速度、使用高性能的存儲(chǔ)設(shè)備等都可以提高數(shù)據(jù)庫(kù)的響應(yīng)速度。數(shù)據(jù)庫(kù)版本升級(jí):注意考慮兼容性問題
主機(jī)上的最大連接數(shù):1.端口號(hào)限制2.文件描述符限制:系統(tǒng)級(jí)。用戶級(jí)。進(jìn)程級(jí)3.線程并發(fā)過多:使用多路復(fù)用