從入門到精通:詳解Linux進程管理

前言

在這篇文章中,我將帶領大家深入學習和理解Linux系統中的進程管理。無論你是初學者還是有一定經驗的開發者,相信這篇文章都會對你有所幫助。我們將詳細講解馮諾依曼體系結構、操作系統概念、進程管理、進程調度、進程狀態、環境變量、內存管理以及其他相關內容。

馮諾依曼體系結構

概述

馮諾依曼體系結構是現代計算機系統的基礎。它由數學家兼物理學家馮·諾依曼于1945年提出,至今仍被廣泛應用于各種計算機系統中。馮諾依曼體系結構的核心思想是將程序和數據存儲在同一存儲器中,并由中央處理器(CPU)按順序讀取和執行指令。通過這種方式,計算機系統能夠以更高效、更靈活的方式運行各種應用程序。

組成部分

馮諾依曼體系結構由以下幾個主要部分組成:

  1. 輸入單元:包括鍵盤、鼠標、掃描儀等設備,用于向計算機輸入數據和指令。
  2. 中央處理器(CPU):包含運算器和控制器,用于執行指令和處理數據。運算器負責執行各種算術和邏輯運算,控制器負責指揮和協調各個部分的工作。
  3. 內存:用于存儲程序和數據。內存分為隨機存取存儲器(RAM)和只讀存儲器(ROM),RAM用于存儲正在運行的程序和數據,ROM用于存儲固化的程序和數據。
  4. 輸出單元:包括顯示器、打印機等設備,用于輸出計算結果和信息。

數據流動過程

在馮諾依曼體系結構中,所有數據的輸入和輸出都必須經過內存。具體來說,數據流動過程如下:

  1. 用戶通過輸入單元(如鍵盤)輸入數據。
  2. 數據被存儲在內存中。
  3. CPU從內存中讀取指令和數據,并進行處理。
  4. 處理結果被寫入內存。
  5. 輸出單元(如顯示器)從內存中讀取結果并顯示給用戶。

這種數據流動方式確保了計算機系統的統一和高效。以QQ聊天為例,當你登錄QQ并與好友聊天時,輸入的信息首先被存儲在內存中,CPU從內存中讀取并處理這些信息,處理后的信息再次存儲在內存中,最后通過顯示器輸出。若你發送文件,文件數據也會經過相同的路徑流動,確保信息傳遞的可靠性。

操作系統(Operating System)

概念

操作系統(OS)是管理計算機硬件和軟件資源的系統軟件,負責為用戶提供一個良好的操作環境。操作系統的核心部分是內核,它負責進程管理、內存管理、文件管理和驅動管理等。此外,操作系統還包括一些其他程序,如函數庫和Shell程序。操作系統的功能可以概括為兩個方面:資源管理和用戶接口。

設計目的

操作系統的設計目的是:

  1. 與硬件交互:管理計算機的所有硬件資源,如CPU、內存、磁盤和輸入輸出設備。操作系統通過設備驅動程序與硬件進行交互,確保硬件設備能夠被正確使用。
  2. 提供執行環境:為用戶程序(應用程序)提供一個良好的執行環境,使用戶能夠方便地開發和運行應用程序。操作系統提供了豐富的系統調用和庫函數,簡化了應用程序的開發過程。

定位

在計算機軟硬件架構中,操作系統的定位是一款“管理”軟件。它通過描述和組織被管理對象,實現對系統資源的有效管理。例如,操作系統通過使用結構體(struct)描述硬件資源,通過鏈表或其他高效數據結構組織這些資源,從而實現對資源的管理。

系統調用和庫函數

操作系統通過系統調用向上層開發者暴露部分接口,供其使用。系統調用提供了基本的功能,而庫函數對系統調用進行了封裝,提供了更高層次的接口,方便用戶進行二次開發。例如,文件操作的系統調用包括openreadwrite等,而C標準庫中的fopenfreadfwrite等函數則對這些系統調用進行了封裝,使得文件操作更加方便和易于理解。

進程(Process)

基本概念

