Linux篇:進程

一. 前置知識

1.1馮諾依曼體系結構

我們常見的計算機,如筆記本。我們不常見的計算機,如服務器,大部分都遵守馮諾依曼體系

為什么計算機要采用馮諾依曼體系呢?

在計算機出現之前有很多人都提出過計算機體系結構,但最終選擇馮諾依曼是因為用比較少的錢就可以做出效率不錯的計算機

截至目前,我們所認識的計算機,都是由一個個的硬件組件組成

輸入單元:包括鍵盤 , 鼠標,掃描儀 , 寫板等
中央處理器 (CPU) :含有運算器和控制器等
輸出單元:顯示器,打印機等
關于馮諾依曼,必須強調幾點:
這里的存儲器指的是內存
不考慮緩存情況,這里的CPU 能且只能對內存進行讀寫,不能訪問外設 ( 輸入或輸出設備 )
外設 ( 輸入或輸出設備 ) 要輸入或者輸出數據,也只能寫入內存或者從內存中讀取。 、一句話,所有設備都只能直接和內存打交道。
為什么說所有的設備只能直接和內存進行數據傳輸,不能直接和CPU傳輸?
以CPU為中心,離CPU越近,存儲效率就越高,造價越高
外設(磁盤)的運行速度是毫秒級別,內存是微秒級別,CPU是納秒級別,如果說外設(磁盤)直接和CPU進行數據傳輸,會導致效率低下,比如說外設直接和CPU傳輸,外設給CPU發送一點數據,CPU就做計算,CPU非常快,CPU不僅僅要處理外設的數據還有別的事情要做,當處理完外設的數據,CPU就切換任務,等外設傳進來一點數據,CPU就要停下當前的任務,切換任務再去處理外設傳進來的數據,多次的切換任務會使效率降低,讓內存先接收外設的數據,讓內存傳給CPU,可以提升效率
兩臺電腦進行信息的傳輸是怎么傳輸的呢?
兩臺電腦就相當于兩套馮諾依曼體系,A,B兩個人進行信息交互,A通過鍵盤(輸入設備)將數據寫入到內存,內存傳給CPU計算,經CPU計算完再傳送給內存,內存再由網卡(輸出設備)發給B,B的輸入設備接收,傳給B的內存,再傳給B的CPU計算,最后傳給B的顯示屏(輸出設備),B就可以看到了

1.2 操作系統 (OS)

1.2.1 簡述操作系統

操作系統是什么?

是軟件,管理軟硬件資源,開機自動再內存啟動

為什么開機自動啟動,為什么用它?

操作系統管理軟硬件資源,為用戶提供良好的體驗,如果沒有它,用戶就得自己手動調試硬件,自己兼顧軟硬件

1.2.2 用戶部分

用戶就是指的是使用者,用戶操作接口就是操作系統給用戶提供的系統調用接口

為什么要提供操作接口?

操作接口分為shell外殼(Linux下的shell,Windows下的圖形化界面),lib(動靜態庫),部分指令(部分指令指的是操作系統提供的一些基本命令或者工具)

1) 用戶直接使用接口,降低了技術門檻

2) 其次是操作系統怕用戶搞破壞,給硬件搞壞

system call就是操作系統向上層提供的系統調用函數

1.2.3 系統軟件部分

這部分就是操作系統管理軟硬件,操作系統對軟硬件資源的管理分為兩步:

1. 描述起來,用 struct 結構體
2. 組織起來,用鏈表或其他高效的數據結構
簡稱: 先描述再組織 (非常重要,以后會經常提及到!!!)
操作系統系統內不僅要管理硬件,軟件例如進程,也是要管理,也是通過先描述再組織的方式管理,操作系統就是C語言寫的,所以用struct結構體記錄進程的所有屬性,這是先描述,這個存儲記錄進程屬性的結構體就是PCB,Linux中是struct task_struct。用鏈表將所有的進程結構體連接起來,這是再組織。

1.2.4硬件部分

這部分沒什么好說的,就是外設,硬件

二.進程

