操作系统B2-上机实验-进程
上海大学操作系统(二)实验报告(全)

评分:SHANGHAI UNIVERSITY操作系统实验报告学院计算机工程与科学专业计算机科学与技术学号学生姓名《计算机操作系统》实验一报告实验一题目:操作系统的进程调度姓名:张佳慧学号 :12122544 实验日期: 2015.1实验环境: Microsoft Visual Studio实验目的:进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。
本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。
调度算法可任意选择或自行设计。
例如,简单轮转法和优先数法等。
本实习可加深对于进程调度和各种调度算法的理解。
实验内容:1、设计一个有n个进程工行的进程调度程序。
每个进程由一个进程控制块(PCB)表示。
进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。
2、调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。
3、系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程。
操作过程:1、本程序可选用优先数法或简单轮转法对五个进程进行调度。
每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。
为了便于处理,程序进程的运行时间以时间片为单位计算。
进程控制块结构如下:进程控制块结构如下:PCB进程标识数链指针优先数/轮转时间片数占用 CPU 时间片数进程所需时间片数进程状态进程控制块链结构如下:其中:RUN—当前运行进程指针;HEAD—进程就绪链链首指针;TAID—进程就绪链链尾指针。
2、算法与框图(1) 优先数法。
进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。
每过一个时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。
操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统实验报告_进程部分

西安邮电学院操作系统实验报告专业名称:软件工程班级:软件0701 学号:04075021 学生姓名:孟阿龙实验1 掌握Linux基本命令和开发环境1.掌握常用的Linux shell命令;掌握linux下的基本命令的用法。
ls,cat,mkdir,rm,touch,less,cp,mv,head,tail,sort,echo2. 掌握编辑环境VIM;学习vim的基本使用。
i,a:进入编辑模式v:进入可视模式esc;进入命令模式编辑模式下可以和正常的文本输入方式一样。
V进入可视模式可以使用y进行复制,d进行剪切,p进行粘贴。
esc进入命令模式可以w进行文件存盘,q退出vim,q!不保存而退出,u撤销。
3. 掌握编译环境gcc及跟踪调试工具gdbgcc编译文件的格式gcc -o 目标文件源文件gcc 源文件gcc -g -o 目标文件源文件gdb基本调试命令:l:列出当前文件b linenumber,在指定的行设置断点Info br 查看断点信息Info source 查看源码信息Info stack 查看堆栈信息Info args 查看当前的参数List function 列出某个函数disable/enable 使断点失效或有效delete 删除断点step 单步执行命令print a :打印出变量a的内容实验二进程一实验目的:通过观察分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握fork和kill系统调用的功能和使用。
二实验前准备:学习man 命令的用法,通过它查看fork 和kill 系统调用的在线帮助,并阅读参考资料学会fork 与kill 的用法。
复习C 语言的相关内容。
三实验内容:按照所给的残缺版代码读懂程序,然后回答问题。
(残缺版实验代码略)1.先猜想一下这个程序的运行结果。
假如运行“./process 20”,输出会是什么样?将会产生10个进程。
因为程序设定最大产生进程数为10。
操作系统实验报告