進程是程序的一個執行實例,代表正在運行的程序。進程是操作系統資源分配的基本單位,負責管理CPU時間、內存和其他資源。在內核中,進程被描述為一個分配系統資源的實體。每個進程都有自己獨立的地址空間、堆棧以及文件描述符表。

描述進程—PCB

進程信息存儲在一個叫做進程控制塊(PCB)的數據結構中。PCB包含了進程的所有屬性,是操作系統管理進程的核心數據結構。在Linux操作系統中,PCB被實現為task_struct結構體。

task_struct內容分類

task_struct包含以下內容:

  1. 標示符:描述進程的唯一標示符,用于區分其他進程。
  2. 狀態:任務狀態、退出代碼、退出信號等。
  3. 優先級:相對于其他進程的優先級。
  4. 程序計數器:程序中即將被執行的下一條指令的地址。
  5. 內存指針:包括程序代碼和進程相關數據的指針,以及與其他進程共享的內存塊的指針。
  6. 上下文數據:進程執行時處理器寄存器中的數據。
  7. I/O狀態信息:包括顯示的I/O請求、分配給進程的I/O設備和被進程使用的文件列表。
  8. 記賬信息:可能包括處理器時間總和、使用的時鐘數總和、時間限制、記賬號等。
  9. 其他信息:其他與進程相關的信息。

組織進程

在Linux內核中,所有運行的進程都以task_struct鏈表的形式存在內核中。通過這種方式,操作系統可以高效地管理和調度進程。每個task_struct結構體都包含指向下一個進程的指針,這樣所有進程就形成了一個雙向鏈表,操作系統可以方便地遍歷和管理這些進程。

查看進程

用戶可以通過/proc文件系統查看進程的信息。例如,要獲取PID為1的進程信息,可以查看/proc/1文件夾。此外,用戶還可以使用topps等命令行工具獲取進程信息。ps命令可以顯示系統中所有正在運行的進程及其詳細信息,而top命令則可以動態地顯示系統資源的使用情況和進程狀態。

示例代碼

以下示例代碼展示了如何使用ps命令查看系統中所有進程的信息:

ps -aux

該命令輸出的信息包括進程ID、用戶ID、CPU使用率、內存使用率、進程狀態、命令名稱等。

進程狀態

進程的不同狀態

在Linux內核中,進程可以處于以下幾種狀態:

  1. R(運行狀態):表明進程正在運行或在運行隊列中等待運行。
  2. S(睡眠狀態):表明進程在等待事件完成,有時也稱為可中斷睡眠(interruptible sleep)。
  3. D(磁盤休眠狀態):有時也稱為不可中斷睡眠狀態(uninterruptible sleep),通常等待I/O操作完成。
  4. T(停止狀態):進程被停止,可以通過發送SIGSTOP信號暫停進程,通過SIGCONT信號恢復運行。
  5. X(死亡狀態):進程已經終止,不會出現在任務列表中。
  6. Z(僵尸狀態):進程已經終止,但其退出狀態還沒有被父進程讀取,保持在進程表中。

查看進程狀態

用戶可以通過pstop等命令查看進程狀態。例如,使用ps aux命令可以查看系統中所有進程及其狀態。以下是ps aux命令的示例輸出:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  22568  1196 ?        Ss   10:00   0:01 /sbin/init
root       672  0.00.3  37644  3312 ?        Ss   10:00   0:02 /usr/sbin/sshd

在輸出信息中,STAT字段表示進程的狀態。例如,Ss表示進程處于睡眠狀態且是會話領導進程,R表示進程正在運行。

示例代碼

以下示例代碼展示了如何使用top命令動態查看系統資源使用情況和進程狀態:

top

top命令界面中,用戶可以看到系統的總體資源使用情況,包括CPU、內存和交換分區的使用率,以及所有正在運行的進程的信息。用戶可以通過按k鍵終止進程,通過按r鍵調整進程的優先級。

僵尸進程(Zombie Process)

概念與形成原因