2.1基本概念

1、已經加載到內存中的程序/正在運行的程序叫做進程,一個操作系統不僅僅只能運行一個進程,可以同時運行多個進程。
2、操作系統,必須將進程管理起來,而管理的過程是先描述,再組織。
3、任何一個進程,在加載到內存的時候,形成真正的進程時,操作系統要先創建描述進程(屬性)的結構體對象PCB(process control block)---進程控制塊(進程屬性的集合)。
4、此結構體包括進程編號,進程的狀態,優先級,代碼和數據相關的指針信息等。
5、根據進程的PCB類型,該進程創建對應的PCB對象。有了PCB結構體對象,在操作系統中對進程進行管理,變成了對單鏈表進行增刪改查。
6、進程=內核數據結構(PCB)+代碼和數據。
7、在linux中描述進程的結構體叫做task_struct,最基本的組織進程task struct方式采用雙向鏈表組織的,里面包含進程的所有屬性。

描述進程 -PCB
進程信息被放在一個叫做進程控制塊的數據結構中,可以理解為進程屬性的集合。
課本上稱之為 PCB process control block ), Linux 操作系統下的 PCB : task_struct
Linux中,通常用雙鏈表管理進程的PCB,next節點指向的是下一個進程PCB的結構體
task_struct-PCB 的一種
Linux 中描述進程的結構體叫做 task_struct
task_struct Linux 內核的一種數據結構,它會被裝載到 RAM( 內存 ) 里并且包含著進程的信息。
task_ struct 內容分類
標示符 : 描述本進程的唯一標示符,用來區別其他進程。
狀態 : 任務狀態,退出代碼,退出信號等。
優先級 : 相對于其他進程的優先級。
程序計數器 : 程序中即將被執行的下一條指令的地址。
內存指針 : 包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針
上下文數據 : 進程執行時處理器的寄存器中的數據 [ 休學例子,要加圖 CPU ,寄存器 ]
I O 狀態信息 : 包括顯示的 I/O 請求 , 分配給進程的 I O 設備和被進程使用的文件列表。
記賬信息 : 可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
其他信息
組織進程
可以在內核源代碼里找到它。所有運行在系統里的進程都以 task_struct 鏈表的形式存在內核里。
查看進程
進程的信息可以通過 /proc 系統文件夾查看
如:要獲取 PID 1 的進程信息,你需要查看 /proc/1 這個文件夾。

2.2Linux有關進程的指令

ls /proc:顯示系統中動態運行的所有進程的信息
ls /proc/進程pid -l:查看進程的詳細信息,詳細信息中cwd和exe是當前對我們來說最重要的,cwd是當前工作目錄,就是該進程的源文件的路徑,chdir函數可以更改進程的工作目錄,chdir("目標目錄")。 exe就是進程的源文件是哪個
?
ps查看進程
ps ajx | grep xxx: 顯示出進程名字中帶有xxx的進程
ps ajx | grep head -1: 顯示出屬性,通常配合其他ps指令使用 ,比如:ps ajx | grep xxx && ps ajx | grep head -1
getpid():獲取進程pid,getppid()獲取進程ppid
#include<stdio.h>
#include<unistd.h>int main()
{while(1){printf("我的pid是%d,我的ppid是%d\n",getpid(),getppid());sleep(1);}return 0;
}

父進程含義:
我們登錄xshell時,系統會為我們創建一個bash進程,即命令行解釋的進程,幫我們在顯示器中打印對話框終端。
我們在對話框中輸入的所有的指令都是bash進程的子進程。
bash進程只進行命令行解釋,具體執行出錯只會影響他的子進程。
進程PID會變化,而它的ppid一般在同一個終端下啟動,它都是不變的,而它的所有的進程的父進程都是bash。

fork:創建子進程:
創建子進程PCB,填充PCB對應的內容,讓子進程和父進程指向相同的代碼,父子進程都是有獨立的task struct,可以被CPU調度運行了。

不同方法創建子進程
①./運行程序---指令級別創建子進程
②fork()?--- 代碼層面創建子進程

