NTU SP Chapter 14 - Advanced I/O

blocking vs non-blocking

Blocking 是要等完成後才 return
Nonblocking 就是以待在 CPU 為主,能讀多少就讀多少,寫入時雖然一般來說不會去即時寫入,但是在 buffer cache 滿了的情況
nonblocking 就回傳失敗,除了 time slice 以外基本上不會離開 CPU

slow system calls

可能沒有辦法完成的 system call
read networking 就是例子,就是可能會沒有辦法完成的,所以就要用 system call

stdout 要 ‘\n’ 或 fd 的 buffer 滿了才會輸出,stderr 沒有 buffer 所以會直接輸出

terminal 有兩個 mode ,一個是按 enter 才會動,一個是即時反應(raw mode)

I/O multiplexing

busy waiting

non-blocking 對 CPU 是一個浪費,雖然不會出現要等別人的代價,但就是會比較浪費記憶體

multiing tasking

會造成 CPU 負荷很大

I/O multiplexing

在有人 I/O 等待的時候可以解決

select

先在 select 對於 readfds, writefds, exceptfds 個去開個 set 去看每個有沒有需求進行讀寫,就會是 0 or 1
可以用 FD_ZERO 來把指定 set 進行初始化成 0
要用 FD_SET 去指定要 ON 的 number,FD_CLR 去取消

1
select(nfds, readfds, writefds, errofds, timeouts)

要等到有人 ready 才會 retrun,但沒說有人 ready 就立刻 return
nfds 會在 0 ~ nfds-1 檢查 ready 的數量後 reaturn,所以還需要用 FD_ISSET 去確認
其他參數就是 pointer,timeout 可以設成 NULL 就會等到有回應為止
要注意會把 set 改掉,所以要 copy 一份

poll

select 的改良版

1
2
3
4
5
struct pollfd {
int fd; // file descriptor to check, or <0 to ignore
short events; // bit mask: each bit indicates an event of interest on fd (more than select)
short revents; // bit mask: each bit indicates an event that occurred on fd
}

就是只記錄要用的東西, 不會改掉 set

1
poll( fdarray[], nfds, timeout )

結果

只有省在 I/O waiting 的部分

aio_系列

非同步 I/O 的 read write

lock

three way lock

flock 會把整個檔案鎖起來
fcntl 作業要練的
lockf 用 fcntl 來實作的

types of Locks

對於不同 process 才成立,同 process 不成立

shared read lock

可以多個去同時拿,但會把 write lock 鎖起來,不過因為有可能在系統實作時會檢查有沒有人在等 write lock,會使得在那情況使得新的人去拿 readlock 會暫時拿不到

Eclusive write lock

只有一個人可以去拿到

fcntl lock

F_SETLK 如果有辦法就會去拿,沒辦法就 return
F_SETLKW 如果沒辦法就等到拿到為止
F_GETLK 不要再要存取時先去確認,因為不一定同步

Lockptr

1
2
3
4
5
6
7
8
Lockptr
struct flock {
	short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */
	off_t l_start; /* offset in bytes, relative to l_whence */
	short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
	off_t l_len; /* length, in bytes; 0 means lock to EOF ( 會更新到最後 ) */ 
	pid_t l_pid; /* returned with F_GETLK */
}

process 在結束掉會把 lock 都還回去

lock 跟著 file 跟 proess,跟 file desc. 無關
close 檔案會把 lock 拿掉(不管 file desc.,所以像是同一 process dup 複製 file desc. 到其他 new fd,或是 open 兩次,close new fd 也會把 fd 的 lock 放掉

Advisory lock

fcntl 只能管理透過 fcntl 進行 write 的操作,所以不透過 fcntl 就可以寫入,但是也可以透過檔案權限管理來防止不透過 fcntl 的寫入或讀取,可以兼顧安全跟效率。
因為這樣只要鎖住限制只能透過程式來進行存取,來使得透過指定的帳號進行操作,且使用 fcntl

Mandatory lock

不管怎麼樣 read write 都要去去進到 kernel mode 去確認可不可以寫,但是 cost 很高

使用 Hugo 建立
主題 StackJimmy 設計