实验二:《操作系统》之进程控制

“小忙”解释一下,三天没更博 是因为有事情在忙,据Keep APP不完整计程 + 不完整计时,三天骑行一百多公里,第一次觉得骑车真的太累了……
不过我又回来啦 今日份继续更博咯,开启正文叭!

Part2. 进程控制

往期回顾:
Part0. 实验环境
Part1-1.熟悉UKylin环境
Part1-2.熟悉UKylin环境

一、实验目的

  1. 掌握进程的概念,进一步理解进程和程序的区别。
  2. 认识和了解并发执行的实质。
  3. 掌握fork()、wait()、exit()函数。

二、实验内容

  1. 运行下面程序,查看程序运行结果,了解并掌握fork()函数调用的结果。
#include<stdio.h>
#include<unistd.h>
int main()
{
   
	int pid;
	
	pid = fork();
	if(pid < 0)
		printf("返回值为:pid = %d. Failed to create process. \n",pid);
	else if(pid == 0)
		printf("返回值为:pid = %d. I'm the child process. My Process ID is:%d. \n", pid, getpid());
	else 
	{
   
		wait(0);
		printf("返回值为:pid = %d. I'm the parent process. My Process ID is:%d. \n", pid, getpid());
	}
	
	return 0;
}

运行结果:
在这里插入图片描述
分析:fork()函数创建一个子进程,该子进程复制父进程的PCB。当返回值为0时代表子进程,当返回值是大于0是代表父进程,返回值为负数时表示创建进程失败。上述代码创建进程的父进程的进程号为5252,子进程的进程号为5253。

fork( )
功能:创建一个新的子进程。其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录和资源限制。
系统调用格式:
int fork()
如果fork调用成功则在父进程会返回新建立的子进程标识符(PID),而在新建立的子进程中则返回0。如果fork失败则直接返回-1。

修改后代码:

#include<stdio.h>
#include<unistd.h>   //fork()  getpid()
#include<stdlib.h>   //exit()
#include<sys/wait.h> //wait()
int main()
{
   
	int pid;
	
	pid = fork();
	if(pid < 0)
		printf("返回值为:pid = %d. Failed to create process. \n",pid);
	else if(pid == 0)
	{
   
		printf("返回值为:pid = %d. I'm the child process. My Process ID is:%d. \n", pid, getpid());
		exit(0);
	}
	else
	{
    
		wait(0);
		printf("返回值为:pid = %d. I'm the parent process. My Process ID is:%d. \n", pid, getpid());
	}
	return 0;
}

分析:调用了wait函数和exit函数,父进程等待子进程执行完再执行。

1、wait()
等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回。
2、exit()
终止进程的执行。通常父进程在创建子进程时,应在进程的末尾安排一条exit( )语句,使子进程自我终止。exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。
如果调用进程在执行exit( )时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。操作系统须为exit( )完成以下操作:
(1)关闭软中断
(2)回收资源
(3)写记帐信息
(4)置进程为“僵死状态”

1.进程的创建
编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“f”,两个子进程分别显示字符“s” 和“d”。多次运行可执行程序,观察记录屏幕上的显示结果,并分析原因。画出进程树的结构图。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
int main()
{
   
	int p1,p2;
	while((p1 = fork()) == -1);   // 创建成功为止
	if(p1 == 0)	                  //如果是子进程
	{
   
		putchar('s')
  • 28
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验目的: 1. 理解进程的概念与特点; 2. 掌握进程创建、撤销和阻塞唤醒的实现方法; 3. 掌握进程调度算法的实现; 4. 掌握进程同步与互斥的实现方法。 实验内容: 1. 进程控制块(PCB)的定义 进程控制块是操作系统中的一种数据结构,用于描述进程的基本信息和运行状态。它包含了进程的标识符、程序计数器、寄存器、内存分配情况、打开文件列表、进程优先级、进程状态等信息。PCB 是操作系统内核的重要组成部分,是操作系统实现进程管理和调度的关键数据结构。 2. 进程的创建、撤销和阻塞唤醒 进程的创建是指在操作系统中新建一个进程并为其分配资源的过程。进程的撤销是指终止一个正在运行的进程并回收其占用的资源。进程的阻塞是指在执行过程中暂停进程的执行,等待某种条件满足后再继续执行。进程的唤醒是指在进程阻塞期间,当等待的条件满足后,操作系统会将进程重新唤醒并恢复其执行。 3. 进程调度算法 进程调度算法是指操作系统中用于决定哪个进程能够占用 CPU 资源的算法。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度等。 4. 进程同步与互斥 进程同步与互斥是指在多进程环境下,为了保证进程之间的合作和协调,需要采用一些机制来保证进程之间的正确性和互不干扰。常用的进程同步与互斥方法有信号量、互斥锁、条件变量等。 实验要求: 1. 完成进程的创建、撤销和阻塞唤醒的实现; 2. 实现先来先服务(FCFS)和时间片轮转(RR)两种进程调度算法; 3. 实现基于信号量的进程同步与互斥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值