為什么fork要給子進程返回零,給父進程返回子進程PID?
fork給父進程返回子進程pid,用來標定子進程的唯一性。而子進程只要調用getpid()就可獲取進程的PID。返回不同的返回值,是為了區分,讓不同的執行流,執行不同的代碼快。(一般而言,fork之后的代碼父子共享)

一個函數是如何做到返回兩次的?一個變量怎么會有不同的內容?如何理解?
任何平臺,進程在運行的時候是具有獨立性的。代碼共享并不影響獨立性,因為代碼不可修改。而數據上互相獨立,子進程理論上要拷貝父進程數據。但創建出來的子進程,對于大部分父進程不會訪問,所以子進程在訪問父進程數據時進行寫時拷貝即可(子進程和父進程訪問的是不同的內存區)。

誰決定把一個進程放到CPU上去運行呢?是由調度器(CPU)去決定的。
如果父子進程被創建好fork()往后誰先進行呢?誰先進行由調度器決定,不確定。

三. 進程的狀態

3.1?概括

進程狀態其實就是進程PCB中的一個變量,int status,更改狀態就是更改這個變量的

#define NEW 1
#define RUNNING 2
#define BLOCK 3pcb->status = NEW;
if(pcb->status == NEW) //如果狀態是NEW,該放入哪個隊列
else if(pcb->status == RUNNING) //如果是RUNNING,該放入哪個隊列

3.2 運行狀態

只要在運行隊列的進程,狀態就是運行狀態

3.3 阻塞狀態

所編寫的代碼中或多或少都會訪問系統的某些資源,比如鍵盤,在調用scanf函數時,就是從鍵盤拿數據,如果一直不輸入,鍵盤上就不會有數據? ?------->? ?進程要訪問的資源就沒有就緒? -------->? 不具備足夠的資源和條件? ?--------->? ?進程代碼就沒法接著執行。

這時候的進程狀態就是阻塞狀態

3.4掛起狀態(阻塞掛起狀態)

如果一個進程被阻塞了,注定了,這個進程需要的資源沒有就緒,如果這時候操作系統的內存資源嚴重不足了怎么辦呢?操作系統會將內存數據進行置換到外設,將所有的阻塞狀態的進程置換到外設的swap分區,( 補充:swap分區時在磁盤的一塊區域,大小和內存大小一樣或者比內存小,不能太大,如果太大,就會很依賴swap分區,就會增加置換次數,置換次數變多,IO操作次數變多,效率就會受到影響 ),被置換到sawp分區的進程的狀態就是掛起,如果不講這些進程置換,計算機就宕機了,所以置換就算非常慢也沒有辦法。這種狀態一般不會出現,出現了就說明計算機快完蛋了。

體現在Linux中,有些差別但是無可厚非

①R運行狀態: 表明進程是在運行中或者在運行隊列里。
②S睡眠狀態: 意味著進程在等待事件完成。
③D磁盤休眠狀態:讓進程在磁盤寫入完畢期間,這個進程不能被任何人殺掉。
④T停止狀態: 可以通過發送 SIGSTOP(kill -19) 信號給進程來停止(T)進程。這個被暫停的進程可以通過發送 SIGCONT 信號(kill -18)讓進程繼續運行。
⑤X死亡狀態:操作系統將該進程的數據全部釋放掉。
⑥Z僵尸進程:進程一般退出的時候,如果父進程,沒有主動回收子進程信息,子進程會一直讓自己出于Z狀態,進程的相關資源尤其是task_struct結構體不能被釋放。

四. 進程優先級

4.1基本概念

cpu 資源分配的先后順序,就是指進程的優先權( priority )。
優先權高的進程有優先執行權利。配置進程優先權對多任務環境的 linux 很有用,可以改善系統性能。 還可以把進程運行到指定的CPU 上,這樣一來,把不重要的進程安排到某個 CPU ,可以大大改善系統整體性能
查看系統進程
linux 或者 unix 系統中,用 ps –l 命令則會類似輸出以下幾個內容:

