编写程序实现PCB的链式存储结构,完成以下功能:创建带头结点的PCB链表,创建就绪状态的PCB并加入链表,删除指定的PCB,显示链表中的PCB信息
时间: 2024-10-17 08:11:36 浏览: 13
操作系统实验报告- 进程状态转换及其PCB的变化
5星 · 资源好评率100%
在计算机系统中,进程控制块(Process Control Block, PCB)通常用于表示一个进程的状态和资源信息。要实现PCB的链式存储结构,我们可以采用以下几个步骤:
1. **创建带头结点的PCB链表**:
首先,需要创建一个`PCBNode`结构体,包含进程ID、优先级、状态等字段,并定义一个`PCBList`头节点,它指向链表的第一个实际PCB节点。
```c
typedef struct PCBNode {
int pid; // 进程ID
int priority;
enum { RUNNABLE, BLOCKED } state;
struct PCBNode *next;
} PCBNode;
typedef PCBNode* PCBList;
```
2. **创建就绪状态的PCB并加入链表**:
- 创建一个新的`PCBNode`实例,设置其状态为`RUNNABLE`(就绪状态)。
- 将新节点添加到链表的头部,如果链表为空,则直接将新节点作为头结点,否则通过`next`指针连接。
```c
void createReadyPCB(PCBList &list, int pid, int priority) {
PCBNode *newPcb = (PCBNode*)malloc(sizeof(PCBNode));
newPcb->pid = pid;
newPcb->priority = priority;
newPcb->state = RUNNABLE;
newPcb->next = list;
list = newPcb;
}
```
3. **删除指定的PCB**:
- 需要遍历链表找到目标节点,将其`next`指针跳过,然后释放其内存空间。
```c
void deletePCB(PCBList *list, int pid) {
for (PCBNode *current = list; current != NULL; current = current->next) {
if (current->pid == pid) {
PCBNode *temp = current;
current = current->next;
free(temp);
return;
}
}
printf("Error: PCB not found.\n");
}
```
4. **显示链表中的PCB信息**:
- 再次遍历链表,打印每个节点的进程ID、优先级和状态。
```c
void displayPCBList(PCBList list) {
PCBNode *current = list;
while (current != NULL) {
printf("PID: %d, Priority: %d, State: %s\n", current->pid, current->priority, current->state == RUNNABLE ? "Runnable" : "Blocked");
current = current->next;
}
}
```
阅读全文