教材12章閱讀筆記
知識點歸納
I/O緩沖區:內核中的一系列NBUF緩沖區用作緩沖區緩存。每個緩沖區用一個結構體表示。
typdef struct buf{
struct buf *next_free; //freelist pointer
struct buf *next_dev; //dev_list pointer
int dev,blk; //assigned disk block;
int opcode; //READ|WRITE
int dirty; //buffer data modified
int async; //ASYNC write flag
int valid; //buffer data valid
int busy; //buffer is in use
int wanted; //some process needs this buffer
struct, semaphore lock=l ; //buffer locking semaphore; value=L
struct semaphore iodone=0; //for process to wait for I/O completion;
char buf[BLKSIZE]; //block data area
} BUFFER;
BUFFER buf[NBUF], *freelist; // NBUF buffers and free buffer list
設備表:每個塊設備用一個設備表結構表示。
struct devtab{
u16 dev; // major device number
BUFFER *dev_list; // device buffer list
BUFFER*io_queue // device I/0 queue
}devtab[NDEV];
緩沖區初始化:當系統啟動時,所有I/O緩沖區都在空閑列表中,所有設備列表和T/O隊列均為空。
緩沖區列表:當緩沖區分配給(dev,blk)時,它會被插入設備表的dev_list中。如果緩沖區當前正在使用,則會將其標記為BUSY(繁忙)并從空閑列表中刪除。
PV算法
BUFFER *getb1k(dev,blk):
while(1){
P(free);
//get a free buffer first
if (bp in dev_1ist){
if (bp not BUSY){
remove bp from freelist;
P(bp);
// lock bp but does not wait
return bp;
// bp in cache but BUSY
V(free);
// give up the free buffer
P(bp);
// wait in bp queue
return bp;
// bp not in cache,try to create a bp=(dev,blk)
bp = frist buffer taken out of freelist;
P(bp);
// lock bp,no wait
if(bp dirty){
awzite(bp);
// write bp out ASYNC,no wait
continue;
// continue from (1)
reassign bp to(dev,blk);
// mark bp data invalid,not dir
return bp;
// end of while(1);
brelse(BUFFER *bp),
{
iF (bp queue has waiter)( V(bp); return; }
if(bp dirty && free queue has waiter){ awrite(bp);zeturn;}
enter bp into(tail of) freelist;V(bp);V(free);
}
問題與解決思路
從磁盤到緩沖區的數據讀寫是否也由CPU完成?
如果每次讀緩沖區都沒有對應的數據,是否相當于直接磁盤I/O?
數據的換入換出算法有哪些?
實踐內容
setvbuf()
int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
_IOFBF
全緩沖:對于輸出,數據在緩沖填滿時被一次性寫入。對于輸入,緩沖會在請求輸入且緩沖為空時被填充。
_IOLBF
行緩沖:對于輸出,數據在遇到換行符或者在緩沖填滿時被寫入,具體視情況而定。對于輸入,緩沖會在請求輸入且緩沖為空時被填充,直到遇到下一個換行符。
_IONBF
無緩沖:不使用緩沖。每個 I/O 操作都被即時寫入。buffer 和 size 參數被忽略。
posted on 2022-11-06 17:38 20201321周慧琳 閱讀(22) 評論(0) 收藏 舉報
浙公網安備 33010602011771號