4.1 PRI NI

PRI and NI
PRI 也還是比較好理解的,即進程的優先級,或者通俗點說就是程序被 CPU 執行的先后順序,此值越小
進程的優先級別越高
NI ? 就是我們所要說的 nice 值了,其表示進程可被執行的優先級的修正數值
PRI 值越小越快被執行,那么加入 nice 值后,將會使得 PRI 變為: PRI(new)=PRI(old)+nice
這樣,當 nice 值為負值的時候,那么該程序將會優先級值將變小,即其優先級會變高,則其越快被執行
所以,調整進程優先級,在 Linux 下,就是調整進程 nice
nice 其取值范圍是 -20 19 ,一共 40 個級別。
PRI vs NI
需要強調一點的是,進程的 nice 值不是進程的優先級,他們不是一個概念,但是進程 nice 值會影響到進
程的優先級變化。
可以理解 nice 值是進程優先級的修正修正數據
top 命令更改已存在進程的 nice
top
進入 top 后按 “r”–> 輸入進程 PID–> 輸入 nice
其他概念
競爭性 : 系統進程數目眾多,而 CPU 資源只有少量,甚至 1 個,所以進程之間是具有競爭屬性的。為了高
效完成任務,更合理競爭相關資源,便具有了優先級
獨立性 : 多進程運行,需要獨享各種資源,多進程運行期間互不干擾
并行 : 多個進程在多個 CPU 下分別,同時進行運行,這稱之為并行
并發 : 多個進程在一個 CPU 下采用進程切換的方式,在一段時間之內,讓多個進程都得以推進,稱之為并發

五. 環境變量

5.1基本概念

科技 環境變量 一般是指在操作系統中用來指定操作系統運行環境的一些參數 如:我們在編寫C/C++ 代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪里,但
是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。
環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性

5.2常見環境變量

PATH : 指定命令的搜索路徑
HOME : 指定用戶的主工作目錄 ( 即用戶登陸到 Linux 系統中時 , 默認的目錄 )
SHELL : 當前 Shell, 它的值通常是 /bin/bash

5.3查看環境變量方法

echo $NAME //NAME: 你的環境變量名稱

5.4和環境變量相關的命令

1. echo: 顯示某個環境變量值
2. export: 設置一個新的環境變量
3. env: 顯示所有環境變量
4. unset: 清除環境變量
5. set: 顯示本地定義的 shell 變量和環境變量

5.5環境變量的組織方式

5.6通過代碼如何獲取環境變量

命令行第三個參數
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

通過第三方變量environ,libc中定義的全局變量environ指向環境變量表,environ沒有包含在任何頭文件中,所以在使用時 要用extern聲明。

#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

六. 進程地址空間

6.1程序地址空間分布情況

//myproc.c#include <stdio.h>
#include <stdlib.h>int g_val_1;
int g_val_2 = 100;int main()
{printf("code addr: %p/n", main);const char *str = "hello bit";printf("read only string addr: %p\n", str);printf("init global value addr: %p\n", &g_val_2);printf("uninit global value addr: %p\n", &g_val_1);char *mem = (char*)malloc(100);printf("heap addr: %p\n", mem);printf("stack addr: %p\n", &str);return 0;
}

注:static修飾的局部變量,編譯的時候已經被編譯到全局數據區。

6.2地址空間

