用 C 語言模擬進程控制塊管理,包含創建、撤銷、阻塞、喚醒、掛起、激活、狀態查看、優先級修改等功能。
#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); } // 激活→就緒活動
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");
}
}
}