僵尸進程是已經終止但其退出狀態尚未被父進程讀取的進程。當子進程退出后,父進程需要通過waitwaitpid系統調用讀取子進程的退出狀態,否則子進程會保持在僵尸狀態。僵尸進程的出現是由于父進程沒有及時回收子進程的資源,導致子進程的信息無法從系統中清除。

危害

僵尸進程會占用系統資源,特別是進程控制塊(PCB)中的內存資源。如果大量僵尸進程存在,會導致系統資源枯竭,影響系統性能和穩定性。此外,僵尸進程的存在還可能影響系統的正常運行和維護,因為系統管理員可能會誤以為這些進程仍在運行。

解決方法

通過在父進程中使用waitwaitpid函數可以避免僵尸進程。例如,父進程可以在子進程終止時調用wait函數讀取子進程的退出狀態,從而釋放其占用的資源。以下是一個示例代碼,展示了如何在父進程中使用wait函數回收子進程的資源:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {printf("Child process\n");sleep(2);exit(0);} else {printf("Parent process\n");wait(NULL);  // 回收子進程資源printf("Child process terminated\n");}return 0;
}

在這個示例中,父進程通過調用wait函數等待子進程終止,并回收其資源,避免了僵尸進程的產生。

孤兒進程(Orphan Process)

概念與形成原因

孤兒進程是其父進程已經終止,但子進程仍在運行的進程。孤兒進程會被系統的1號進程(init進程)收養,并由init進程負責回收資源。孤兒進程的產生通常是由于父進程異常終止或故意終止,而子進程仍需要繼續執行其任務。

危害與處理

孤兒進程不會對系統造成危害,因為它們會被init進程收養并管理。操作系統通過這種機制確保所有進程都能被正確管理和回收。以下是一個示例代碼,展示了孤兒進程的形成過程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子進程sleep(5);  // 保證子進程在父進程退出后繼續運行printf("Child process: parent PID = %d\n", getppid());exit(0);} else {// 父進程printf("Parent process\n");exit(0);  // 父進程立即退出}return 0;
}

在這個示例中,父進程立即退出,子進程在父進程退出后繼續運行,此時子進程成為孤兒進程,并被init進程收養。通過在子進程中打印父進程的PID,可以驗證子進程在成為孤兒進程后,其父進程PID會變為1(init進程的PID)。

進程優先級

基本概念

進程優先級決定了進程獲得CPU時間的先后順序。優先級高的進程優先獲得CPU資源,從而更快地執行。Linux系統中,用戶可以通過調整進程的nice值來改變進程的優先級。nice值的范圍為-20到19,值越小優先級越高。

查看進程優先級

用戶可以使用ps -l命令查看進程的優先級和nice值。例如:

ps -l

輸出信息中包含以下重要字段:

  • UID:執行者的身份。
  • PID:進程ID。
  • PPID:父進程ID。
  • PRI:進程的優先級,值越小優先級越高。
  • NI:進程的nice值。

調整進程優先級

用戶可以使用nice命令啟動一個具有特定優先級的進程,也可以使用renice命令調整已有進程的優先級。例如:

nice -n 10 ./myprogram
renice -n -5 -p 12345

以下是一個示例代碼,展示了如何使用nice命令啟動一個具有特定優先級的進程:

nice -n -10 ./myprogram

在這個示例中,myprogram程序將以較高的優先級運行,因為其nice值被設置為-10。

示例代碼

以下是一個完整的示例代碼,展示了如何調整進程的優先級并查看其效果:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子進程int ret = nice(-10);  // 設置較高優先級if (ret == -1) {perror("nice");}printf("Child process: nice value = %d\n", ret);while (1) {// 子進程持續運行,觀察優先級的影響}} else {// 父進程printf("Parent process\n");while (1) {// 父進程持續運行,觀察優先級的影響}}return 0;
}

運行該程序后,可以使用ps -l命令查看子進程和父進程的優先級和nice值,并觀察其在系統中的表現。

環境變量

基本概念

環境變量是操作系統中用來指定操作系統運行環境的一些參數。在編寫C/C++代碼時,編譯器可以通過環境變量查找所需的動態或靜態庫。環境變量通常具有全局特性,可以影響系統中的所有進程。

