首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現進程控制塊(PCB)管理:創建、撤銷、狀態轉換

     編輯:C 語言問答

操作系統課程設計:PCB 模擬實現

用 C 語言模擬進程控制塊管理,包含創建、撤銷、阻塞、喚醒、掛起、激活、狀態查看、優先級修改等功能。

PCB 結構設計


#define MAX_PROCESSES 10

typedef struct {
    int pid;        // 進程標識
    int priority;   // 優先數
    int state;      // 狀態: 1就緒靜止 2阻塞靜止 3就緒活動 4阻塞活動 5運行
} PCB;

PCB pcbTable[MAX_PROCESSES + 1];  // 1-based 索引
int processCount = 0;

核心功能實現

進程創建


void createProcess() {
    int pid, pri;
    printf("輸入進程 PID: "); scanf("%d", &pid);
    // 檢查 PID 唯一性
    for (int i = 1; i <= processCount; i++)
        if (pcbTable[i].pid == pid) { printf("PID 已存在!\n"); return; }
    
    printf("輸入優先數: "); scanf("%d", &pri);
    processCount++;
    pcbTable[processCount].pid = pid;
    pcbTable[processCount].priority = pri;
    pcbTable[processCount].state = 1;  // 默認就緒靜止
    printf("進程創建成功!\n");
}

進程撤銷


void destroyProcess() {
    int pid;
    printf("輸入要撤銷的 PID: "); scanf("%d", &pid);
    for (int i = 1; i <= processCount; i++) {
        if (pcbTable[i].pid == pid) {
            // 移動後續元素前移
            for (int j = i; j < processCount; j++)
                pcbTable[j] = pcbTable[j + 1];
            processCount--;
            printf("進程撤銷成功!\n");
            return;
        }
    }
    printf("未找到該 PID!\n");
}

狀態轉換


void changeState(int newState) {
    int pid;
    printf("輸入 PID: "); scanf("%d", &pid);
    for (int i = 1; i <= processCount; i++) {
        if (pcbTable[i].pid == pid) {
            pcbTable[i].state = newState;
            printf("狀態已更新!\n");
            return;
        }
    }
    printf("未找到該 PID!\n");
}

// 封裝具體操作
void block() { changeState(4); }      // 阻塞→活動阻塞
void wakeup() { changeState(1); }     // 喚醒→就緒靜止
void suspend() { changeState(2); }    // 掛起→靜止阻塞
void activate() { changeState(3); }   // 激活→就緒活動

顯示所有 PCB


void displayAll() {
    printf("\n%-5s %-10s %-10s %-15s\n", "索引", "PID", "優先數", "狀態");
    const char* states[] = {"", "就緒靜止", "靜止阻塞", "就緒活動", "活動阻塞", "運行"};
    for (int i = 1; i <= processCount; i++) {
        printf("%-5d %-10d %-10d %-15s\n", 
               i, pcbTable[i].pid, pcbTable[i].priority, states[pcbTable[i].state]);
    }
}

主選單驅動


int main() {
    int choice;
    while (1) {
        printf("\n=== PCB 管理系統 ===\n");
        printf("1.創建進程  2.撤銷進程  3.阻塞  4.喚醒\n");
        printf("5.掛起      6.激活      7.顯示  8.修改狀態\n");
        printf("9.修改優先數 0.退出\n選擇: ");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1: createProcess(); break;
            case 2: destroyProcess(); break;
            case 3: block(); break;
            case 4: wakeup(); break;
            case 5: suspend(); break;
            case 6: activate(); break;
            case 7: displayAll(); break;
            case 8: changeState(0); break; // 手動輸入狀態
            case 9: /* 修改優先數 */ break;
            case 0: return 0;
            default: printf("無效選擇!\n");
        }
    }
}

教學重點

  • 結構體數組模擬 PCB 表,1-based 索引便於教學理解
  • 狀態機設計:5 種狀態轉換規則
  • 線性查找 PID,小規模數據足夠;大規模可改哈希/樹
  • 撤銷時數組元素前移維持連續性
  • 菜單驅動模式分離業務邏輯與交互
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved