日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

nowcoder-linux

發(fā)布時間:2023/12/10 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nowcoder-linux 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

gcc test.c -E -o test.i gcc test.i -S -o test.s gcc test.s -c -o test.o gcc test.o -o test.out ./test.outgcc test.c //一步其實都干了

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。