操作系统原理-模拟进程创建、终止、阻塞、唤醒原语——沐雨先生

本文详细介绍了如何使用C++实现一个简单的操作系统模拟器,涉及进程创建、阻塞、唤醒和终止功能,通过PCB数据结构和菜单驱动的用户交互,展示了操作系统中进程控制的核心概念和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验题目: 模拟进程创建、终止、阻塞、唤醒原语

二、实验目的: 通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。

三、实验环境:

1、硬件:PC机及其兼容机。

2、软件:Windows OS,MS—DOS OS,Turbo C 或 C++、VC++等。

四、实验内容:

1、设计创建、终止、阻塞、唤醒原语功能函数。

2、设计主函数,采用菜单结构(参见后面给出的流程图)。

3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息 显示在屏幕上,以供随时查看各队列中进程的变化情况。

五、算法流程图:

在这里插入图片描述

六、程序清单:

#include<stdio.h>
#include<string.h>
#include<windows.h>
int count=0;//记录进程数目

typedef struct PCB{
   
	char pname[10];//进程名
	int ppri;//优先级 1-低,2-中,3-高
	int pruntime;//运行时间
	int pstatus;//运行状态 1-阻塞,2运行,3就绪
	struct PCB *next;//指针,指向下一个PCB
}PCB;

void menu(){
   
	printf("---------OS实验一:模拟进程创建、阻塞、唤醒、终止原语---------\n");
	printf("----------------------------0.退出----------------------------\n");
	printf("----------------------------1.创建----------------------------\n");
	printf("----------------------------2.阻塞----------------------------\n");
	printf("----------------------------3.唤醒----------------------------\n");
	printf("----------------------------4.终止----------------------------\n");
	printf("----------------------------5.显示----------------------------\n");
	printf("---------------------请输入您需要的功能(0-5)------------------\n");
	printf("--------------------------------------------------------------\n");
	printf("各功能简要说明:\n");
	printf("创建:在本实验中,该功能仅实现建立 PCB,初始化 PCB,并将该 PCB放入就绪队列中。\n");
	printf("阻塞:在本实验中,实现的功能为,根据用户输入的进程名称查看该进程是否处在运行状态,若处在运行状态,修改该进程PCB的状态,并将该进程转入阻塞队列;若该进程处在其它状态,则给出相应的提示信息;若该进程不存在,也需要给出相应的提示信息。\n");
	printf("唤醒:功能类似阻塞功能,注意:若阻塞队列为空,则不能执行唤醒功能。\n");
	printf("终止:根据用户输入要结束的进程名称,从就绪队列、阻塞队列和正在运行的进程中找到相应的进程 PCB,并将该 PCB 从相应队列中删除。若该进程不存在,需要给出提示。\n");
	printf("显示:将就绪队列、阻塞队列中的进程列表和正在运行的进程显示出来。\n");
}


void run(PCB *head2,PCB *head3){
   //从就绪队列中选队首进程运行,保证有一个进程处于运行状态
	PCB *p=head3->next;
	if(p){
   
		head2->next=p;
		p->pstatus=2;
		head3->next=p->next;
		free(p);
	}
}


void insert(PCB *head3,PCB *temp){
   //将新创建的进程插入就绪队列
	PCB *p;
	p=head3;
	while(p->next!=NULL)//找尾结点
		p=p->next;
	p->next=temp;
	temp->next=NULL;
}


int check(PCB *head,PCB *temp){
   //检查temp进程与已有进程是否重复
	PCB *p=head;
	while(p->next){
   
		p=p->next;
		if(strcmp(p->pname,temp->pname)==0)
			return 0;
	}
	return 1;
}


void Delete(PCB *head,PCB *temp){
   /*head为链表头结点,temp为将要删除的结点*/
	PCB *p=head,*q=temp->next;
	while(p)//寻找temp的上一个节点
		if(p->next==temp){
   
			p->next=q;
			free(temp);
			return;
		}
		else
			p=p->next;
}


void create(PCB *head1,PCB *head2
在Python中,虽然不像系统级编程那样直接操作进程,但我们可以借助`multiprocessing`模块来模拟进程的一些基本特性。`multiprocessing`库提供了`Process`类来创建进程,以及一些同步工具如`Queue`, `Semaphore`等来实现进程间的通信、阻塞和唤醒。 1. **创建进程**:你可以通过实例化`Process`类,并传入一个函数作为目标,然后调用`start()`方法启动进程。例如: ```python import multiprocessing def worker(): # 进程工作内容 print('Worker process started') p = multiprocessing.Process(target=worker) p.start() ``` 2. **终止进程**:可以使用`join()`方法让主线程等待子进程结束,也可以设置`daemon=True`使其成为守护进程,在主线程退出时自动关闭。终止一个运行中的进程通常不直接可用,因为这依赖于操作系统信号处理。 3. **阻塞与唤醒**:通过`multiprocessing.Queue`或`Semaphore`可以实现进程间的消息传递,比如生产者消费者模型,一个进程往队列写数据,另一个进程从队列读取。`Queue.get(block=True)`会让进程阻塞直到有数据可用,`Semaphore.acquire(blocking)`则允许你在资源有限的情况下控制进程的执行。 ```python from multiprocessing import Process, Queue q = Queue() def producer(q): q.put('Hello') q.put('World') def consumer(q): while True: data = q.get() # 阻塞直到有数据 if data is None: # 消费完后发送None表示停止 break print(f'Received: {data}') p = Process(target=producer, args=(q,)) c = Process(target=consumer, args=(q,)) p.start() c.start() # 当生产者结束后,向队列放入None,然后消费进程会自动退出 p.join() q.put(None) c.join() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨先生

如果真的帮助到你了再打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值