【5.linux操做系統】-進程通訊

本文除了介紹linux的進程通訊方法,後面細化了select等IO就緒等條件。
clipboard.pngnode

clipboard.png

1.管道 字節流 順序(不能lseek),單向,相關進程(繼承fd) pipe() fds[2]
空管道讀阻塞,關閉返回0,
寫入不超過PIPE_BUF是原子的,超過可能交叉寫入,滿write阻塞
FIFO 有名稱的管道(在文件系統中),可用於非相關進程之間linux

2.systemV ipc對象 內核持久
共享內存中指針要是偏移量安全

3.posix mq_open(消息隊列) shm_open+mmap(共享內存) 內核持久
mq:描述符和文件相似,進程級別句柄
異步經過直mq_notify 只有一個進程可註冊,只有邊緣觸發,收到後要再次註冊,一次性
posix的共享內存。linux的tmpfs上,內核持久性。無關進程共享,mmap只能用共享文件映射,必須用磁盤。posix能夠不用磁盤。sysV須要一整套新的系統調用和命令。shm_open+mmapdom

4.內存映射mmap
私有文件映射:共享庫等初始化
私有匿名映射:分配新內存,大塊內存,fork。
共享文件映射:減小拷貝,節省一個緩衝區(只有一個內核緩衝區).msync控制文件同步
共享匿名映射:共享RAM頁。相關進程才能通訊
預留 交換空間 OOM異步

mlock 將虛擬內存區域鎖進RAMsocket

5.socket
流/數據報(connect也能提高性能) unix內核/inet/inet6
5.1
Unix socketaddr_un{sa_family_t,sun_path}
socketpair() 至關於雙向管道,對其餘進程不可見。除非有sun_path,不然無名的或者爲NULL的這種抽象namespace的都是相關進程纔可見。
file無name好比netsocket,pipe等,不在filesystem namespace中,只能相關進程訪問,除非fd passing。這種無inode,不然有inode
5.2 inet domain
地址如果數字有大小端區分。用系統調用htons等
readn,writen
shutdown(write有緩衝區,sendfile無,加tcp_cork數據和並)
recv,send
sendfile
sendmsg/recvmsg 能夠實現recv,send等分散聚合功能。經常使用於同一個主機傳遞fd面舒服tcp

IO
select(nfds,readxx) nfds比要檢查的fd大1,read等感興趣位圖和結果位圖,要遍歷
什麼是就緒?IO不阻塞就是就緒,普通文件一直不阻塞,不能用
select和poll都是水平觸發
信號驅動IO IO/文件nofity 邊緣觸發
epoll 可邊緣/水平。
邊緣:注意再也不通知,還要注意防止飢餓。維護一個就緒文件描述符列表,讀到EAGAIN移除,循環讀取處理函數

socket可讀可寫條件:
clipboard.png
UDP 用connect
沒有三路握手過程。相反內核只是檢查是否存在當即可知的錯誤(例如一個顯然不可達的目的地),記錄對端的IP地址和端口號(取自傳遞給connect的套接口地址結構),而後當即返回到調用進程。
對於已鏈接UDP套接口,與缺省的未鏈接套接口相比:1 咱們不再能給輸出操做指定宿IP和端口號,也就是說咱們不使用sendto/recvfrom,而改用write或send/read,recv,2.由已鏈接的UDP套接口引起的異步錯誤,返回給他們所在的進程。相反咱們說過,未鏈接UDP套接口不接收任何異步錯誤給一個UDP套接口。
好處:1)選定了對端,內核只會將幫定對象的對端發來的數據報傳給套接口,所以在必定環境下能夠提高安全性;2)會返回異步錯誤,若是對端沒啓動,默認狀況下發送的包對應的ICMP回射包不會給調用進程,若是用了connect,嘿嘿3)發送兩個包間不要先斷開再鏈接,提高了效率
屢次調用connect擁有一個已鏈接UDP套接口的進程能夠爲下列2個目的之一:a.指定新的IP地址和端口號; b.斷開套接口 .
UDP客戶端在創建了插口後會直接用sendto函數發送數據,還隱含了一個操做,那就是在發送數據以前,UDP會首先爲該插口選擇一個獨立的UDP端口(在1024-5000之間),將該插口置爲已綁定狀態。若是一個UDP客戶端在創建了插口後。首先用bind函數指明瞭本地地址/端口,也是能夠的性能

相關文章
相關標籤/搜索