kill -9 和 kill -10 的區(qū)別
看這篇文章:https://www.cnblogs.com/liuhouhou/p/5400540.html
總結(jié)來說 kill pid 默認(rèn) 是kill -15 pid
kill -10 是用戶自定義的殺死進(jìn)程的signal信號
kill -15 不一定殺死進(jìn)程,可能會被阻塞
select poll epoll
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
當(dāng)有I/O發(fā)生時,并不知道是哪幾個,需要每個都輪詢,適合于解決同時大量IO的情況(尤其網(wǎng)絡(luò)服務(wù)器),poll和select的實現(xiàn)基本上是一致的,只是傳遞參數(shù)有所不同。
工作流程:
1、用戶態(tài)創(chuàng)建了網(wǎng)絡(luò) IO 連接,假設(shè)一個 socket 連接就是一個 fd 文件描述符,那么將 fd 添加到 fd_set 集合中
2、將 fd_set 集合從用戶態(tài) copy 到內(nèi)核態(tài)
3、遍歷這個 fd_set 集合,找出所有已經(jīng)就緒的 fd,執(zhí)行對應(yīng) fd 的相關(guān)操作
4、將內(nèi)核態(tài)的 fd_set 集合拷貝到用戶態(tài)
缺點:包含大量文件描述符的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核的地址空間之間,而且不論這些文件描述符是否就緒,每次都會輪詢所有描述符的狀態(tài),使得他們的開銷隨著文件描述符數(shù)量的增加而線性增大
epoll 看這篇文章
https://www.cnblogs.com/zengzy/p/5118336.html
總結(jié)來說 流程是create->ctl->wait
create 創(chuàng)建紅黑樹和就緒鏈表
ctl 用于用戶告知內(nèi)核自己關(guān)心哪個描述符(fd)的什么事件(event),插入紅黑樹(專門用于管理用戶關(guān)心的事件集合),注冊該fd的回調(diào),可讀寫的時候放入就緒鏈表
wait 監(jiān)控就緒鏈表,設(shè)備的某個資源可能被多個進(jìn)程等待,當(dāng)設(shè)備資源準(zhǔn)備好后,設(shè)備會喚醒阻塞在這個資源上的所有進(jìn)程,當(dāng)前調(diào)用epoll_wait的進(jìn)程未必能搶占這個資源,所以需要再調(diào)用檢查一次資源是否可用,返回用戶態(tài)