日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux中页缓冲和块缓冲之概念

發(fā)布時(shí)間:2024/3/12 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中页缓冲和块缓冲之概念 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


頁(yè)緩沖在《linux內(nèi)核情景分析》一書的第5.6節(jié)文件的寫與讀一章中說(shuō)明的很詳細(xì),這里摘抄下來(lái);

在文件系統(tǒng)層中有三隔主要的數(shù)據(jù)結(jié)構(gòu),file結(jié)構(gòu)、dentry結(jié)構(gòu)和inode結(jié)構(gòu);

file結(jié)構(gòu):代表目標(biāo)文件的一個(gè)上下文,不同進(jìn)程可以在同一文件上建立不同的上下文,而且同一進(jìn)程也可以通過打開一個(gè)文件多次而建立起多個(gè)上下文。因此不能在file結(jié)構(gòu)上設(shè)置緩沖區(qū)隊(duì)列,因?yàn)檫@些file結(jié)構(gòu)體之間都不共享。

dentry結(jié)構(gòu)體:該結(jié)構(gòu)體是文件名結(jié)構(gòu)體,通過軟/硬鏈接可以得到多個(gè)dentry結(jié)構(gòu)體對(duì)應(yīng)一個(gè)文件,dentry結(jié)構(gòu)體和文件也不是一對(duì)一關(guān)系,所以也不能在該結(jié)構(gòu)體上建立緩沖區(qū)隊(duì)列;

inode結(jié)構(gòu)體:很顯然就只有inode結(jié)構(gòu)體了,inode結(jié)構(gòu)體和文件是一對(duì)一的關(guān)系,可以這么說(shuō)inode就是代表文件。在inode結(jié)構(gòu)體上設(shè)置了i_mapping指針,該指針指向了一個(gè)address_space數(shù)據(jù)結(jié)構(gòu),一般來(lái)說(shuō)該數(shù)據(jù)結(jié)構(gòu)就是inode->i_data,緩沖區(qū)隊(duì)列就是在該數(shù)據(jù)結(jié)構(gòu)中;


掛在緩沖區(qū)隊(duì)列中的不是記錄塊而是內(nèi)存頁(yè)面,因此當(dāng)一個(gè)進(jìn)程調(diào)用mmap()函數(shù)將一個(gè)文件映射到它用戶空間時(shí),它只要設(shè)置相應(yīng)的內(nèi)存映射表,就可以很自然的把這些緩存頁(yè)面映射到進(jìn)程的用戶空間。所以才又起名為i_mapping。


這里還要了解下基數(shù)樹概念,先看看圖(圖片來(lái)自《深入linux內(nèi)核架構(gòu)》)


基數(shù)樹不是不是平衡樹,樹本身由兩種不同的數(shù)據(jù)結(jié)構(gòu)組成,樹根節(jié)點(diǎn)和非葉子節(jié)點(diǎn),樹根節(jié)點(diǎn)由簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)表示,其中包含了樹的高度和指向組成樹的第一個(gè)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。節(jié)點(diǎn)本質(zhì)上是數(shù)組,count是該節(jié)點(diǎn)的指針計(jì)數(shù),其他的都是指向下一層節(jié)點(diǎn)的指針。而葉子節(jié)點(diǎn)是指向page的指針;

其中節(jié)點(diǎn)上的數(shù)據(jù)結(jié)構(gòu)還包含了搜索標(biāo)記,比如臟頁(yè)標(biāo)記和回寫標(biāo)記,可以很快的指定哪邊有標(biāo)記的頁(yè);



塊緩沖

塊緩沖在結(jié)構(gòu)上由兩個(gè)部分組成:

1、緩沖頭:包含與緩沖區(qū)狀態(tài)相關(guān)的所有管理數(shù)據(jù),塊號(hào)、長(zhǎng)度,訪問器等,這些緩沖頭不直接存儲(chǔ)在緩沖頭之后,而是由緩沖頭指針指向的物理內(nèi)存獨(dú)立區(qū)域中。

2、有用的數(shù)據(jù)保存在專門分配的頁(yè)中,這些頁(yè)也可以能同事存在頁(yè)緩沖中。


緩沖頭:

