操作系统实验——进程控制

article/2025/10/29 3:38:19

操作系统实验——进程控制

预习内容:

1.进程的概念
⑴程序的并发执行
⑵进程的定义
2.进程的描述
⑴进程控制块
⑵进程上下文
⑶进程上下文切换
⑷进程空间与大小
3. 进程状态及其转换
⑴进程状态
⑵进程状态转换
4.进程控制
⑴进程创建与撤销
⑵进程的阻塞与唤醒

实验目的与要求(及主要实验仪器、设备):

1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、 掌握进程的创建、睡眠、撤销等进程控制方法
要求:
(1)一台Windows7以上版本操作系统的计算机。
(2)计算机装有Microsoft Visual Studio专业版或企业版。

实验原理(方法与与原理分析):

进程的创建:
1.为新进程分配唯一的进程标识符,并从PCB队列中申请一个空闲的PCB;
2.为新进程分配必要的内存空间和其它各种资源;
3.初始化PCB中的相应信息,如标识信息、CPU信息、进程控制信息;
4.若条件许可,将新进程的PCB插入到就绪队列中;

实验步骤(程序代码与实验过程):

步骤1:登录进入Windows,启动VC++。
步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32ConsolApplication”,然后在“Projectname”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。
步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++SourceFile”,然后在“File”处输入C/C++源程序的文件名。
步骤4:将新创建的C/C++源程序中,编译成的可执行文件进行执行。
1.创建新进程代码:
void create()
{
if(num>=20) /判断是否有存储空间/
printf("\n 内存已满,请删除或挂起其他程序");
else{
for(i=0;i<20;i++)
if(neicun[i].state0) break; /按顺序在内存中寻找创建新进程的空间/
printf("\n 请输入新建进程的 pid 值\n");
scanf("%d",&neicun[i].pid);
for(j=0;j<i;j++) /判断是否之前已存储相同 pid 进程/
if(neicun[j].pid
neicun[i].pid)
{ printf("\n 该进程已存在于内存中");
return;
}
printf("\n 请输入新进程的优先级 \n" );
scanf("%d",&neicun[i].youxianji);
printf("\n 请输入新进程的大小\n" );
scanf("%d",&neicun[i].daxiao);
printf("\n 请输入新进程的内容\n" );
scanf("%s",&neicun[i].neirong);
neicun[i].state=1; /将进程状态设为 1,表示在内存中/
num++;/内存中进程数目加一/
}
}
2.查看进程代码:
void run()
{ bj=0;
for(i=0;i<20;i++)
if(neicun[i].state1) /若进程状态设为 1,表示在内存中,输出查看/
{printf("\n pid=%d",neicun[i].pid);
printf(" youxianji=%d",neicun[i].youxianji);
printf(" daxiao=%d",neicun[i].daxiao);
printf(" neirong=%s",neicun[i].neirong);
bj=1;/*存在于内存中的进程标记为 1 */
}
if(bj
0)
printf("\n 当前没有运行该进程\n" );/标记为 0,表示该进程未创建于内存中/
}

3.换出进程代码
void huanchu()
{if(num0) /num=0,表示内存中无进程/
{ printf("\n 当前没有运行的进程\n" );
return;
}
printf("\n 请输入要换出的进程的 pid 值\n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pid
neicun[i].pid)
{ if(neicun[i].state1)
{neicun[i].state=2; /将该进程的状态设为挂起/
guaqi++;
printf("\n 该进程已成功挂起换出\n" );
}
else if(neicun[i].state
0)
printf("\n 要换出的进程不存在\n" );
else printf("\n 要换出的进程已经被挂起\n" );
bj=1;break;
}
}
if(bj0) printf("\n 要换出的进程不存在\n" );
}
4.杀死进程代码
void kill()
{
if(num
0)
{ printf("\n 当前没有运行的进程\n" );
return;
}
printf("\n 请输入要杀死的进程的 pid 值\n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pidneicun[i].pid)
{ if(neicun[i].state
1)
{neicun[i].state=0; /将该进程的状态设为不在内存中/
num–; /内存中的进程数目减少一个/
printf("\n 该进程已成功杀死\n" );
}
else if(neicun[i].state0)
printf("\n 要杀死的进程不存在\n" );
else printf("\n 要杀死的进程已经被挂起\n" );/剩余状态为 2,挂起/
bj=1;break;
}
}
if(bj
0) printf("\n 要杀死的进程不存在\n" );
}
5.唤醒进程代码
void huanxing()
{
if(num0)
{ printf(“当前没有运行的进程\n”);
return;
}
if(guaqi
0) /guaqi=0,表示没有挂起的进程/
{ printf("\n 当前没有换出的进程\n");
return;
}
printf("\n 请输入要唤醒的进程的 pid 值:\n");
scanf("%d",&pid);
for(i=0;i<20;i++){
if(pidneicun[i].pid)
{
if(neicun[i].state
2)
{neicun[i].state=1; /将该进程的状态设为挂起/
guaqi–;
num++;
printf("\n 该进程已成功唤醒\n" );
}
else if(neicun[i].state==0)
printf("\n 要唤醒的进程不存在\n" );
else printf("\n 要唤醒的进程已经在内存中\n" );
}
}
}

实验结果(数据分析与结论):

1.通过代码实现进程的创建和对是否有存储空间的判断,在有存储空间的情况下新建进程pid值,并且对之前是否存储相同pid值进行判断,在确定没有相同的pid进程的情况下输入进程的优先级,并且修改新建进程状态内存空间减少,之后结束;如果在有存储空间或者有相同的pid进程的情况下直接进行结束。
2.执行查看的代码后通过查看当前运行进程来判断循环判断内存中进程状态是否为1,是的情况下输出当前进程状态后结束,如果内存中状态不为1则直接结束。
3.创建进程
在这里插入图片描述