常見環境變量

  • PATH:指定命令的搜索路徑。當用戶在終端中輸入命令時,系統會在PATH指定的目錄中搜索可執行文件。
  • HOME:指定用戶的主工作目錄,即用戶登錄到系統后的默認目錄。
  • SHELL:指定當前Shell的路徑,通常是/bin/bash

查看和設置環境變量

用戶可以使用以下命令查看和設置環境變量:

echo $PATH  # 查看PATH環境變量
export MYVAR="Hello, World!"  # 設置環境變量
unset MYVAR  # 清除環境變量
env  # 顯示所有環境變量

示例代碼

以下是一個示例代碼,展示了如何在程序中獲取和設置環境變量:

#include <stdio.h>
#include <stdlib.h>int main() {char *path = getenv("PATH");if (path) {printf("PATH: %s\n", path);}setenv("MYVAR", "Hello, World!", 1);printf("MYVAR: %s\n", getenv("MYVAR"));return 0;
}

在這個示例中,程序首先獲取并打印PATH環境變量的值,然后設置一個新的環境變量MYVAR并打印其值。

環境變量的全局屬性

環境變量通常具有全局屬性,可以被子進程繼承。例如,通過export命令設置的環境變量可以在子進程

中訪問:

export MYVAR="Hello, World!"
./myprogram

子進程運行時可以訪問并打印MYVAR的值。

示例代碼

以下是一個示例代碼,展示了環境變量的全局屬性:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子進程printf("Child process: MYVAR = %s\n", getenv("MYVAR"));} else {// 父進程printf("Parent process\n");setenv("MYVAR", "Hello from parent", 1);wait(NULL);  // 等待子進程終止}return 0;
}

在這個示例中,父進程設置了一個環境變量MYVAR,子進程繼承并打印了該環境變量的值。

進程地址空間

基本概念

進程地址空間是操作系統為每個進程分配的虛擬內存空間。在32位系統中,進程地址空間通常為4GB。地址空間分為用戶空間和內核空間,用戶空間用于存放用戶程序和數據,內核空間用于存放操作系統內核和內核數據。

虛擬地址與物理地址

虛擬地址是用戶程序看到的地址,而物理地址是內存中的實際地址。操作系統通過頁表將虛擬地址映射到物理地址,確保程序在運行時能夠正確訪問內存。

進程地址空間布局

進程地址空間通常包含以下幾部分:

  1. 代碼段:存放程序代碼。
  2. 數據段:存放全局變量和靜態變量。
  3. :用于動態內存分配。
  4. :用于函數調用時存放局部變量和返回地址。

示例代碼

以下是一個簡單的示例,展示了進程地址空間的使用:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int global_var = 0;int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {  // 子進程global_var = 100;printf("Child: %d, %p\n", global_var, &global_var);} else {  // 父進程sleep(1);printf("Parent: %d, %p\n", global_var, &global_var);}return 0;
}

運行該程序會顯示父子進程中變量地址相同但值不同的現象,說明虛擬地址相同但物理地址不同。通過這個示例,可以理解虛擬地址和物理地址的區別,以及進程地址空間的布局。

進程調度

調度算法

Linux內核使用多種調度算法來管理進程的執行順序。常見的調度算法包括先來先服務(FCFS)、最短作業優先(SJF)、優先級調度(Priority Scheduling)和時間片輪轉(Round Robin)。這些算法各有優缺點,適用于不同的場景和需求。

O(1)調度算法

Linux 2.6內核采用了O(1)調度算法,該算法確保調度操作的時間復雜度為常數,不隨進程數量增加而增加。O(1)調度算法使用兩個隊列來管理進程:活動隊列和過期隊列。活動隊列存放正在運行或準備運行的進程,過期隊列存放時間片已耗盡的進程。