《操作系统》课程实验报告专业:软件工程班级:软件二班学号: 2220111350 姓名:韩培培序号: 14目录:实验一、进程的创建实验二、进程控制实验三、进程的管道通信实验四、消息通信实验五、进程调度实验六、FIFO页面调度实验七、LRU页面置换算法实验一进程的创建一.实验目的:进程的创建二.实验内容:编写一段程序,使用系统调用 FORK( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“A”子进程分别显示字符“B”和“C”。
试观察记录屏幕上的显示结果,并分析原因。
三.实验代码:#include <stdio.h>Main(){ int p1,p2;While((p1=fork())==-1);If (p1==0)Putchar(ˊbˊ);else{While((p2=fork())==-1);If(p2==0)Putchar(ˊcˊ);else putchar(ˊaˊ);}}四.实验运行结果五.分析原因程序首先调用Fork()函数创建一个子进程1.当创建进程不成功,循环创建进程,直至进程创建成功。
如果Fork()返回值为0,表示当前进程是子进程1,显示字符B。
如果Fork()返回值大于0,则表示当前进程是父进程,表示当前的程序代码是父进程所要执行的。
父进程调用Fork()创建子进程2。
当创建进程不成功时,循环创建进程直至成功。
如果Fork()返回值为0,则表示当前进程是子进程2,显示字符C。
如果Fork()返回值大于0,则表示当前进程是父进程,输出字符A。
实验二:进程控制一.实验目的:进程控制二.实验内容:修改已编写的程序,将每个进程的输出由单个字符改为一个字符串,再观察程序的执行时屏幕上出现的现象,并分析原因三.实验代码:# include<stdio.h>Main(){ int p1,p2,i;While((p1=fork())== -1);If (p1 == 0)For (i=0;i<500;i++)Printf("child %d/n",i);else{While((p2 =fork()) == -1);if(p2 == 0)for (i= 0;i<500;i++)printf("son%d\n",i)elsefor(i = 0;i<500;i++)printf("daughter%d\n",i);}}四.分析原因:由于函数Printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。
计算机操作系统实验二

计算机操作系统实验二一、实验目的本实验旨在通过实际操作,深入理解和掌握计算机操作系统中的进程与线程管理。
通过实验,我们将了解进程的创建、执行、阻塞、唤醒等状态以及线程的创建、同步、通信等操作。
同时,通过实验,我们将学习如何利用进程和线程提高程序的并发性和效率。
二、实验内容1、进程管理a.进程的创建与执行:通过编程语言(如C/C++)编写一个程序,创建一个新的进程并执行。
观察和记录进程的创建、执行过程。
b.进程的阻塞与唤醒:编写一个程序,使一个进程在执行过程中发生阻塞,并观察和记录阻塞状态。
然后,通过其他进程唤醒该进程,并观察和记录唤醒过程。
c.进程的状态转换:根据实际操作,理解和分析进程的状态转换(就绪状态、阻塞状态、执行状态)以及转换的条件和过程。
2、线程管理a.线程的创建与同步:编写一个多线程程序,创建多个线程并观察和记录线程的创建过程。
同时,使用同步机制(如互斥锁或信号量)实现线程间的同步操作。
b.线程的通信:通过消息队列或其他通信机制,实现多个线程间的通信。
观察和记录线程间的通信过程以及通信对程序执行的影响。
c.线程的状态转换:根据实际操作,理解和分析线程的状态转换(新建状态、就绪状态、阻塞状态、终止状态)以及转换的条件和过程。
三、实验步骤1、按照实验内容的要求,编写相应的程序代码。
2、编译并运行程序,观察程序的执行过程。
3、根据程序的输出和实际操作情况,分析和理解进程与线程的状态转换以及进程与线程管理的相关原理。
4、修改程序代码,尝试不同的操作方式,观察程序执行结果的变化,进一步深入理解和掌握进程与线程管理。
5、完成实验报告,总结实验过程和结果,提出问题和建议。
四、实验总结通过本次实验,我们深入了解了计算机操作系统中的进程与线程管理原理和实践操作。
在实验过程中,我们不仅学习了如何利用编程语言实现进程和线程的操作,还通过实际操作观察和分析了进程与线程的状态转换以及进程与线程管理的基本原理。
操作系统上机实验报告

操作系统上机实验报告实验一进程的建立1.实验目的学会通过基本的Windows进程控制函数,由父进程创建子进程,并实现父子进程协同工作。
2.实验软硬件环境Dev-C++3.实验内容创建两个进程,让子进程读取一个文件,父进程等待子进程读取完文件后继续执行,实现进程协同工作。
进程协同工作就是协调好两个进程,使之安排好先后次序并以此执行,可以用等待函数来实现这一点。
当需要等待子进程运行结束时,可在父进程中调用等待函数。
4.实验程序及分析实验程序源代码如下:父进程:#include<stdio.h>#include<windows.h>int main(){STARTUPINFO si;PROCESS_INFORMA TION pi; //当Windows创建新进程时,将使用这两个结构体的有关成员。
所以在创建子进程之前应该对结构体进行声明和初始化。
ZeroMemory(&pi,sizeof(pi));ZeroMemory(&si,sizeof(si));si.cb=sizeof(STARTUPINFO);if(CreateProcess("lab1.2.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL ,NULL,&si,&pi))//创建一个新进程,若是成功,就返回1,进而实现if选择{printf("子进程已创建~\n");int i,sum=0;for(i=1;i<=100;++i){sum+=i;printf("sum=%d\n",sum);} //进行1+2+3+….+100计算WaitForSingleObject(pi.hProcess,INFINITE); FILE *fp;fp=fopen("date.txt","r");char ch=fgetc(fp); //创建文件并打开while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp); //关闭文件}elseprintf("子进程创建失败~\n");return 0;}子进程:#include<stdio.h>#include<stdlib.h>int main(){printf("子进程运行~\n");FILE *fp;if(fp=fopen("date.txt","w")){printf("已经创建文件!\n");int i;for(i=48;i<58;i++) fputc(i,fp);fputc('\n',fp);fclose(fp);printf("已经写入数据:"); //向文本中写入数据fp=fopen("date.txt","r");char ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp); //输出数据}fclose(fp);}else printf("创建文件失败!\n");system("pause");return 0;}5. 实验截图说明及分析6. 实验心得体会掌握了父进程创建子进程的方法,对操作系统多线程认识更深了。
进程操作实验报告

进程操作实验报告进程操作实验报告一、引言进程是计算机系统中最基本的概念之一,它代表了正在运行的程序。
在操作系统中,进程的管理和操作是非常重要的。
本实验旨在通过对进程操作的实践,加深对进程概念的理解,并掌握进程的创建、调度和终止等操作。
二、实验目的1. 理解进程的概念和基本属性;2. 掌握进程的创建和终止操作;3. 熟悉进程调度算法的实现;4. 加深对操作系统中进程管理的理解。
三、实验环境本次实验使用的操作系统为Linux,并且需要具备C语言编程基础。
四、实验内容1. 进程的创建进程的创建是操作系统中的一个重要操作。
通过调用fork()函数,可以在当前进程的基础上创建一个新的子进程。
子进程将继承父进程的资源,包括内存空间、文件描述符等。
通过实验,我们可以编写一个简单的程序,演示进程的创建过程,并观察子进程和父进程的行为差异。
2. 进程的调度进程调度是操作系统中的核心功能之一。
在多任务系统中,操作系统需要合理地分配CPU时间片,以便每个进程都能得到执行的机会。
常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。
通过实验,我们可以编写一个简单的程序,模拟进程的调度过程,并观察不同调度算法对进程执行顺序的影响。
3. 进程的终止进程的终止是操作系统中的另一个重要操作。
通过调用exit()函数,可以结束当前进程的执行,并释放相关资源。
在实验中,我们可以编写一个程序,演示进程的终止过程,并观察终止进程后系统的行为。
五、实验步骤1. 进程的创建实验步骤:(1)编写一个简单的程序,调用fork()函数创建子进程;(2)在父进程和子进程中分别输出不同的信息,以便观察其行为差异;(3)编译并运行程序,观察输出结果。
2. 进程的调度实验步骤:(1)编写一个简单的程序,模拟多个进程的执行;(2)使用不同的调度算法,如FCFS、SJF、RR等,对进程进行调度;(3)观察不同调度算法对进程执行顺序的影响,并比较它们的优缺点。
操作系统上机实验进程管理

文档编号:第 1 次上机实验操作系统上机实验报告进程管理实验人:学号:095090142011年4 月13 日1、实验目的1)掌握Linux环境下的C/C++编程方法2)加深对进程概念的理解,明确进程和程序的区别。
3)进一步认识进程并发执行的实质。
2、实验内容1)编写一段程序fc1.c,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
试观察记录屏幕上的显示结果,并分析原因。
2)编写一段程序fc2.c,使用系统调用fork( )创建一个子进程,该子进程再创建一个子进程,三者都各自以1秒为间隔循环打印各自的PID和其父进程的PID。
3)编写一段程序fc3.c,父进程A使用系统调用fork( ) 创建一个子进程B,该子进程再创建一个子进程C,每个进程一开始都打印各自的PID和其父进程的PID。
其中,A和B各自调用wait函数等待它们的子进程结束,C休眠10秒后结束。
3、实验笔记记录在完成该次实验作业的过程中,每次上机实验的时间和简要的实验过程,每次的实验过程应包括:该次上机完成的实验内容,编程思路,调试程序中遇到的问题,解决方法,遗留的问题等。
4、总结对本次实践进行简单总结(例如,问题,收获等)。
附录A:程序源代码:1)第1个程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>int main(){pid_t pid,pr;pid=fork();if(pid<0) printf(“error!”);else if(pid==0) printf(“child,b”);else {printf(“father,a”);pr=fork();if(pr==0) printf(“otherchild,c”);}return 0;}2)第2个程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>int main(){pid_t pid,pr;pid=fork();if(pid<0) printf(“error!”);else if(pid==0){while(1){printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid());sleep(1);}pr=fork();{if(pr==0)while(1){printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid();sleep(1);}}}else {while(1){printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid());sleep(1);}}return 0;}3)第3个程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>int main(){pid_t pid,pidd,pa,pb;pid=fork();if(pid==0){printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid());pb=wait(NULL);pidd=fork();{printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid());if(pidd==0)sleep(10);}}else { printf(“my pid is %d”,getpid());printf(“my parent’s pid is %d”,getppid());pa=wait(NULL);}return 0 ;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二Linux 进程实验
姓名:段叶叶班级:信息1302 学号:07131052
地点:东区实验室FF109
时间:2014年10月13日星期一
成绩:
一、实验内容
1.创建进程的系统调用fork();
2.创建进程的系统调用vfork();
3.执行新程序的系统调用exec();
4.等待进程结束的系统调用wait()或waitpid()。
前三题必做,最后一题选做。
二、实验目的
熟悉进程的系统调用。
三、实验环境
登陆Linux虚拟机,进入Linux shell,提示符为$,表示普通用户提示符。
四、实验题目
1. 【题目】:编写程序forkgrandchild.c,用来创建孙子进程。
【要求】:在读懂程序forktest.c的基础上,编写程序
forkgrandchild.c(forkgrandchild.c创建在用户名(如wm)目录下的process 目录下),所创建的程序forkgrandchild.c可实现创建孙子进程,并显示孙子进程的pid,其父进程的pid,forkgrandchild.c要求可读性好,用户界面友好。
【预备知识】:
1)Linux进程状态
●运行状态:程序正在运行或在运行队列中等待运行。
●可中断等待状态:进程正在等待某个事件完成,等待过程可被信号或定时器
唤醒。
●不可中断等待状态:进程正在等待某个事件完成,不可被信号或定时器唤醒,
必须等待事件的发生,才可唤醒。
●僵死状态:进程已终止,但进程描述符依然存在,直到父进程调动wait()函
数后释放。
●停止状态:进程因收到SIGSTOP SIGSTP SIGTIN SIGTOU信号后停止运行
或该进程正在被跟踪(调式程序时)。
2)ps命令
●ps命令可查看进程的当前状态。
●如ps aux(相关命令参数自学)
●对ps命令结果字符的解释
<(高优先级进程)、N(低优先级进程)、L(内存锁页,即页不可被换出内存)、s(该进程为会话首进程)、l(多线程进程)、+(进程位于前台进程组)、R(运行状态)、Z(僵死状态)、D(不可中断等待状态)、S(可中断等待状态)、T(停止状态)。
3)fork()函数
fork()是创建一个新进程的唯一方法,子进程可以继承其父进程几乎所有的资源。
在命令行下使用man 2 fork 可获得该函数的函数声明。
fork()有两个返回值。
成功调用fork后,当前进程实际上已经分裂为两个进程,一个是原来的父进程,另一个是刚刚创建的子进程。
父子进程在调用fork地方分开,一个是父进程调用fork的返回值,返回值为刚刚创建的子进程的pid;另一个是子进程中fork函数的返回值,为0。
fork返回两次的前提是进程创建成功,若失败返回为-1。
用返回值可区分父子进程。
fork之后是父还是子进程先运行是不确定的,这取决于内核所使用的调度算法,一般是交替执行,使进程享有同等执行权。
forktest.c 源代码
【问题】:
1)解释stdio.h、unistd.h、sys/types.h头文件的作用?
2)getpid()、getppid()、fork()的功能是什么?
3)写出forkgrandchild.c的源代码。
2. 【题目】:diffork.c 的创建
【要求】:
上机实现下面diffork.c 的运行,体会fork ()和vfork ()的区别。
【预备知识】:
1) fork ()和vfork ()的区别
● fork ()和vfork ()都是调用一次,返回值两次。
● fork ()创建一子进程时,子进程只是完全复制父进程资源,这样得到的子
进程独立于父进程,具有良好的并发性,但开销较大,有时是不需要的,比如fork 一个进程后,立即调用exec 执行另一个应用程序,那么fork 过程中子进程对父进程地址空间的复制将是一个多余的过程,而vfork
()创建的
子进程共享父进程的地址空间,不拷贝父进程的地址空间,这大大减少了系统开销。
vfork()保证子进程先运行,当它调用exec()或exit之后,父进程才可能被调度。
【注意】:
将diffork.c中的sleep()的参数增大些,开启另一个终端,在该终端下输入ps aux查看父子进程的信息,特别是状态信息。
【结果】:
3. 【题目】:执行新程序的系统调用exec()
【要求】:
上机实现下面processimage.c和execve.c的运行,体会执行新程序的系统调用。
【预备知识】:
1)使用fork或vfork创建子进程后,子进程通常会调用exec函数来执行另
外一个程序,系统调用exec用于执行一个可执行程序以代替当前进程的
执行映像。
2)exec调用并没有生成新进程,一个进程一旦调用exec函数,它本身就死
亡了。
系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈
段,并为新进程分配新的数据段和堆栈段,唯一保留是pid,即,对系统
而言,还是同一个进程,不过执行的已经是另一个程序了。
3)exec函数族有6种不同的调用形似,如execv()、execve()等,它们
声明在unistd.h中。
【注意】:
1)理解带参数的main()函数。
2)在Linux命令行下,使用man execve 获取该函数的帮助。
【问题】:先编译链接processimage.c,再编译链接execve.c,查看运行结果,结果说明了什么?
运行结果截图见下页
4. 【题目】:等待进程结束的系统调用wait()或waitpid()。
【要求】:
上机实现下面wait.c的运行,体会等待进程结束wait()系统调用。
【预备知识】:
子进程先于父进程终止,而父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态,并会一直保持下去除非重启。
子进程进入僵死状态时,内核只保存该进程的一些必要信息以备父进程所需。
此时子进程始终占用着资源,同时也减少了系统可创建的最大进程数。
如果子进程先于父进程终止,且父进程调用了wait或waitpid函数,则父进程会等待子进程结束,就不会使子进程变为僵尸进程。
【注意】:
1)在Linux命令行下,使用man命令获取wait和waitpid函数的帮助。
2)父进程调用wait后被挂起等待(此时打开另一个终端,输入ps aux 命令
可查看父进程的状态),直到子进程结束。
子进程正常结束后,wait函数
返回刚刚结束运行的子进程的pid,宏WEXITSTATUS获取子进程的退出
码。
【问题】:编译链接wait.c,并运行wait,结果说明了什么?。