/** Historically, a buffer_head was used to map a single block* within a page, and of course as the unit of I/O through the* filesystem and block layers. Nowadays the basic I/O unit* is the bio, and buffer_heads are used for extracting block* mappings (via a get_block_t call), for tracking state within* a page (via a page_mapping) and for wrapping bio submission* for backward compatibility reasons (e.g. submit_bh).*/ struct buffer_head {unsigned long b_state; /* buffer state bitmap (see above) *///緩沖區(qū)狀態(tài)標(biāo)識(shí),看下面struct buffer_head *b_this_page;/* circular list of page's buffers *///指向下一個(gè)緩沖頭struct page *b_page; /* the page this bh is mapped to *///指向擁有該塊緩沖區(qū)的頁(yè)描述符指針sector_t b_blocknr; /* start block number *///塊設(shè)備的邏輯塊號(hào)size_t b_size; /* size of mapping *///塊大小char *b_data; /* pointer to data within the page *///塊在緩沖頁(yè)內(nèi)的位置struct block_device *b_bdev;//指向塊設(shè)備描述符bh_end_io_t *b_end_io; /* I/O completion *///i/o完成回調(diào)函數(shù)void *b_private; /* reserved for b_end_io *///指向i/o完成回調(diào)函數(shù)的數(shù)據(jù)參數(shù)struct list_head b_assoc_buffers; /* associated with another mapping */struct address_space *b_assoc_map; /* mapping this buffer isassociated with */atomic_t b_count; /* users using this buffer_head *///塊使用計(jì)算器 };


緩沖區(qū)頭部的通用標(biāo)志

enum bh_state_bits {BH_Uptodate, /* Contains valid data *///表示緩沖區(qū)包含有效數(shù)據(jù)BH_Dirty, /* Is dirty *///緩沖區(qū)是臟的BH_Lock, /* Is locked *///緩沖區(qū)被鎖住BH_Req, /* Has been submitted for I/O *///初始化緩沖區(qū)而請(qǐng)求數(shù)據(jù)傳輸BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise* IO completion of other buffers in the page*/BH_Mapped, /* Has a disk mapping *///b_bdev和b_blocknr是有效的BH_New, /* Disk mapping was newly created by get_block *///剛分配還沒有訪問過BH_Async_Read, /* Is under end_buffer_async_read I/O *///異步讀該緩沖區(qū)BH_Async_Write, /* Is under end_buffer_async_write I/O *///異步寫該緩沖區(qū)BH_Delay, /* Buffer is not yet allocated on disk *///還沒有在磁盤上分配緩沖區(qū)BH_Boundary, /* Block is followed by a discontiguity *///BH_Write_EIO, /* I/O error on write *///i/o錯(cuò)誤BH_Unwritten, /* Buffer is allocated on disk but not written */BH_Quiet, /* Buffer Error Prinks to be quiet */BH_Meta, /* Buffer contains metadata */BH_Prio, /* Buffer should be submitted with REQ_PRIO */BH_PrivateStart,/* not a state bit, but the first bit available* for private allocation by other entities*/ };

如果一個(gè)頁(yè)作為緩沖區(qū)頁(yè)使用,那么與它的塊緩沖區(qū)相關(guān)的所有緩沖區(qū)首部都被收集在一個(gè)單向循環(huán)鏈表中。緩沖頁(yè)描述符的private字段指向該頁(yè)中第一個(gè)塊的緩沖區(qū)首部;而每個(gè)緩沖區(qū)首部的b_this_page字段中,該字段是指向鏈表中下一個(gè)緩沖區(qū)首部的指針。每個(gè)緩沖區(qū)首部的b_page指向所屬的緩沖區(qū)頁(yè)描述符;



從上圖可以看出一個(gè)緩沖頁(yè)對(duì)應(yīng)了4個(gè)緩沖區(qū),這就統(tǒng)一了page cache和buffer cache了。修改緩沖區(qū)或者緩沖頁(yè),他們之間都會(huì)相互影響。



address_space結(jié)構(gòu)體:

struct address_space {
? ? struct inode ? ? ? ?*host; ? ? ?/* owner: inode, block_device *///指向宿主文件的inode
? ? struct radix_tree_root ?page_tree; ?/* radix tree of all pages *///基數(shù)樹的root
? ? spinlock_t ? ? ?tree_lock; ?/* and lock protecting it *///基數(shù)樹的鎖
? ? unsigned int ? ? ? ?i_mmap_writable;/* count VM_SHARED mappings *///vm_SHARED共享映射頁(yè)計(jì)數(shù)
? ? struct rb_root ? ? ?i_mmap; ? ? /* tree of private and shared mappings *///私有和共享映射的樹
? ? struct list_head ? ?i_mmap_nonlinear;/*list VM_NONLINEAR mappings *///匿名映射的鏈表元素
? ? struct mutex ? ? ? ?i_mmap_mutex; ? /* protect tree, count, list *///包含樹的mutex
? ? /* Protected by tree_lock together with the radix tree */


? ? unsigned long ? ? ? nrpages; ? ?/* number of total pages *///頁(yè)的總數(shù)
? ? pgoff_t ? ? ? ? writeback_index;/* writeback starts here *///回寫的開始
? ? const struct address_space_operations *a_ops; ? /* methods *///函數(shù)指針
? ? unsigned long ? ? ? flags; ? ? ?/* error bits/gfp mask *///錯(cuò)誤碼
? ? struct backing_dev_info *backing_dev_info; /* device readahead, etc *///設(shè)備預(yù)讀
? ? spinlock_t ? ? ?private_lock; ? /* for use by the address_space */
? ? struct list_head ? ?private_list; ? /* ditto */
? ? void ? ? ? ? ? ?*private_data; ?/* ditto */
} __attribute__((aligned(sizeof(long))));


struct inode *host和struct radix_tree_root page_tree關(guān)聯(lián)了文件和內(nèi)存頁(yè)。




346 struct address_space_operations {347 int (*writepage)(struct page *page, struct writeback_control *wbc);//寫操作,從頁(yè)寫到所有者的磁盤映像348 int (*readpage)(struct file *, struct page *);//讀操作,從所有者磁盤映像讀取到頁(yè)349 350 /* Write back some dirty pages from this mapping. */351 int (*writepages)(struct address_space *, struct writeback_control *);//指定數(shù)量的所有者臟頁(yè)回寫磁盤352 353 /* Set a page dirty. Return true if this dirtied it */354 int (*set_page_dirty)(struct page *page);//把所有者的頁(yè)設(shè)置為臟頁(yè)355 356 int (*readpages)(struct file *filp, struct address_space *mapping,357 struct list_head *pages, unsigned nr_pages);//從磁盤中讀取所有者頁(yè)的鏈表358 359 int (*write_begin)(struct file *, struct address_space *mapping,360 loff_t pos, unsigned len, unsigned flags,361 struct page **pagep, void **fsdata);//362 int (*write_end)(struct file *, struct address_space *mapping,363 loff_t pos, unsigned len, unsigned copied,364 struct page *page, void *fsdata);365 366 /* Unfortunately this kludge is needed for FIBMAP. Don't use it */367 sector_t (*bmap)(struct address_space *, sector_t);368 void (*invalidatepage) (struct page *, unsigned long);369 int (*releasepage) (struct page *, gfp_t);370 void (*freepage)(struct page *);371 ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,372 loff_t offset, unsigned long nr_segs);373 int (*get_xip_mem)(struct address_space *, pgoff_t, int,374 void **, unsigned long *);375 /*376 * migrate the contents of a page to the specified target. If sync377 * is false, it must not block.378 */379 int (*migratepage) (struct address_space *,380 struct page *, struct page *, enum migrate_mode);381 int (*launder_page) (struct page *);382 int (*is_partially_uptodate) (struct page *, read_descriptor_t *,383 unsigned long);384 int (*error_remove_page)(struct address_space *, struct page *);385 386 /* swapfile support */387 int (*swap_activate)(struct swap_info_struct *sis, struct file *file,388 sector_t *span);389 void (*swap_deactivate)(struct file *file);390 };391






















總結(jié)

以上是生活随笔為你收集整理的linux中页缓冲和块缓冲之概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲最大的黄色网 | 成av人在线| 国产成年视频 | 老妇高潮潮喷到猛进猛出 | av色先锋 | 国产精品久久久久久久久久直播 | 超碰狠狠干 | 久久国产欧美日韩精品 | 欧美乱码精品一区二区三区 | 三级三级久久三级久久 | 精品人成 | 国产精品国产成人国产三级 | 国产黄色小说 | 在线观看黄av | 成人av网址在线观看 | 国产综合在线观看视频 | 欧美激情视频一区二区三区在线播放 | 成人在线观看h | 肉感丰满的av演员 | 国产一级视频在线播放 | 亚洲三级在线看 | 双性受孕h堵精大肚生子 | 天天爽夜夜爽夜夜爽精品 | 男女做爰猛烈高潮描写 | 人妻熟女一区二区三区 | 日韩欧美第一区 | 天天躁日日躁狠狠躁av麻豆 | 男女免费看| 亚洲一区二区三区免费 | 日韩性猛交ⅹxxx乱大交 | 草民午夜理伦三级 | 风流僵尸艳片a级 | 久久一区二区三区视频 | 午夜影院入口 | 国产美女无遮挡免费 | 亚洲成在线 | 91在线不卡 | 黄色一级小视频 | 国外成人在线视频 | 人人狠狠综合久久亚洲 | 国产美女啪啪 | 狠狠操导航 | 亚日韩在线 | 黄色片网站在线看 | 国产尤物在线 | 黄色一级片 | 色小说香蕉 | 超碰麻豆 | 日韩中文字幕一区二区三区 | 久久久中文 | 久操精品视频 | 三级黄片毛片 | 国产精品入口日韩视频大尺度 | 色久天堂 | 国产精品区二区三区日本 | 欧美在线国产 | www.97色| 日日操夜夜草 | 91资源在线观看 | 日韩爱爱网 | 美女av一区 | 成人免费看片98欧美 | 色播久久| 1769国产精品 | 久久99久久精品 | 久久国产精品无码网站 | 爱福利视频一区二区 | 李丽珍裸体午夜理伦片 | 特大黑人巨交吊性xxxxhd | 美女打屁股网站 | 日韩美女一区 | 国产精品久久久久桃色tv | 国产古装艳史毛片hd | 在线观看三区 | 奇米第四色在线 | 成人午夜av| 日韩伦理一区 | 亚洲系列| 99精品国产免费 | 国产男男gay网站 | 人av在线 | 欧洲精品无码一区二区 | 淫语视频| 日本欧美不卡 | 5a毛片| 免费看片91 | 最近中文字幕在线免费观看 | 国产一级高清 | 国产午夜伦鲁鲁 | 中文字幕永久在线播放 | 特一级黄色 | 亚洲精品乱码久久久久久蜜桃图片 | 动漫精品一区一码二码三码四码 | 欧美在线免费看 | 天天色影 | 第一福利视频 | 美女扒开粉嫩的尿囗给男生桶 | 九九在线精品视频 | 亚洲三区在线 |