活動隊列與過期隊列

  • 活動隊列:存放正在運行或準備運行的進程。調度器從活動隊列中選擇優先級最高的進程進行調度。
  • 過期隊列:存放時間片已耗盡的進程。當活動隊列中的進程全部運行完畢后,調度器會將活動隊列和過期隊列交換,重新開始調度。

示例代碼

以下是一個示例代碼,展示了如何在Linux內核中實現進程調度:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid1, pid2;pid1 = fork();if (pid1 == 0) {// 子進程1while (1) {printf("Child 1 running\n");sleep(1);}} else {pid2 = fork();if (pid2 == 0) {// 子進程2while (1) {printf("Child 2 running\n");sleep(1);}} else {// 父進程while (1) {printf("Parent running\n");sleep(1);}}}return 0;
}

運行該程序后,可以觀察到父進程和兩個子進程輪流執行,展示了時間片輪轉調度的效果。

環境變量的組織方式

環境表

每個程序都會收到一張環境表,環境表是一個字符指針數組,每個指針指向一個以\0結尾的環境字符串。

獲取和設置環境變量

用戶可以通過系統調用或庫函數獲取和設置環境變量。例如,使用getenvsetenv函數可以訪問特定的環境變量:

#include <stdio.h>
#include <stdlib.h>int main() {char *path = getenv("PATH");if (path) {printf("PATH: %s\n", path);}setenv("MYVAR", "Hello, World!", 1);printf("MYVAR: %s\n", getenv("MYVAR"));return 0;
}

在這個示例中,程序首先獲取并打印PATH環境變量的值,然后設置一個新的環境變量MYVAR并打印其值。

環境變量的全局屬性

環境變量通常具有全局屬性,可以被子進程繼承。例如,通過export命令設置的環境變量可以在子進程中訪問:

export MYVAR="Hello, World!"
./myprogram

子進程運行時可以訪問并打印MYVAR的值。

示例代碼

以下是一個示例代碼,展示了環境變量的全局屬性:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {// 子進程printf("Child process: MYVAR = %s\n", getenv("MYVAR"));} else {// 父進程printf("Parent process\n");setenv("MYVAR", "Hello from parent", 1);wait(NULL);  // 等待子進程終止}return 0;
}

在這個示例中,父進程設置了一個環境變量MYVAR,子進程繼承并打印了該環境變量的值。

進程內存映像

程序地址空間回顧

程序地址空間通常包含代碼段、數據段、堆和棧。在32位系統中,地址空間分為用戶空間和內核空間。用戶空間用于存放用戶程序和數據,內核空間用于存放操作系統內核和內核數據。

虛擬地址與物理地址

虛擬地址是用戶程序看到的地址,而物理地址是內存中的實際地址。操作系統通過頁表將虛擬地址映射到物理地址,確保程序在運行時能夠正確訪問內存。

進程地址空間布局

進程地址空間通常包含以下幾部分:

  1. 代碼段:存放程序代碼。
  2. 數據段:存放全局變量和靜態變量。
  3. :用于動態內存分配。
  4. :用于函數調用時存放局部變量和返回地址。

示例代碼

以下是一個簡單的示例,展示了進程地址空間的使用:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int global_var = 0;int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return 1;} else if (pid == 0) {  // 子進程global_var = 100;printf("Child: %d, %p\n", global_var, &global_var);} else {  // 父進程sleep(1);printf("Parent: %d, %p\n", global_var, &global_var);}return 0;
}

運行該程序會顯示父子進程中變量地址

相同但值不同的現象,說明虛擬地址相同但物理地址不同。通過這個示例,可以理解虛擬地址和物理地址的區別,以及進程地址空間的布局。

總結

通過本文的學習,我們詳細介紹了Linux系統中的進程管理。從馮諾依曼體系結構、操作系統概念、進程管理、進程調度、進程狀態、環境變量、內存管理等多個方面進行了深入講解。掌握這些知識,可以幫助我們更高效地管理和使用Linux系統。希望這篇文章對大家有所幫助。如果有任何問題或建議,歡迎在評論區留言與我交流。感謝大家的閱讀!

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

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

相關文章

C語言之函數和函數庫以及自己制作靜態動態鏈接庫并使用

