|
发表于 2024-12-16 14:48:50
|
显示全部楼层
下面是扩展后的C语言代码示例,加入了就绪队列的概念,并在创建两个具体的计算进程时进行了操作:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_PROCESSES 20
- struct Process {
- int pid;
- int priority;
- int size;
- int status; // 0 - 不在内存, 1 - 在内存, 2 - 阻塞
- char info[256];
- };
- struct Process processTable[MAX_PROCESSES];
- int readyQueue[MAX_PROCESSES];
- int count = 0; // 当前进程数量
- int blockCount = 0; // 阻塞进程数量
- int readyCount = 0; // 就绪进程数量
- void addToReadyQueue(int pid) {
- if (readyCount < MAX_PROCESSES) {
- readyQueue[readyCount++] = pid;
- printf("进程%d已加入就绪队列\n", pid);
- } else {
- printf("就绪队列已满\n");
- }
- }
- int createProcess(int pid, int priority, int size, const char *info) {
- if (count >= MAX_PROCESSES) {
- printf("内存已满, 请先唤醒或杀死进程\n");
- return -1;
- }
- for (int i = 0; i < count; i++) {
- if (processTable[i].pid == pid) {
- printf("该进程已存在\n");
- return -1;
- }
- }
- struct Process newProcess;
- newProcess.pid = pid;
- newProcess.priority = priority;
- newProcess.size = size;
- strcpy(newProcess.info, info);
- newProcess.status = 1;
- processTable[count++] = newProcess;
- addToReadyQueue(pid);
- return 0;
- }
- void displayRunningProcesses() {
- int flag = 0;
- for (int i = 0; i < count; i++) {
- if (processTable[i].status == 1) {
- printf("pid = %d\t", processTable[i].pid);
- printf("priority = %d\t", processTable[i].priority);
- printf("size = %d\t", processTable[i].size);
- printf("status = %d\t", processTable[i].status);
- printf("info = %s\n", processTable[i].info);
- flag = 1;
- }
- }
- if (!flag) {
- printf("当前没有运行进程\n");
- }
- }
- void blockProcess() {
- if (count == 0) {
- printf("当前没有运行进程\n");
- return;
- }
- int pid;
- printf("输入要阻塞进程的pid值\n");
- scanf("%d", &pid);
- for (int i = 0; i < count; i++) {
- if (processTable[i].pid == pid) {
- if (processTable[i].status == 1) {
- processTable[i].status = 2;
- blockCount++;
- printf("已经成功阻塞该进程\n");
- return;
- } else if (processTable[i].status == 0) {
- printf("要阻塞的进程不存在\n");
- return;
- } else {
- printf("该进程已被阻塞\n");
- return;
- }
- }
- }
- printf("要阻塞的进程不存在\n");
- }
- void killProcess() {
- if (count == 0) {
- printf("当前没有运行进程\n");
- return;
- }
- int pid;
- printf("输入要杀死进程的pid值:\n");
- scanf("%d", &pid);
- for (int i = 0; i < count; i++) {
- if (processTable[i].pid == pid) {
- if (processTable[i].status != 0) {
- processTable[i].status = 0;
- printf("已成功杀死该进程\n");
- return;
- } else {
- printf("要杀死的进程不存在\n");
- return;
- }
- }
- }
- printf("要杀死的进程不存在\n");
- }
- void notifyProcess() {
- if (count == 0) {
- printf("当前没有运行进程\n");
- return;
- }
- if (blockCount == 0) {
- printf("当前没有阻塞进程\n");
- return;
- }
- int pid;
- printf("输入要唤醒的进程的pid:\n");
- scanf("%d", &pid);
- for (int i = 0; i < count; i++) {
- if (processTable[i].pid == pid) {
- if (processTable[i].status == 2) {
- processTable[i].status = 1;
- blockCount--;
- printf("已经成功唤醒进程\n");
- addToReadyQueue(pid);
- return;
- } else if (processTable[i].status == 0) {
- printf("要唤醒的进程不存在\n");
- return;
- } else {
- printf("该进程未被阻塞\n");
- return;
- }
- }
- }
- printf("要唤醒的进程不存在\n");
- }
- void error() {
- printf("输入有误!!!请重新输入功能编号\n");
- }
- int main() {
- int running = 1;
- // 创建两个进程来计算(3+2)-(5+2)
- createProcess(1, 1, 10, "Task: (3+2)");
- createProcess(2, 1, 10, "Task: (5+2)");
- while (running) {
- printf("\n***********************************************************\n");
- printf("* 进程演示系统 *\n");
- printf("***********************************************************\n");
- printf("* 1. 创建新的进程 2. 查看运行进程 *\n");
- printf("* 3. 阻塞某个进程 4. 杀死运行进程 *\n");
- printf("* 5. 唤醒某个进程 6. 退出系统 *\n");
- printf("************************************************************\n");
- printf("请选择 (1~6)\n");
- int choice;
- scanf("%d", &choice);
- switch (choice) {
- case 1: {
- int pid, priority, size;
- char info[256];
- printf("请输入进程pid:\n");
- scanf("%d", &pid);
- printf("请输入进程优先级:\n");
- scanf("%d", &priority);
- printf("请输入进程大小:\n");
- scanf("%d", &size);
- printf("请输入进程内容:\n");
- scanf("%s", info);
- createProcess(pid, priority, size, info);
- break;
- }
- case 2:
- displayRunningProcesses();
- break;
- case 3:
- blockProcess();
- break;
- case 4:
- killProcess();
- break;
- case 5:
- notifyProcess();
- break;
- case 6:
- running = 0;
- break;
- default:
- error();
- }
- }
- return 0;
- }
复制代码
**代码说明:**
1. **数据结构**: 使用`struct Process`来表示进程,包含`pid`、`priority`、`size`、`status`和`info`等属性。`processTable`用于存储进程列表。
2. **就绪队列**: 通过`readyQueue`数组来管理就绪状态的进程。
3. **进程管理**:
- `createProcess`:用于创建进程,并将其添加到就绪队列。
- `addToReadyQueue`:将进程ID加入到就绪队列。
- `blockProcess`、`killProcess`、`notifyProcess`:用于阻塞、杀死和唤醒进程。
4. **示例计算进程**: 在`main`函数中,创建两个进程用于特定计算任务,以示例(3+2)和(5+2)计算。
确保在编译和运行时能正确输入数据类型及格式以避免错误。这是一个简单的多进程管理模拟示例,适合演示如何使用数据结构来管理进程和就绪队列。请根据具体需求进行更深入的修改和扩展。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|