4.查看当前运行进程
在这里插入图片描述

5.换出进程
在这里插入图片描述

在这里插入图片描述

6.杀死进程
在这里插入图片描述
在这里插入图片描述

7.唤醒进程
在这里插入图片描述

问题讨论:

问:在什么情况下会导致进程被撤销?
答:
(1)该进程已完成所要求的功能而正常终止;
(2)由于某种错误导致非正常终止;
(3)祖先进程要求撤销某个子进程。


http://chatgpt.dhexx.cn/article/lgpdQWyb.shtml

相关文章

操作系统实验一

操作系统实验一 进程调度算法 一、实验目的 1.理解操作系统进程管理中进行进程调度的过程和调度算法的思想原理&#xff1b; 创建进程控制块PCB&#xff0c;并合理组织就绪队列。 2.理解进程的状态及变化&#xff0c;动态显示每个进程的当前状态及进程的调度情况。 掌握几…

操作系统实验一·创建进程

创建进程 1实验目的2实验内容&#xff1a;2.1Windows实现2.2Linux实现 3实验环境3.1Windows3.2Linux虚拟机 4程序设计和实现4.1Windows实现4.1.1函数解释4.1.2程序代码4.1.3运行结果 4.2Linux实现4.2.1函数解释4.2.2程序代码4.2.3运行结果 Use system calls to implement a “m…

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c&#xff0c;该程序可接收并解释以下命令&#xff1a; (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束&#xff0c;退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容&#xff08;实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码&#xff09;四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下&#xff1a; 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想&#xff0c;并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…

操作系统实验(进程调度)

操作系统实验&#xff08;进程调度&#xff09; 一、实验目的二、实验内容三、实验准备3.1优先权算法3.2时间片轮转调度算法 四、实验 一、实验目的 1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。 二、实验内容 2.1…

【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误

【MFC】CCriticalSection类在Release编译下调用Lock函数会报错0xC0000008 问题描述方法一 CRITICAL_SECTION代替CCriticalSection方法二 使用WaitForSingleObject和ReleaseMutex()结语 问题描述 通过以下伪代码方式描述问题&#xff1a; 主对话框类内创建成员变量及结构体变量…

联合使用类CCriticalSection和类CSingleLock同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest2&#xff0c;并在向导的“应用程序设置”中勾选“MFC”。 &#xff08;2&#xff09;打开SellTicketTest2.cpp&#xff0c;在开头中引入头文件。 #include "afxmt.h"&#xff08;3&#xff09;添加变量&…

单独使用CCriticalSection对象来同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest&#xff0c;并在向导的“应用程序设置”中勾选“MFC”&#xff0c;因为CCriticalSection属于MFC类&#xff0c;如图所示。 &#xff08;2&#xff09;在SellTicketTest.cpp开头中引入头文件。 #include "afx…

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁&#xff0c;死锁的原因&#xff0c;如何避免 apanying902019-01-09 c3p0连接死锁 Cain_1507662016-09-20 notify产生死锁的场景(备忘) liuchuanyangyan9132017-02-23 C3P0配置错误导致的…

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时&#xff0c;可以使用临界区对象。临界区对象是一个独占性共享资源&#xff0c;任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段&#xff0c;其他希望进入临界区的线程将被挂起等待&#xff0c;直到拥有临界区的线…

CCriticalSection与CSingleLock

CCriticalSection An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be …

关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”&#xff0c;它是一个用于同步的对象&#xff0c;同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如&#xff0c;在链表中添加一个结点就仅仅同意一次一个线程进行…

模拟售票大厅实例——多线程时访问共享变量时的安全(CMutex或CCriticalSection的应用)

当程序运行时&#xff0c;可以通过多线程来提高程序运行的效率和拥有更好的体验。但多线程&#xff08;或多进程&#xff09;同时也带来很多的问题&#xff1a;最严重的莫过于对同一个对象或变量访问时&#xff0c;由于线程运行异步的原因&#xff0c;会造成程序运行出现无法控…

在MFC下面实际演示CCriticalSection 的使用

Q&#xff1a;CCriticalSection是什么&#xff1f; A&#xff1a;CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。 参考资料&#xff1a; http://blog.csdn.net/akof1314/article/details/5773076 http://www.cnblogs.com/hlxs/archi…

Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 一:AlterDialog对话框 二:普通对话框 运行效果…

Android对话框显示输入框

在弹出的对话框显示输入框有两种方法&#xff1a; 法一&#xff1a;新建一个布局&#xff0c;并在对话框中引用它。 法二&#xff1a;直接在Activity中定义Edit并在对话框中用getText方法得到输入信息。

Android对话框的使用

Android对话框的使用 对话框&#xff08;Dialog&#xff09;是Android系统在Activity或者其他组件运行过程中提供的一种提示机制。它可以帮助应用完成一些必要的提示功能&#xff0c;同时提供一些与用户交互的功能。 对话框分为很多种&#xff0c;下面将一一介绍…

android 自定义对话框

// 基础库 implementation com.github.goweii.AnyLayer:anylayer:2.5.0 // 通用弹窗&#xff08;依赖基础库&#xff09; implementation com.github.goweii.AnyLayer:anylayer-common:2.5.0 编写dialog_layout 布局 <?xml version"1.0" encoding"utf-8&qu…

Android对话框的使用总结

一&#xff0e;相关概念 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能. Android API 支持下列类型的对话框对象: &#xff08;一&#x…