目錄
一. 理解進程和線程的概念。并在Linux系統下進行相應操作
1.1概念
1.1.1進程(Process)
1.1.2 線程(Thread)
1.2操作
1.2.1用 ps -a 命令查看系統中各進程的編號pid?
1.2.2用kill 命令終止一個進程pid
二. 解釋Linux的“虛擬內存管理”,它與stm32中的 真實物理內存(內存映射)有什么區別?
2.1核心區別
2.2地址空間
2.3內存分配
2.4典型特征
2.5適用場景
三. 理解 Linux系統調用函數 fork()、wait()、exec() 等的含義和調用方法 。
3.1用putty或xterminal等工具軟件進行操作。
3.1.1打開xterminal,連接服務器
3.1.2在home目錄下創建工作目錄
3.1.3使用vi創建C程序文件
3.1.4按i進入編輯模式,輸入以下代碼:
3.1.5使用gcc編譯和運行程序
3.2在各小組的樹莓派中,也手動創建組員的賬號,組員在各自的賬號+home目錄下,完成同樣的Linux系統調用函數練習。
3.2.1登錄樹莓派,打開端口進行賬號密碼的創建
3.2.2登錄對應賬號后進行編輯程序然后運行
一. 理解進程和線程的概念。并在Linux系統下進行相應操作
1.1概念
1.1.1進程(Process)
? ? ? 定義:
? ? ? ? ? ? 進程是操作系統進行資源分配和調度的基本單位
? ? ? ? ? ? 是程序的一次執行過程,具有獨立的內存空間
? ? ? 核心特征:
? ? ? ? ? ? 獨立性:每個進程有獨立的地址空間
? ? ? ? ? ? 動態性:進程有創建、執行、暫停、終止等生命周期
? ? ? ? ? ? 并發性:多個進程可以并發執行
? ? ? ? ? ? 資源分配單位:CPU、內存等資源以進程為單位分配
? ? ? ?進程組成:
? ? ? ? ? ? 代碼段(text)
? ? ? ? ? ? 數據段(data)
? ? ? ? ? ? 堆(heap)
? ? ? ? ? ? 棧(stack)
? ? ? ? ? ? 進程控制塊(PCB)
? ? ? ?Linux中的進程:
ps -aux # 查看系統所有進程
top # 動態查看進程狀態
1.1.2 線程(Thread)
? ? ? ?定義:
? ? ? ? ? ? 線程是進程內的執行單元,是CPU調度的基本單位
? ? ? ? ? ?一個進程可以包含多個線程,共享進程的資源
? ? ? 核心特征:
? ? ? ? ? ?輕量級:創建/銷毀開銷比進程小
? ? ? ? ? ?共享性:同一進程的線程共享內存和資源
? ? ? ? ? ?獨立性:有獨立的執行路徑和棧空間
? ? ? ? ? ?并發性:多線程可并發執行
? ? ? 線程組成:
? ? ? ? ? ?線程ID
? ? ? ? ? ?程序計數器
? ? ? ? ? ?寄存器集合
? ? ? ? ? ?棧空間
? ? ? Linux中的線程
ps -T -p <PID> # 查看特定進程的線程
top -H # 顯示線程信息
1.2操作
1.2.1用 ps -a 命令查看系統中各進程的編號pid?
1.2.2用kill 命令終止一個進程pid
因為終止一個進程需要權限所以如果之輸入
kill 240932
并不會成功
這里就需要輸入來獲得權限,就可以了
sudo kill 2409326
然后再用ps -a 命令查看系統中各進程的編號pid可以發現,已經成功終止
二. 解釋Linux的“虛擬內存管理”,它與stm32中的 真實物理內存(內存映射)有什么區別?
2.1核心區別
? ? ? Linux使用虛擬內存(通過MMU實現地址轉換),STM32使用物理內存直接映射(無MMU)
? ? ? Linux有內存保護機制(用戶/內核態隔離),STM32所有代碼均可訪問全部內存
2.2地址空間
? ? ?Linux:每個進程有獨立的4GB(32位)虛擬地址空間
? ? ?STM32:所有程序共享固定的物理地址空間(如Flash 0x08000000,SRAM 0x20000000)
2.3內存分配
? ? ?Linux:動態分配(malloc→brk/sbrk/mmap)
? ? ?STM32:靜態分配(鏈接腳本確定,需手動管理)
2.4典型特征
? ? ?Linux支持:
? ? ? ? ?內存超額使用(Swap)
? ? ? ? ?寫時復制(COW)
? ? ? ? ?內存共享(共享庫)
? ? STM32特征
? ? ? ? 確定性訪問(無地址轉換延遲)
? ? ? ? 直接硬件操作(寄存器映射)
? ? ? ? 無內存碎片風險(靜態分配)
2.5適用場景
? ? ?選擇Linux虛擬內存:需要多進程隔離、運行大型程序、內存需求超過物理內存時
? ? ?選擇STM32物理映射:實時控制系統、資源受限(<1MB內存)場景、需要直接操作寄存器時
三. 理解 Linux系統調用函數 fork()、wait()、exec() 等的含義和調用方法 。
3.1用putty或xterminal等工具軟件進行操作。
? ? ? 遠程登錄自己被分配的阿里云服務器Ubuntu系統的賬號(見下面附件),在自己的home目錄下,創建一個作業子目錄,然后學習使用vi 編輯一個c代碼,gcc編譯,實現一個系統調用函數的例子
3.1.1打開xterminal,連接服務器
3.1.2在home目錄下創建工作目錄
cd ~//判斷是否在home目錄
mkdir week6//創建一個名為week6的子目錄
cd week6//進入子目錄week6
3.1.3使用vi創建C程序文件
vi process.c//創建一個名為process.c的c文件并進入
3.1.4按i
進入編輯模式,輸入以下代碼:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {printf("=== 系統調用演示程序 ===\n");printf("主進程PID: %d\n", getpid());// 1. fork()示例pid_t pid = fork();if (pid < 0) {perror("fork失敗");return 1;}if (pid == 0) {// 子進程代碼塊printf("\n子進程運行中 (PID: %d)\n", getpid());// 2. exec()示例 - 執行ls命令printf("準備執行ls命令...\n");execl("/bin/ls", "ls", "-l", NULL);// 如果exec執行成功,以下代碼不會運行perror("exec失敗");return 1;} else {// 父進程代碼塊printf("\n父進程 (PID: %d) 創建了子進程 (PID: %d)\n", getpid(), pid);// 3. wait()示例printf("父進程等待子進程結束...\n");int status;wait(&status);if (WIFEXITED(status)) {printf("\n子進程退出狀態: %d\n", WEXITSTATUS(status));}}printf("程序執行結束\n");return 0;
}
按ESC鍵退出編輯模式,輸入:wq
保存并退出vi。
3.1.5使用gcc編譯和運行程序
gcc process.c -o week6//prcess.c為創建的c文件名稱 week6為之前創建的子目錄名稱
./week6
運行結果如下:
3.2在各小組的樹莓派中,也手動創建組員的賬號,組員在各自的賬號+home目錄下,完成同樣的Linux系統調用函數練習。
3.2.1登錄樹莓派,打開端口進行賬號密碼的創建
創建組
sudo groupadd team//team為組的名稱
創建賬號
sudo useradd -m -G team -s /bin/bash maxy//maxy為創建的用戶名稱
設置對應賬戶的密碼
echo "member1:password1"//member1為設置密碼的用戶名稱 password1為要設置的密碼
3.2.2登錄對應賬號后進行編輯程序然后運行
登錄賬號
ssh member1@樹莓派IP地址
# 輸入密碼password1
創建子目錄
mkdir test//創建子目錄 test為創建子目錄的名稱
cd test//登錄子目錄
編輯程序代碼
nano week6.c//week6.c為文件的名稱
輸入代碼
// process_demo.c
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>int main() {printf("[%d] Parent process starts\n", getpid());pid_t pid = fork();if (pid < 0) {perror("Fork failed");return 1;} else if (pid == 0) {printf("[%d] Child process running\n", getpid());execl("/bin/ls", "ls", "-l", NULL);perror("Exec failed");return 1;} else {printf("[%d] Parent waiting for child %d\n", getpid(), pid);int status;wait(&status);if (WIFEXITED(status)) {printf("[%d] Child exited with status %d\n", getpid(), WEXITSTATUS(status));}}printf("[%d] Process ends\n", getpid());return 0;
}
編譯程序
gcc -Wall -Wextra week6.c -o test//week6.c為程序代碼的文件名稱 test為前面創建的子目錄
運行程序
./test//./為運行 test為運行文件的子目錄
運行成功