Kafka實現涉及的一些基礎概念

2022-03-28 06:37:36 字數 2337 閱讀 6510

順序io

每次訪問磁碟的乙個塊時,磁臂就需移動到正確的磁軌上(這段時間為定址時間),然後碟片就需旋轉到正確的扇區上(這叫旋轉時延)。這套動作需要時間。

那下乙個磁碟塊又是如何呢?如果它在磁碟的某個地方,訪問它會有同樣的尋道和旋轉時延,我們就把這種方式的io叫做隨機io;但是如果它剛好就在你剛才訪問的那乙個磁碟塊的後面,磁頭就能立刻遇到,不需等待,這種io就叫順序io

記憶體對映檔案能讓你建立和修改那些因為太大而無法放入記憶體的檔案。

有了記憶體對映檔案,你就可以認為檔案已經全部讀進了記憶體,然後把它當成乙個非常大的陣列來訪問。這種解決辦法能大大簡化修改檔案的**。

虛擬記憶體

零複製(zerocopy)

程序快取區和使用者快取區

緩衝區的出現是為了減少頻繁的系統呼叫,由於系統呼叫需要儲存之前的程序資料和狀態等資訊,而結束呼叫之後回來還需要回覆之前的資訊,為了減少這種耗時耗效能的呼叫於是出現了緩衝區。在linux系統中,每個程序有自己獨立的緩衝區,叫做程序緩衝區,而系統核心也有個緩衝區叫做核心緩衝區。

當程序需要指定的磁碟資料的時候,程序先到核心緩衝區去看看資料是否在核心緩衝區,如果沒有,核心把讀取磁碟中此資料的請求新增到核心的請求佇列,然後掛起此程序,等解決了別的程序的問題之後,磁碟中的資料也讀取到了核心緩衝區,然後複製資料到程序緩衝區,接著喚醒這個被掛起的程序,程序從自己的程序緩衝區中拿到資料,然後繼續工作。

但是一般的作業系統在儲存資料的時候也並不是立即儲存的,這個是磁碟檔案系統設計的問題,有些unix作業系統除外,相對資料安全,但是io不可避免的會降低。作業系統使用read函式把資料從核心緩衝區複製到程序緩衝區,write把資料從程序緩衝區 複製到核心緩衝區中。至於什麼時候讀取和儲存則由核心來決定,核心緩衝區滿則儲存到磁碟,讀取的時候核心緩衝區空則從磁碟讀取到核心緩衝區中,當然,在寫入的時候如果系統突然關閉則會造成核心緩衝區的資料無法儲存到磁碟的事情發生。

從磁碟檔案中讀取並且通過socket寫出的過程,對應的系統呼叫如下:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

a)         程式使用read()系統呼叫,系統由使用者態轉換為核心態,磁碟中的資料由dma(direct memory access)的方式讀取到核心讀緩衝區(kernel buffer)。dma過程中cpu不需要參與資料的讀寫,而是dma處理器直接將硬碟資料通過匯流排傳輸到記憶體中。

b)         系統由核心態轉為使用者態,當程式要讀的資料已經完全存入核心讀緩衝區以後,程式會將資料由核心讀緩衝區,寫入到使用者緩衝區,這個過程需要cpu參與資料的讀寫。

c)         程式使用write()系統呼叫,系統由使用者態切換到核心態,資料從使用者緩衝區寫入到網路緩衝區(socket buffer),這個過程需要cpu參與資料的讀寫。

d)         系統由核心態切換到使用者態,網路緩衝區的資料通過dma的方式傳輸到網絡卡的驅動(儲存緩衝區)中(protocol engine)

tmp_buf = mmap(file, len);

write(socket, tmp_buf, len);

這是使用的系統呼叫方法,這種方式的i/o原理就是將使用者緩衝區(user buffer)的記憶體位址和核心緩衝區(kernel buffer)的記憶體位址做乙個對映,也就是說系統在使用者態可以直接讀取並操作核心空間的資料。

mmap()系統呼叫首先會使用dma的方式將磁碟資料讀取到核心緩衝區,然後通過記憶體對映的方式,使使用者緩衝區和核心讀緩衝區的記憶體位址為同一記憶體位址,也就是說不需要cpu再講資料從核心讀緩衝區複製到使用者緩衝區。

當使用write()系統呼叫的時候,cpu將核心緩衝區(等同於使用者緩衝區)的資料直接寫入到網路傳送緩衝區(socket buffer),然後通過dma的方式將資料傳入到網絡卡驅動程式中準備傳送。

可以看到這種記憶體對映的方式減少了cpu的讀寫次數,但是使用者態到核心態的切換(上下文切換)依舊有四次,同時需要注意在進行這種記憶體對映的時候,有可能會出現併發執行緒操作同一塊記憶體區域而導致的嚴重的資料不一致問題,所以需要進行合理的併發程式設計來解決這些問題。

原文:接下來可以通過以下文章來了解:

Oracle Inventory裡的一些概念

事務處理 transaction 是指物料移入庫存 在庫存內移動以及移出庫存.物料搬運單 move order 是在乙個組織內對物料進行移動的請求.保留 reservation 是 與需求 之間的關聯。保留將在 與需求 之間建立乙個永久的資料關聯,代表指定需求 的乙個可靠的物料分配。現有量 on h...

string涉及的一些轉換

標準庫的string類提供了3個成員函式來從乙個string得到c型別的字元陣列 c str data copy p,n 1.c str 生成乙個const char 指標,指向以空字元終止的陣列。這個陣列的資料是臨時的,當有乙個改變這些資料的成員函式被呼叫後,其中的資料就會失效。因此要麼現用先轉換...

kafka的一些引數

python操作kafka 需求,如果topic不存在,不允許自動建立 每個topic的分割槽個數,更 多的partition會產生更多的segment file num.partitions 2 是否允許自動建立topic 若是false,就需要通過命令建立topic auto.create.to...