一&#xff1a;函數的本質 1&#xff1a;C語言為什么會有函數 &#xff08;1&#xff09;整個程序分為多個源文件&#xff0c;一個文件分為多個函數&#xff0c;一個函數分成多個語句&#xff0c;這就是整個程序的組織形式。這樣的組織好處在于&#xff1a;分化問題、、便于程序…

分布式版本控制工具 git

git 是什么 分布式版本控制工具。github 是代碼托管平臺。 git 有什么用 保存文件的所有修改記錄。使用版本號&#xff08;sha1 哈希值&#xff09; 進行區分。隨時可瀏覽歷史版本記錄。可還原到歷史指定版本。對比不同版本的文件差異。 為什么要使用 git 多人協作開發一個大…

SQL 優化

SQL 優化是指通過各種手段提高 SQL 查詢的執行效率,減少資源消耗,提高數據庫的整體性能。以下是一些詳細的 SQL 優化方法,包括索引優化、查詢優化、數據庫設計優化等。 1. 索引優化 創建適當的索引: 單列索引:在查詢中頻繁使用的單個列上創建索引。多列索引(復合索引):…

STM32手寫超頻到128M函數

今天學習了野火的STM32教程學會了如何設置STM32的時鐘頻率&#xff0c;步驟比較詳細&#xff0c;也很容易理解&#xff0c;就是視頻教程不能跳著看&#xff0c;只能一節節的看&#xff0c;不然會知識不連貫&#xff0c;造成有些知識不理解&#xff0c;連續著看還是沒有什么難度…

docker-file 網絡

docker掛載 1.綁定掛載&#xff08;Bind Mounts&#xff09;&#xff1a;綁定掛載是將主機上的文件或目錄掛載到容器中。 docker run -v /host/path:/container/path image_name 2.卷掛載&#xff08;Volume Mounts&#xff09;&#xff1a;卷掛載將 Docker 數據卷掛載到容器中…

【CTF Web】CTFShow web4 Writeup(SQL注入+PHP+字符型注入)

web4 1 管理員阿呆又失敗了&#xff0c;這次一定要堵住漏洞 解法 注意到&#xff1a; <!-- flag in id 1000 -->攔截很多種字符&#xff0c;連 select 也不給用了。 if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\|select/i",$id)){die(&q…

yolov8推理由avi改為mp4

修改\ultralytics-main\ultralytics\engine\predictor.py&#xff0c;即可 # Ultralytics YOLO &#x1f680;, AGPL-3.0 license """ Run prediction on images, videos, directories, globs, YouTube, webcam, streams, etc.Usage - sources:$ yolo modepred…

Android開發-Android開發中的TCP與UDP通信策略的實現

Android 開發中的 TCP 與 UDP 通信策略的實現 1. 前言2. 準備工作3. Kotlin 中 TCP 通信實現客戶端代碼示例&#xff1a;服務器代碼示例&#xff1a; 4. Kotlin 中 UDP 通信實現客戶端代碼示例&#xff1a;服務器代碼示例&#xff1a; 5. TCP 與 UDP 應用場景分析TCP 實現可靠傳…

搭建訪問阿里云百煉大模型環境

最近這波大降價&#xff0c;還有限時免費&#xff0c;還不趕快試試在線大模型&#xff1f;下面整理訪問百煉平臺的千問模型方法。 創建RAM子賬號并授權 創建RAM子賬號 1. “訪問控制RAM”入口&#xff08;控制臺URL&#xff09; 然后點擊進入“RAM管理控制臺” 2. 添加用戶 …

vue 區分多環境打包

需求&#xff1a;區分不同的環境&#xff08;測試、正式環境&#xff09;&#xff0c;接口文檔地址不同&#xff1b; 配置步驟&#xff1a; 1、在根目錄下面新建 .env.xxx 文件&#xff08;xxx 根據環境不同配置&#xff09; 文件中一定要配置的參數項為&#xff1a;NODE_ENV…

【Python搞定車載自動化測試】——Python實現CAN總線Bootloader刷寫(含Python源碼)

