nowcoder-linux
Linux 命令
cd .. rm cp ldd x.c ll man 2/3 man 7 signal touch ls -l x.xxx 查看文件信息 ulimit -a tty ifconfignetstat查看進程: ps aux/ajx (a、u、j、x的含義) 實時顯示進程動態(tài): top 殺死進程: kill 查看管道緩沖大小命令: ulimit a查看系統(tǒng)定義的信號列表: kill –l ipcs ipcrm查看指定進程的 LWP 號: ps –Lf pid查看當(dāng)前 pthread 庫版本: getconf GNU_LIBPTHREAD_VERSION快捷鍵
Ctrl+L 清空終端 Shift+G 調(diào)到文件末尾 I/O vim插入 Esc :wq 保存并退出gdb調(diào)試總體學(xué)習(xí)
第1章 Linux系統(tǒng)編程入門
1.2 GCC(1)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-S3TsaJKO-1640703132781)(https://i.loli.net/2021/10/25/TPBzc4wdDGRfsNu.png)]
- gcc test.cpp -o app ./app gcc test.c ./a.out
1.3 GCC(2)
- 通常:gcc編譯c,g++編譯c++
- .c,一個認為是C,一個是C++
- .cpp,都會認為是C++
- gcc不會定義__cplusplus,g++會,宏標(biāo)志著把代碼按C還是C++語法解釋
- 編譯可以用gcc/g++,鏈接可以用g++或者gcc -lstdc++
- 編譯階段g++自動調(diào)用gcc
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lVL1Twfp-1640703132787)(https://i.loli.net/2021/10/25/86SiVNMKa31erdC.png)]
- -D方便調(diào)試
1.4 靜態(tài)庫
1.5 靜態(tài)庫的使用
- gcc main.c -o app -I ./include/ -l calc -L ./lib/
1.6 動態(tài)庫
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q7Z1NFJS-1640703132790)(https://i.loli.net/2021/10/27/MVR4lkZKwG3yqaX.png)]
1.7 動態(tài)庫加載失敗的原因
1.8 解決動態(tài)庫加載失敗問題
- 修改環(huán)境變量LD_LIBRARY_PATH
- 修改/etc/ld.so.cache
- /lib/,/usr/lib不建議使用
1.9 靜態(tài)庫和動態(tài)庫的對比
1.10-1.12 Makefile
- makefile:自動化編譯
1.13-1.16 GDB調(diào)試
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FqHRjYRw-1640703132796)(https://i.loli.net/2021/10/28/PcElBxMd5wV4UbT.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XynEG9TP-1640703132797)(https://i.loli.net/2021/10/28/nHAeoVQbMhWj5wd.png)]
1.17 標(biāo)準C庫IO函數(shù)和Linux系統(tǒng)IO函數(shù)對比
1.18 虛擬地址空間
1.19 文件描述符
1.20-1.24 open、close、read 、write、lseek、stat、lstat
-
lesson09-lesson12有函數(shù)解讀
-
rwx,讀寫可執(zhí)行
-
0777 八進制,每個7表示該位用戶的權(quán)限,rwx都有就是111(7)
-
stat:返回文件的信息
-
lstat:獲取軟連接文件的信息
1.25 模擬實現(xiàn) ls -l 命令
- lesson12 ls-l.c代碼
1.26 文件屬性操作函數(shù)
- lesson13
1.27 目錄操作函數(shù)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2vZ3GLhi-1640703132801)(https://i.loli.net/2021/10/30/PdAIOj35MzogGLX.png)]
- lesson14
1.28 目錄遍歷函數(shù)
1.29 dup、dup2函數(shù)
1.30 fcntl函數(shù)
- lesson17
第2章 Linux多進程開發(fā)
2.1 進程概述
2.2 進程狀態(tài)轉(zhuǎn)換
- ps、top、kill
- STAT各個參數(shù)含義
- PPID(父進程號)、PGID(進程組號)
2.3 進程創(chuàng)建
- fork()
- fork()的返回值會返回兩次。一次是在父進程中,一次是在子進程中。
- 在父進程中返回創(chuàng)建的子進程的ID,
? 在子進程中返回0
? 如何區(qū)分父進程和子進程:通過fork的返回值。
? 在父進程中返回-1,表示創(chuàng)建子進程失敗,并且設(shè)置errno
2.4 父子進程虛擬地址空間情況
-
實際上,更準確來說,Linux 的 fork() 使用是通過寫時拷貝 (copy- on-write) 實現(xiàn)。
寫時拷貝是一種可以推遲甚至避免拷貝數(shù)據(jù)的技術(shù)。
內(nèi)核此時并不復(fù)制整個進程的地址空間,而是讓父子進程共享同一個地址空間。
只用在需要寫入的時候才會復(fù)制地址空間,從而使各個進行擁有各自的地址空間。
也就是說,資源的復(fù)制是在需要寫入的時候才會進行,在此之前,只有以只讀方式共享。
注意:fork之后父子進程共享文件,
fork產(chǎn)生的子進程與父進程相同的文件文件描述符指向相同的文件表,引用計數(shù)增加,共享文件偏移指針。
2.5 父子進程關(guān)系及GDB多進程調(diào)試
- 父子進程之間的關(guān)系:
- 區(qū)別:
? 1.fork()函數(shù)的返回值不同
? 父進程中: >0 返回的子進程的ID
? 子進程中: =0
? 2.pcb中的一些數(shù)據(jù)
? 當(dāng)前的進程的id pid
? 當(dāng)前的進程的父進程的id ppid
? 信號集
- 共同點:
? 某些狀態(tài)下:子進程剛被創(chuàng)建出來,還沒有執(zhí)行任何的寫數(shù)據(jù)的操作
? - 用戶區(qū)的數(shù)據(jù)
? - 文件描述符表
- GDB多進程調(diào)試
2.6 exec函數(shù)族
- fork創(chuàng)建子進程后執(zhí)行的是和父進程相同的程序(但有可能執(zhí)行不同的代碼分支),子進程往往要調(diào)用一種exec函數(shù)以執(zhí)行另一個程序。
- 當(dāng)進程調(diào)用一種exec函數(shù)時,該進程的用戶空間代碼和數(shù)據(jù)完全被新程序替換,從新程序的啟動例程開始執(zhí)行。調(diào)用exec并不創(chuàng)建新進程,所以調(diào)用exec前后該進程的id并未改變。
2.7 進程退出、孤兒進程、僵尸進程
- 進程退出:exit()、_exit()
- 孤兒進程:
- 父進程運行結(jié)束,但子進程還在運行(未運行結(jié)束)
- 每當(dāng)出現(xiàn)一個孤兒進程的時候,內(nèi)核就把孤兒進程的父進程設(shè)置為 init ,而 init
進程會循環(huán)地 wait() 它的已經(jīng)退出的子進程。這樣,當(dāng)一個孤兒進程凄涼地結(jié)束
了其生命周期的時候,init 進程就會代表黨和政府出面處理它的一切善后工作。 - 因此孤兒進程并不會有什么危害。
- 僵尸進程:
- 進程終止時,父進程尚未回收,子進程殘留資源(PCB)存放于內(nèi)核中,變成僵尸(Zombie)進程
- 僵尸進程不能被 kill -9 殺死
- 如果父進程不調(diào)用 wait() 或 waitpid() 的話,那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統(tǒng)所能使用的進程號是有限的,如果大量的產(chǎn)生僵尸進程,將因為沒有可用的進程號而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進程,此即為僵尸進程的危害,應(yīng)當(dāng)避免
2.8-2.9 wait/waitpid 函數(shù)
- 在每個進程退出的時候,內(nèi)核釋放該進程所有的資源、包括打開的文件、占用的內(nèi)存等。但是仍然為其保留一定的信息,這些信息主要主要指進程控制塊PCB的信息
(包括進程號、退出狀態(tài)、運行時間等) - 父進程可以通過調(diào)用wait或waitpid得到它的退出狀態(tài)同時徹底清除掉這個進程
- wait() 和 waitpid() 函數(shù)的功能一樣,區(qū)別在于,wait() 函數(shù)會阻塞,waitpid() 可以設(shè)置不阻塞,waitpid() 還可以指定等待哪個子進程結(jié)束
- 注意:一次wait或waitpid調(diào)用只能清理一個子進程,清理多個子進程應(yīng)使用循環(huán)
2.10 進程間通信簡介
- Inter Processes Communication
- 同步:看醫(yī)生一個一個進去
- 異步:看醫(yī)生一起進去
2.11 匿名管道概述
-
管道指匿名管道
- ls | wc -l
-
管道的特點(ppt)
-
管道是半雙工的:數(shù)據(jù)傳輸指數(shù)據(jù)可以在一個信號載體的兩個方向上傳輸,但是不能同時傳輸
-
匿名管道只能在具有公共祖先的進程(父進程與子進程,或者兩個兄弟進程,具有親緣關(guān)系)之間使用
-
管道數(shù)據(jù)結(jié)構(gòu)是循環(huán)隊列
2.12 父子進程通過匿名管道通信
-
創(chuàng)建匿名管道:
int pipe(int pipefd[2]);
2.14 管道的讀寫特點和管道設(shè)置為非阻塞
-
讀管道:
管道中有數(shù)據(jù),read返回實際讀到的字節(jié)數(shù)。
管道中無數(shù)據(jù):
寫端被全部關(guān)閉,read返回0(相當(dāng)于讀到文件的末尾)
寫端沒有完全關(guān)閉,read阻塞等待 -
寫管道:
管道讀端全部被關(guān)閉,進程異常終止(進程收到SIGPIPE信號)
管道讀端沒有全部關(guān)閉:
管道已滿,write阻塞
管道沒有滿,write將數(shù)據(jù)寫入,并返回實際寫入的字節(jié)數(shù)
2.15 有名管道介紹及使用
-
FIFO、有名管道、命名管道
-
FIFO 在文件系統(tǒng)中作為一個特殊文件存在,但 FIFO 中的內(nèi)容卻存放在內(nèi)存中
-
當(dāng)使用 FIFO 的進程退出后,FIFO 文件將繼續(xù)保存在文件系統(tǒng)中以便以后使用
- mkfifo xxx int mkfifo(const char *pathname, mode_t mode);
-
有名管道的注意事項:
? 1.一個為只讀而打開一個管道的進程會阻塞,直到另外一個進程為只寫打開管道
? 2.一個為只寫而打開一個管道的進程會阻塞,直到另外一個進程為只讀打開管道
? 讀管道:
? 管道中有數(shù)據(jù),read返回實際讀到的字節(jié)數(shù)
? 管道中無數(shù)據(jù):
? 管道寫端被全部關(guān)閉,read返回0,(相當(dāng)于讀到文件末尾)
? 寫端沒有全部被關(guān)閉,read阻塞等待
?
? 寫管道:
? 管道讀端被全部關(guān)閉,進行異常終止(收到一個SIGPIPE信號)(讀端都關(guān)閉了,就說明沒有人去讀數(shù)據(jù),那就不能往管道里寫數(shù)據(jù),寫了也沒啥用。當(dāng)初設(shè)計的時候就是這樣設(shè)計的。)
? 管道讀端沒有全部關(guān)閉:
? 管道已經(jīng)滿了,write會阻塞
? 管道沒有滿,write將數(shù)據(jù)寫入,并返回實際寫入的字節(jié)數(shù)。
2.16 有名管道實現(xiàn)簡單版聊天功能
- lesson24
2.17-2.18 內(nèi)存映射
-
將磁盤文件的數(shù)據(jù)映射到內(nèi)存,用戶通過修改內(nèi)存就能修改磁盤文件
-
lesson25
-
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
-
匿名映射:不需要文件實體進程一個內(nèi)存映射,與上面fd參數(shù)有關(guān)
2.19 信號概述
- 引發(fā)內(nèi)核為進程產(chǎn)生信號的各類事件:輸入Ctrl+C、硬件發(fā)生異常、系統(tǒng)狀態(tài)變化、運行 kill 命令或調(diào)用 kill 函數(shù)
- 信號特點
- 三種狀態(tài):產(chǎn)生、未決、遞達
- 各種信號
2.20-2.21 kill、raise、abort、alarm、setitimer函數(shù)
-
lesson26
-
kill:
int kill(pid_t pid, int sig); 功能:給任何的進程或者進程組pid, 發(fā)送任何的信號 sig -
raise
int raise(int sig); 功能:給當(dāng)前進程發(fā)送信號 -
abort
void abort(void); 功能: 發(fā)送SIGABRT信號給當(dāng)前的進程,殺死當(dāng)前進程 -
alarm
unsigned int alarm(unsigned int seconds); 功能:設(shè)置定時器(鬧鐘)。函數(shù)調(diào)用,開始倒計時,當(dāng)?shù)褂嫊r為0的時候,函數(shù)會給當(dāng)前的進程發(fā)送一個信號:SIGALARM SIGALARM :默認終止當(dāng)前的進程,每一個進程都有且只有唯一的一個定時器。 -
setitimer
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value); - 功能:設(shè)置定時器(鬧鐘)??梢蕴娲鷄larm函數(shù)。精度微妙us,可以實現(xiàn)周期性定時
2.23 signal 信號捕捉函數(shù)
- sighandler_t signal(int signum, sighandler_t handler); 功能:設(shè)置某個信號的捕捉行為
- int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 檢查或者改變信號的處理。信號捕捉
2.24 信號集及相關(guān)函數(shù)
- 多個信號可使用一個稱之為信號集的數(shù)據(jù)結(jié)構(gòu)來表示,數(shù)據(jù)類型為 sigset_t
- 兩個非常重要的信號集: “阻塞信號集” ,“未決信號集”;這兩個信號集都是內(nèi)核使用位圖機制來實現(xiàn)的。但操作系統(tǒng)不允許我們直接對這兩個信號集進行位操作。而需自定義另外一個集合,借助信號集操作函數(shù)
來對 PCB 中的這兩個信號集進行修改。 - 信號的 “未決” 是一種狀態(tài),指的是從信號的產(chǎn)生到信號被處理前的這一段時間。
- 信號的 “阻塞” 是一個開關(guān)動作,指的是阻止信號被處理,但不是阻止信號產(chǎn)生。
- 相關(guān)函數(shù)…前面是操作自己的信號集,后兩個是系統(tǒng)調(diào)用
2.27 SIGCHLD 信號
- SIGCHLD信號產(chǎn)生的條件
- 子進程終止時
- 子進程接收到 SIGSTOP 信號停止時
- 子進程處在停止態(tài),接受到SIGCONT后喚醒時
- 以上三種條件都會給父進程發(fā)送 SIGCHLD 信號,父進程默認會忽略該信號
- 可以解決僵尸進程問題,默認忽略但是可以不忽略,子進程終止時候給父進程發(fā)送SIGCHLD
2.28-2.29 共享內(nèi)存
- 共享內(nèi)存允許兩個或者多個進程共享物理內(nèi)存的同一塊區(qū)域
- 速度更快,無需內(nèi)核介入
- 使用步驟:
-
共享內(nèi)存和內(nèi)存映射的區(qū)別
-
共享內(nèi)存可以直接創(chuàng)建,內(nèi)存映射需要磁盤文件(匿名映射除外)
-
共享內(nèi)存效果更高
-
內(nèi)存
所有的進程操作的是同一塊共享內(nèi)存。
內(nèi)存映射,每個進程在自己的虛擬地址空間中有一個獨立的內(nèi)存。
-
數(shù)據(jù)安全
- 進程突然退出
? 共享內(nèi)存還存在
? 內(nèi)存映射區(qū)消失
? - 運行進程的電腦死機,宕機了
? 數(shù)據(jù)存在在共享內(nèi)存中,沒有了
? 內(nèi)存映射區(qū)的數(shù)據(jù) ,由于磁盤文件中的數(shù)據(jù)還在,所以內(nèi)存映射區(qū)的數(shù)據(jù)還存在。
-
生命周期
? - 內(nèi)存映射區(qū):進程退出,內(nèi)存映射區(qū)銷毀
? - 共享內(nèi)存:進程退出,共享內(nèi)存還在,標(biāo)記刪除(所有的關(guān)聯(lián)的進程數(shù)為0),或者關(guān)機
? 如果一個進程退出,會自動和共享內(nèi)存進行取消關(guān)聯(lián)。
2.30-2.31 守護進程
- 進程組
- 會話:一組進程組的集合
- 守護進程(Daemon Process),也就是通常說的 Daemon 進程(精靈進程),是Linux 中的后臺服務(wù)進程。它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件
- 生命周期很長,守護進程會在系統(tǒng)啟動的時候被創(chuàng)建并一直運行直至系統(tǒng)被關(guān)閉。它在后臺運行并且不擁有控制終端。沒有控制終端確保了內(nèi)核永遠不會為守護進
程自動生成任何控制信號以及終端相關(guān)的信號(如 SIGINT、SIGQUIT)。
第3章 Linux多線程開發(fā)
3.1 線程概述
- 進程是 CPU 分配資源的最小單位,線程是操作系統(tǒng)調(diào)度執(zhí)行的最小單位
- 進程線程區(qū)別
- 共享什么不共享什么
3.2-3.7 線程相關(guān)api,線程屬性
- lesson29
3.8 線程同步
3.9 互斥量/互斥鎖
-
互斥量:mutex 是 mutual exclusion的縮寫
3.10 死鎖
3.11 讀寫鎖
3.12 生產(chǎn)者和消費者模型
3.13 條件變量(阻塞線程)
blog
3.14 信號量
第4章 Linux網(wǎng)絡(luò)編程
4.1 網(wǎng)絡(luò)結(jié)構(gòu)模式
- C/S結(jié)構(gòu):Client - Server,服務(wù)器 - 客戶機
- B/S結(jié)構(gòu):Browser/Server,瀏覽器/服務(wù)器
4.2-4.3 MAC地址、IP地址、端口
-
網(wǎng)卡具有MAC地址(獨一無二的 48 位串行號),屬于OSI地址第二層
-
Media Access Control Address,直譯為媒體存取控制位址,也稱局域網(wǎng)地址、
以太網(wǎng)地址、物理地址或硬件地址 -
48 位(6個字節(jié))、12 個 16 進制數(shù)。如:00-16-EA-AE-3C-40;,其中前 3 個字節(jié),16 進制數(shù) 00-16-EA 代表網(wǎng)絡(luò)硬件制造商的編號,后 3 個字節(jié),16進制數(shù) AE-3C-40 代表該制造商所制造的某個網(wǎng)絡(luò)產(chǎn)品(如網(wǎng)卡)的系列號。
-
IP 地址(Internet Protocol Address)是指互聯(lián)網(wǎng)協(xié)議地址,又譯為網(wǎng)際協(xié)議地址
-
32 位的二進制數(shù),4個字節(jié)
-
每個 IP 地址包括兩個標(biāo)識碼(ID),即網(wǎng)絡(luò)ID 和主機 ID。同一個物理網(wǎng)絡(luò)上的所有主機都使用同一個網(wǎng)絡(luò) ID,網(wǎng)絡(luò)上的一個主機(包括網(wǎng)絡(luò)上工作站,服務(wù)器和路由器等)有一個主機 ID 與其對應(yīng)。
-
ABC類地址,0對應(yīng)當(dāng)前主機、255是廣播地址不算
-
子網(wǎng)掩碼:子網(wǎng)掩碼只有一個作用,就是將某個 IP 地址劃分成網(wǎng)絡(luò)地址和主機地址兩部分
-
端口:IP 地址比作一間房子,端口就是出入這間房子的門,給每個應(yīng)用程序提供一個端口,進程唯一的編號
-
一個應(yīng)用程序可以有多個端口
-
周知端口\注冊端口\動態(tài)端口\私有端口
4.4 網(wǎng)絡(luò)模型
- OSI(Open System Interconnection)七層參考模型
- TCP/IP四層模型
4.5 協(xié)議
- RST是重置
- 生存時間:TTL,表明是數(shù)據(jù)報在網(wǎng)絡(luò)中的壽命,即為“跳數(shù)限制”,由發(fā)出數(shù)據(jù)報的源點設(shè)置這個
字段。路由器在轉(zhuǎn)發(fā)數(shù)據(jù)之前就把 TTL 值減一,當(dāng) TTL 值減為零時,就丟棄這個數(shù)據(jù)報。
4.6-4.7 網(wǎng)絡(luò)通信的過程
- ARP協(xié)議:根據(jù)IP地址找MAC地址,給所有人發(fā),ip地址對應(yīng)的進行arp應(yīng)答
4.8 socket 介紹
- socket 是由 IP 地址和端口結(jié)合的
4.9 字節(jié)序
-
字節(jié)序分為大端字節(jié)序(Big-Endian) 和小端字節(jié)序(Little-Endian)
-
大部分都采用小端
-
小端字節(jié)序則是指整數(shù)的高位字節(jié)存儲在內(nèi)存的高地址處,而低位字節(jié)則存儲在內(nèi)存的低地
址處。 - 小端: 整數(shù):0x01020304 (01是整數(shù)的高位) 內(nèi)存-> 04 03 02 01
-
大端字節(jié)序是指一個整數(shù)的最高位字節(jié)(23 ~ 31 bit)存儲在內(nèi)存的低地址處,低位字節(jié)(0 ~ 7 bit)存儲在內(nèi)存的高地
址處;
4.10 字節(jié)序轉(zhuǎn)換函數(shù)
- htons、htonl、ntohs、ntohl
4.11 socket地址
- socket地址其實是一個結(jié)構(gòu)體
4.12 IP地址轉(zhuǎn)換函數(shù)
4.13 TCP 通信流程
4.14 socket 函數(shù)
- socket()、bind()、listen()、accept()、connect()、write()、 read()
4.15-4.16 TCP通信實現(xiàn)
- lesson32
4.17 TCP三次握手
-
三次握手發(fā)生在客戶端連接的時候,當(dāng)調(diào)用connect(),底層會通過TCP協(xié)議進行三次握手。
-
ACK、SYN(握手)、FIN(揮手)
-
發(fā)送時候seq隨機生成,兩邊seq不同
-
收到時候ack收到確認后在上一步sep+1(SYN=1),通信時候+數(shù)據(jù)長度
-
客戶端和服務(wù)器ack不同,誰確認收到誰+,發(fā)的時候不變
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-h4CMfslb-1640703132806)(https://i.loli.net/2021/11/13/PYzUb6u4DV5m1sf.png)]
4.18 滑動窗口
- 滑動窗口是 TCP 中實現(xiàn)諸如 ACK 確認、流量控制、擁塞控制的承載結(jié)構(gòu)。
4.19 TCP四次揮手
4.20 多進程實現(xiàn)并發(fā)服務(wù)器
- lesson33
4.23 TCP狀態(tài)轉(zhuǎn)換
- 2MSL(Maximum Segment Lifetime):保證安全性、可靠性;被動斷開方?jīng)]有收到ACK
4.24 半關(guān)閉、端口復(fù)用
- 半關(guān)閉:四次揮手一次FIN,一次ACK之后的狀態(tài)
- 端口復(fù)用:多個套接字綁定同一個端口
4.25 IO多路復(fù)用簡介
- select、poll
- epoll
4.26 select API介紹
4.27 select代碼編寫
4.28 poll API介紹及代碼編寫
4.29 epoll API介紹
4.30 epoll 代碼編寫
- lesson36
4.31 epoll的兩種工作模式
- LT、ET
4.32 UDP通信實現(xiàn)
- lesson36
4.33 廣播
- lesson37
4.34 組播(多播)
- 單播單個、廣播全部、多播在兩者中提供折中方案
- 廣播一般局限于局域網(wǎng)內(nèi)使用,而組播既可以用于局域網(wǎng),也可以用于廣域網(wǎng)
4.35 本地套接字通信
第5章 項目實戰(zhàn)與總結(jié)
5.1 阻塞和非阻塞、同步和異步(網(wǎng)絡(luò)IO)
-
網(wǎng)絡(luò)IO階段1:數(shù)據(jù)就緒
- 阻塞:調(diào)用IO方法的線程進入阻塞狀態(tài)
- 非阻塞:不會改變線程的狀態(tài),通過返回值判斷
-
→
-
操作系統(tǒng) TCP接收緩沖區(qū)
-
→
-
網(wǎng)絡(luò)IO階段2:數(shù)據(jù)讀寫(根據(jù)應(yīng)用程序和內(nèi)核的交互方式)
- 同步:機場機票自己去取 效率低編程簡單
- 異步:機場機票別人給送來 效率高編程復(fù)雜
-
→
-
應(yīng)用程序
-
阻塞 != 同步
-
非阻塞 != 異步
-
陳碩:在處理 IO 的時候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是異步 IO。(select、poll、epoll是同步的)
-
Linux異步IO借口:aio_read() aio_write()
-
一個典型的網(wǎng)絡(luò)IO接口調(diào)用,分為兩個階段,分別是“數(shù)據(jù)就緒” 和 “數(shù)據(jù)讀寫”,數(shù)據(jù)就緒階段分為阻塞和非阻塞,表現(xiàn)得結(jié)果就是,阻塞當(dāng)前線程或是直接返回。
-
同步表示A向B請求調(diào)用一個網(wǎng)絡(luò)IO接口時(或者調(diào)用某個業(yè)務(wù)邏輯API接口時),數(shù)據(jù)的讀寫都是由請求方A自己來完成的(不管是阻塞還是非阻塞);異步表示A向B請求調(diào)用一個網(wǎng)絡(luò)IO接口時(或者調(diào)用某個業(yè)務(wù)邏輯API接口時),向B傳入請求的事件以及事件發(fā)生時通知的方式,A就可以處理其它邏輯了,當(dāng)B監(jiān)聽到事件處理完成后,會用事先約定好的通知方式,通知A處理結(jié)果。
5.2 Unix、Linux上的五種IO模型
- 阻塞 blocking:等待函數(shù)返回
- 非阻塞 non-blocking(NIO):每隔一段時間檢測是否就緒
- IO復(fù)用:select、poll、epoll(阻塞IO只能單個、這些函數(shù)可以同時阻塞多個IO操作)
- 信號驅(qū)動:繼續(xù)運行并不阻塞,收到信號后,處理IO事件(第一階段等待數(shù)據(jù)異步、第二階段拷貝讀寫數(shù)據(jù)同步),用的很少(信號在多線程中不好處理)
- 異步 asynchronous:編程麻煩,出錯不好排查
5.3 Web服務(wù)器簡介及HTTP協(xié)議
- 報文信息、請求方法、狀態(tài)碼
5.4 服務(wù)器編程基本框架和兩種高效的事件處理模式
- I/O處理單元、邏輯單元、網(wǎng)絡(luò)存儲單元、請求隊列
- Ngix
- Reactor(核反應(yīng))、Proactor
- 同步 I/O 模型通常用于實現(xiàn) Reactor 模式,異步 I/O 模型(同步也可以)通常用于實現(xiàn) Proactor 模式
- Reactor 主線程只負責(zé)監(jiān)聽文件描述符上是否有事件發(fā)生,讀寫數(shù)據(jù),接受新的連接,以及處理客戶請求均在工作線程中完成
- Procator 將所有 I/O 操作都交給主線程和內(nèi)核來處理,工作線程僅僅負責(zé)業(yè)務(wù)邏輯
5.5 線程同步機制類封裝及線程池實現(xiàn)
- 線程池
總結(jié)
以上是生活随笔為你收集整理的nowcoder-linux的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用工具说明--搭建基于rietveld
- 下一篇: [Leetcode][第112题][JA