一個小實驗

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int g_val = 100;int main()
{pid_t id = fork();if (id == 0){int cnt = 5;//子進程while (1){printf("I am child, pid : %d, ppid : %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);if (cnt) cnt--;else{g_val = 200;printf("子進程change g_val : 100->200\n");cnt--;}}}else{//父進程while (1){printf("I am parent, pid : %d, ppid : %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);}}
}

問1:怎么可能同一個變量,同一個地址,同時讀取,讀到了不同的內容結論?
答:
①如果變量的地址是物理地址,不可能存在上面的現象,絕對不是物理地址,是線性地址/虛擬地址。
②子進程的進程地址空間繼承自父進程,但是當實際訪問讀取時,需要根據相同的虛擬地址(映射)查找不同的物理地址。
③修改子進程變量時,先經過寫時拷貝(是由操作系統自動完成的)并重新開辟空間,但是在這個過程中,不會影響虛擬地址。

拓展:在32位計算機中,有32位的地址和數據總線
每一根地址總線只有0、1(32根,2^32種)
(三類線:地址總線,數據總線控制,總線
CPU和內存中連的線叫系統總線
內存和外設中連的線叫IO總線)

問2:什么叫做地址空間?如何理解?
答:
①進程在極端情況下所能訪問的物理內存的最大值。地址,總線,排列組合形成地址范圍[0,2^32]。
②通過定義一個區域的起始和結束來實現地址空間上的區域劃分。
③所謂的進程地址空間,本質上是一個描述進程可視范圍的大小
地址空間內一定要存在各種區域劃分,對線性地址進行start和end即可
在范圍內,連續空間中,每一個最小單位都可以有地址,這個地址可以被對象直接使用。

問3:地址空間本質是內核的一個數據結構對象,類似PCB一樣,地址空間也是要被操作系統管理的:先描述,再組織 。這樣做的目的是什么?
答:
①讓進程以統一的視角看待內存,進程就不需要再維護自己冗余的代碼
②增加進程虛擬地址空間可以讓我們訪問內存的時候,增加一個轉換的過程,在這個轉化的過程中,可以對尋址記請求進行審查,所以一旦異常訪問,直接攔截,該請求不會到達內存,保護物理內存。

6.3頁表

①每個當前正在執行的進程的頁表,在CPU內有一個cr3寄存器,保存當前頁表的起始地址(這是物理地址)。該進程在運行期間cr3寄存器中頁表的地址/當前進程正在運行的臨時數據,本質上屬于進程的硬件上下文。

②代碼區和字符常量區所匹配的頁表所對應的虛擬物理地址映射標志位決定是否只讀。(代碼是只讀的,字符常量區只讀的)

③操作系統對大文件可以實現分批加載,惰性加載的方式。另外有一個標志位標識對你的代碼和數據是否已經被加載到內存。

④如果發現當前代碼和數據并未加載到內存里,此時,操作系統觸發缺頁中斷。將未加載到內存中的代碼和數據,重新加載到內存里,把這段內存的地址填寫到對應的頁表當中,再訪問。

注:寫時拷貝也是缺頁中斷:一旦創建子進程,可讀的內容不變,可寫的內容對應的虛擬內存以及操作系統會把父進程對應的可寫區域內容全部改成只讀,從而子進程繼承下來也為只讀。一旦父進程或子進程嘗試對數據段進行寫入時,會通過觸發讀權限問題進行寫時拷貝。

問:進程在被創建的時候,是先創建內核數據結構呢,還是先加載對應的可執行程序呢?
答:先要創建內核數據結構,即處理好進程維護的PCB地址空間和頁表對應關系,再慢慢加載可執行程序。

⑤掛起:進程對應的代碼和數據全部釋放掉,頁表清空,并且頁表標志位,對應虛擬地址所表征的是否在內存的標志位置為0代表不在內存里。

6.4 Linux的內存管理模塊:進程管理和內存管理,實現軟件層面上的解耦合

①因為有地址,空間和頁表的存在將進程管理模塊和內存管理模塊進行解耦合

②進程=內核數據結構(task_struct&&mm_struct&&頁表)+程序的代碼和數據

③總結:進程具有獨立性,為什么?怎么做到的?
a.每個進程具有單獨的PCB和進程地址空間頁表,所以在那個數據結構上,每個進程都是互相獨立的。
b.只要將頁表,映射到物理內存的不同區域,每個區域的代碼和數據就會互相解耦。
c.把PCB換了,進程地址空間自然而然就換了。頁表的起始地址屬于進程的下文,進程只要切換,頁表也就切換。

補充:缺頁中斷的好處:缺頁中斷本質上是重新分配內存,改變加載程序的先后順序和單次加載量。提高首次加載速度,局部上加載速度變快。很好的將內存分批釋放,減少內存申請空窗期,加快內存申請釋放,從而變相是我們內存的使用率越來越高。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時序數據庫TimescaleDB,實戰部署全攻略

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈嘍&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人稱jeames007&#xff0c;10余年DBA及大數據工作經驗 一位上進心十足的【大數據領域博主】&#xff01;&#x1f61c;&am…

C++ Primer 筆記(總結,摘要,概括)——第5章 語句

目錄 5.1 簡單語句 5.2 語句作用域 5.3 條件語句 5.3.1 if語句 5.3.2 switch語句 5.4 迭代語句 5.4.1 while語句 5.4.2 傳統的for語句 5.4.3 范圍for語句 5.4.4 do while語句 5.5 跳轉語句 5.5.1 break語句 5.5.2 continue語句 5.5.3 goto語句 5.6 try語句塊和異常處理 5…

前端常見面試題

我們前端常見面試題涉及多個方面&#xff0c;這篇文章就先簡單把每個方面都舉幾個列子&#xff0c;分別寫一下常見的主題和可能的問題。 一&#xff1a;HTML/CSS 基礎 問題: 1.解釋一下什么是語義化標簽&#xff1f;它的好處是什么&#xff1f; 2.CSS 選擇器的優先級是如何工…

2024華北醫院信息網絡大會第二輪更新通知

大會背景 近年來&#xff0c;我國醫療行業信息化取得了飛躍式的發展&#xff0c;醫療信息化對醫療行業有著重要的支撐作用。2021年國家衛健委、中醫藥管理局聯合印發《公立醫院高質量發展促進行動&#xff08;2021-2025年&#xff09;》&#xff0c;提出重點建設“三位一體”智…

【青龍】快速搭建青龍面板,部署屬于你自己的應用!

青龍面板是一個支持 Python3、JavaScript、Shell、Typescript 的定時任務管理平臺。 廢話不多說&#xff0c;直接開始。 這里使用一臺 雨云 的云服務器作為演示。雨云注冊地址&#xff1a;https://www.rainyun.com/ 優惠碼&#xff1a;lz932 使用優惠碼注冊后綁定微信可獲得8折…

【Chrono Engine學習總結】4-vehicle-4.3-兩個vehicle碰撞測試

由于Chrono的官方教程在一些細節方面解釋的并不清楚&#xff0c;自己做了一些嘗試&#xff0c;做學習總結。 今天突發奇想&#xff0c;想試一下&#xff0c;是否可以實現兩個vehicle的碰撞&#xff1f; 1、兩輛vehicle的仿真 官方提供了demo_VEH_TwoCars這個demo&#xff0c…

C++入門04 函數的參數傳遞、引用類型與重載

圖源&#xff1a;文心一言 聽課筆記簡單整理&#xff0c;供小伙伴們參考&#xff0c;包含以下內容“&#x1f40b;3.11 引用類型、&#x1f40b;3.14 內聯函數、&#x1f40b;3.15 默認參數值、&#x1f40b;3.16 函數重載、&#x1f40b;3.17 C系統函數”~&#x1f95d;&…

LabVIEW多通道壓力傳感器實時動態檢測

LabVIEW多通道壓力傳感器實時動態檢測 介紹了一種基于LabVIEW的多通道壓力傳感器實時動態檢測系統&#xff0c;解決壓阻式壓力傳感器溫度補償過程的復雜度&#xff0c;提高測量的準確性。通過自動輪詢檢測方法&#xff0c;結合硬件檢測模型和多通道檢測系統設計&#xff0c;本…

集合框架之List集合

目錄 ?編輯 一、什么是UML 二、集合框架 三、List集合 1.特點 2.遍歷方式 3.刪除 4.優化 四、迭代器原理 五、泛型 六、裝拆箱 七、ArrayList、LinkedList和Vector的區別 ArrayList和Vector的區別 LinkedList和Vector的區別 一、什么是UML UML&#xff08;Unif…

基于ORB-SLAM2與YOLOv8剔除動態特征點(三種方法)

基于ORB-SLAM2與YOLOv8剔除動態特征點(三種方法) 寫上篇文章時測試過程比較亂&#xff0c;寫的時候有些地方有點失誤&#xff0c;所以重新寫了這篇 本文內容均在RGB-D環境下進行程序測試 本文涉及到的動態特征點剔除速度均是以https://cvg.cit.tum.de/data/datasets/rgbd-dat…

系統學習Python——裝飾器:類裝飾器-[單例類:編寫替代方案]

分類目錄&#xff1a;《系統學習Python》總目錄 有趣的是&#xff0c;這里如果能使用nonlocal語句&#xff08;僅在Python3.X中可用&#xff09;來改變外層作用域名稱&#xff0c;我們在這里可以編寫一個自包含程度更高的解決方案一一一下面的替代方案為每個類使用了一個外層作…

編寫程序,實現shell功能——項目訓練——day08

c c今天做了一個實戰項目訓練&#xff0c;編寫一個程序&#xff0c;實現shell功能&#xff0c;我們稱之為minishell。 主要是利用Linux中IO接口實現&#xff0c;實現的功能有&#xff1a; 1.ls ls -a ls -l cd cp mv pwd c…

軟件License授權原理

軟件License授權原理 你知道License是如何防止別人破解的嗎&#xff1f;本文將介紹License的生成原理&#xff0c;理解了License的授權原理你不但可以防止別人破解你的License&#xff0c;你甚至可以研究別人的License找到它們的漏洞。喜歡本文的朋友建議收藏關注&#xff0c;…

【Linux】進程狀態

進程狀態 進程狀態的簡要介紹運行狀態進程排隊 阻塞狀態掛起狀態Linux中的進程狀態 進程狀態的簡要介紹 進程狀態指的是一個操作系統中正在運行的進程當前所處的狀態。根據不同的操作系統&#xff0c;進程狀態可能會有一些細微的差別&#xff0c;但最主要的是以下三種狀態 運行…

Java——方法的使用

目錄 一.方法的概念及使用 1 什么是方法(method) 2.方法定義 3 方法調用的執行過程 4 實參和形參的關系(重要) 5.沒有返回值的方法 二.方法重載 1.為什么需要方法重載 2.方法重載概念 3.方法簽名 三.遞歸 1.遞歸的概念 2.遞歸執行過程分析 3. 遞歸練習 一.方法的…

貓頭虎分享已解決Bug || 容器編排問題:OrchestrationFailure, ContainerManagementError

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

代碼隨想錄算法訓練營第四十二天|122. 買賣股票的最佳時機 II

674. 最長連續遞增序列 public static int findLengthOfLCIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for (int i 1; i < nums.length; i) {dfs(nums, dp, i);}Arrays.sort(dp);return dp[dp.length - 1];}public static void dfs(int[] nums, int[] dp, i…

【Python】【VS Code】VS Code中python.json和setting.json文件配置說明

目錄 1. python.json配置 2. setting.json配置 3. 解決中文亂碼 4. 實現效果 1. python.json配置 python.json 獲取步驟&#xff1a;文件 -> 首選項 -> 配置用戶代碼片段 -> python 此為VS Code的頭文件設置&#xff0c;復制以下內容到 python.json {"HEADER…

個人做抖店如何能夠快速起店?掌握好技巧是關鍵!建議收藏!

大家好&#xff0c;我是電商小布。 相信我們每個朋友在店鋪開通后&#xff0c;最關心的事情就是小店成功起店了。 那么個人做抖店想要快速起店&#xff0c;該怎么來進行操作呢&#xff1f; 接下來&#xff0c;小布重點給大家說三點&#xff1a; 首先來說一下小店的主體類型…

git常用命令記錄

1、第一次初始化 git init git add . git commit -m ‘first commit’ git remote add origin gitgithub.com:帳號名/倉庫名.git git pull origin master git push origin master # -f 強推 git clone gitgithub.com:git帳號名/倉庫名.git 2、工作基本操作 git checkout master…