原创 段式、頁式內存管理以及linux採用的方案圖解

這兩年的工作主要是寫一個適用於高速傳感器的文件系統,近期要實現在內核中增加對數據記錄的索引,已經實現了數據和索引混合存儲的方案,但效率低下,所以要實現一個數據和索引分離的機制。索引的方案類似早期minix文件系統中存儲文件的blockid

原创 基於內核模塊實現linux內核中文件的讀寫

在爲linux內核編寫的模塊中,用戶空間的open,read,write,llseek等函數都是不可以使用的。而必須使用其在內核中對應的函數。可以使用filp->open配合struct file裏的read/write來進行對文件的讀寫

原创 linux page cache的同步機制

Page Cache 的同步 廣義上Cache的同步方式有兩種,即Write Through(寫穿)和Write back(寫回). 從名字上就能看出這兩種方式都是從寫操作的不同處理方式引出的概念(純讀的話就不存在Cache一致性了,不是

原创 mmap爲什麼比read/write快(兼論buffercache和pagecache)

 首先說一下文件系統,Linux文件系統的三層結構想必大家多少都瞭解一些,每個進程中都有一個用戶文件描述符表,表項指向一個全局的文件表中的某個表項,文件表表項有一個指向內存inode的指針,每個inode唯一標識一個文件。如果同時有多個進

原创 linux IO 幾種穿透模式解析

在Linux 開發中,有幾個關係到性能的東西,技術人員非常關注:進程,CPU,MEM,網絡IO,磁盤IO。本篇文件打算詳細全面,深入淺出。剖析文件IO的細節。從多個角度探索如何提高IO性能。本文儘量用通俗易懂的視角去闡述。不copy內核代

原创 Linux爲什麼一定要copy_from_user ?

網上很多人提問爲什麼一定要copy_from_user,也有人解答。比如百度一下: 但是這裏面很多的解答沒有回答到點子上,不能真正回答這個問題。我決定寫篇文章正式回答一下這個問題,消除讀者的各種疑慮。 這個問題,我認爲需要從2個層面回答

原创 項目管理--git分支模型

我們公司的軟件產品迭代採用的是scrum敏捷開發流程,代碼使用git進行版本管理。在新人最初的幾次開發任務中,我對於git的使用也僅限於一些基本的命令,包括:add、commit、rebase、cherry-pick、push、check

原创 linux進程中的內存分佈

很多小夥伴在調試C代碼的時候非常痛苦,C語言不像java那樣可以給你指出具體的錯誤地方和錯誤原因,C語音因爲指針的特殊性和C語言版本的兼容性的需要,很難直接定位到錯誤的地方。特別是各種段錯誤、溢出等。要想提高調試效率,瞭解和掌握進程內存佈

原创 mmap是什麼,爲什麼?

這一段搞文件系統的索引的事情,因爲使用的copy from user 和copy to user等方式,進行核內核外數據交換,效率較低。例如,對於使用O_DIRECT方式的寫操作,因爲要加索引,所以剛開始原始數據在iovec中,但是內核態

原创 linux文件讀寫過程--各種層級結構

在《linux內核虛擬文件系統淺析》這篇文章中,我們看到文件是如何被打開、文件的讀寫是如何被觸發的。 對一個已打開的文件fd進行read/write系統調用時,內核中該文件所對應的file結構的f_op->read/f_op->write

原创 linux內核中的address_space 結構解析

在閱讀Linux2.6的內核內存管理這一部分時,我看到page結構中的一個mapping成員,我感到很迷惑,這個成員的屬性太複雜了,我們來看看: struct address_space *mapping;表示該頁所在地址空間描述結構指針

原创 linux文件讀取中的Readahead預讀機制

Readahead預讀機制 由於內存的速度比磁盤速度快很多,如果每一次訪問文件數據都要從磁盤讀取一次數據,就會導致非常嚴重的時延。因此Linux爲了提高性能,通過page cache機制,將多個用戶數據緩存在內存當中,從而避免多次再磁盤讀

原创 numpy中sum函數求和時參數axis=0和axis=1的含義

簡單來說,對於一個m*n的矩陣,如果sum()的參數中沒有指定axis,就是將所有的數值加到一起,得到1*1的標量。如果是axis=0,就是按照列進行加,得到一個1*n的行向量;如果axis=1,表示矩陣每一個行相加,得到一個m*1的列向

原创 爲啥C語言中的void *被稱作萬能指針

在進行c語言開發過程中,有時候會遇到void *這種數據類型。比如: void * memcpy(void * dest, const void * src, size_t n); void * memmove(void * dest,

原创 [IO系統]01 IO子系統

從整個IO調用鏈層面俯視整個鏈路,其穿越“千山萬水”,最終會到勝利的彼岸——“設備層” 接下來,分別說明每個層次的主要功能,後續文章再詳細分析和說明。 1.1   應用 顧名思義,應用就是程序,是用戶態的。 用戶在進行IO讀寫操作編程時