系列文章目錄 【Python搞定車載自動化測試】系列文章目錄匯總 文章目錄 系列文章目錄&#x1f4af;&#x1f4af;&#x1f4af; 前言&#x1f4af;&#x1f4af;&#x1f4af;一、環境搭建1.軟件環境2.硬件環境 二、目錄結構三、源碼展示1.診斷基礎函數方法2.診斷業務函數方法…

python 火焰檢測

在日常生活,總是離不開火,有時候我們需要預防火災發生,但是我們又不可能一直盯著,這時候我們就需要一款程序幫我們盯著,一旦發生火災從而告知我們,今天就帶大家編寫這么一款應用。 安裝需要的庫 pip install opencv-python 代碼實現 import cv2 # Library for…

qmt量化教程4----訂閱全推數據

文章鏈接 qmt量化教程4----訂閱全推數據 (qq.com) 上次寫了訂閱單股數據的教程 量化教程3---miniqmt當作第三方庫設置&#xff0c;提供源代碼 全推就主動推送&#xff0c;當行情有變化就會觸發回調函數&#xff0c;推送實時數據&#xff0c;可以理解為數據驅動類型&#xff0…

mysql中使用 mysqldump 實現跨機器備份|數據同步

1.如果同步數據庫&#xff0c;必須先創建數據庫&#xff1a; mysqldump -h 192.168.1.10 --lock-tablesfalse -uroot -proot db_name | mysql -h127.0.0.1 -uroot -proot db_name2.過濾掉不想要的表(沒試過&#xff0c;但是試過轉為sql文件的) mysqldump -h 192.168.1.10 --…

vs2019 c++ 函數的返回值是對象的值傳遞時候,將調用對象的移動構造函數

以前倒沒有注意過這個問題。但編譯器這么處理也符合移動構造的語義。因為本來函數體內的變量也要離開作用域被銷毀回收了。測試如下&#xff1a; 謝謝

實現信號發生控制

1. 信號發生器的基本原理 信號發生器是一種能夠產生特定波形和頻率的電子設備&#xff0c;常用于模擬信號的產生和測試。 信號發生器的基本原理 信號發生器的工作原理基于不同的技術&#xff0c;但最常見的類型包括模擬信號發生器和數字信號發生器&#xff08;DDS&#xff0…

[SCTF2019]babyre

打開看看還是有花指令 解除后首先pass1是解maze&#xff0c;好像又是三維的 x是25&#xff0c;也就是向下跳五層,注意是立體的 得到 passwd1&#xff1a; ddwwxxssxaxwwaasasyywwdd 接著往下看 有一個加密函數IDA逆向常用宏定義_lodword-CSDN博客 unsigned __int64 __fastca…

primeflex樣式庫筆記 Display相關的案例

回顧 寬度設置的基本總結 w-full&#xff1a;表示widtdh&#xff1a;100%&#xff1b;占滿父容器的寬度。 w-screen&#xff1a;表示占滿整個屏幕的寬度。 w-1到w-12&#xff0c;是按百分比劃分寬度&#xff0c;數字越大&#xff0c;占據的比例就越大。 w-1rem到w-30rem&…

Oracle的安裝以及一些相關問題

系列文章目錄 Oracle的安裝以及一些相關問題 文章目錄 系列文章目錄前言一、Oracle的安裝二、常用命令三、誤刪dbf四、PLSQL亂碼五、oracle更換數據庫字符集總結 前言 一段時間沒更新&#xff0c;主要最近一直在找工作&#xff0c;最終還是順著春招找到工作了&#xff0c;現在…

美信時代監控易:堆疊交換機的監控與配置管理策略

隨著企業數字化轉型的加速&#xff0c;網絡架構的複雜性日益提升&#xff0c;堆疊交換機作為高可靠性、靈活擴展性的解決方案&#xff0c;在網絡基礎設施中扮演著至關重要的角色。然而&#xff0c;如何確保堆疊交換機的穩定運行&#xff0c;實現高效監控與配置管理&#xff0c;…