操作系统实验报告(进程的管道及消息通信)

合集下载

操作系统实验报告6

操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。

三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。

通过编写简单的C++程序,使用Windows API 函数创建多个进程。

在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。

2、进程间通信实现了进程间的管道通信和消息传递。

通过创建管道,让两个进程能够相互交换数据。

同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。

(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。

观察内存使用情况,了解内存碎片的产生和处理。

2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。

(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。

通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。

2、目录操作实现了目录的创建、删除、遍历等功能。

了解了目录结构在文件系统中的组织方式和管理方法。

四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。

2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。

3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。

操作系统实验报告

操作系统实验报告

《操作系统》课程实验报告专业:软件工程班级:软件二班学号: 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. 理解进程的概念及其在操作系统中的作用。

2. 掌握进程的创建、调度、同步和通信机制。

3. 学习使用进程管理工具进行进程操作。

4. 提高对操作系统进程管理的理解和应用能力。

二、实验环境1. 操作系统:Windows 102. 软件环境:Visual Studio 20193. 实验工具:C++语言、进程管理工具(如Task Manager)三、实验内容1. 进程的创建与销毁2. 进程的调度策略3. 进程的同步与互斥4. 进程的通信机制四、实验步骤1. 进程的创建与销毁(1)创建进程使用C++语言编写一个简单的程序,创建一个新的进程。

程序如下:```cpp#include <iostream>#include <windows.h>int main() {// 创建进程STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));// 创建进程if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {std::cout << "创建进程失败" << std::endl;return 1;}std::cout << "进程创建成功" << std::endl;// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 销毁进程CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```(2)销毁进程在上面的程序中,通过调用`WaitForSingleObject(pi.hProcess, INFINITE)`函数等待进程结束,然后使用`CloseHandle(pi.hProcess)`和`CloseHandle(pi.hThread)`函数销毁进程。

操作系统实验报告(进程的管道及消息通信)

操作系统实验报告(进程的管道及消息通信)
if(argc==2) {
printf("\n Ihave wrote:%s",string); write(fd,string,45); string[0]+=1; } else { read(fd,buf,256); printf("\n The context by I have read is :!%s",buf); buf[0]='\0'; } } close(fd); } 运行结果:
char parent[]="A message to pipe'communication.\n";
main() {
int pid,chan1[2]; char buf[100]; pipe(chan1); pid=fork(); if(pid<0) {
printf("to create child error\n"); exit(1); } if(pid>0) { close(chan1[0]); printf("parent process sends a message to child.\n"); write(chan1[1],parent,sizeof(parent)); close(chan1[1]); printf("parent process waits the child to terminate\n"); wait(0); printf("parent process terminate\n"); } else { close(chan1[1]); read(chan1[0],buf,100); printf("The message read by child process from parent is :%s.\n",buf); close(chan1[0]); printf("child process terminates\n"); } } 运行结果:

操作系统进程通信报告

操作系统进程通信报告

实验四:进程同步实验一、实验任务:1、熟悉操作系统进程通信原理2、设计程序,实现共享内存、管道通信、消息通信二、实验原理:1、进程间通信的几种方法简介(1)消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。

有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。

(2)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。

是针对其他通信机制运行效率较低而设计的。

往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

(3)无名管道(Pipe)及有名管道(named pipe):有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;无名管道可用于有亲缘关系的进程之间彼此的通信,进行通信时候必须有一定的机制保证对管道写和读的互斥:即在读是要关闭写的端口,而在写的时候也要保证读的一端是关闭的。

2、进程通信函数(1)消息队列有关系统调用函数a.创建消息队列使用msgget()函数:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int flag) ;该函数成功调用返回消息队列标识符。

其中的key是关键字,可以由ftok()函数得到:key=ftok(“.”,’a’);其中”.”可以是任何目录,’a’是任意字符,即所有群组标识。

flag是标识,IPC_CREAT位表示创建,一般由服务器程序创建消息队列时使用。

如果是客户程序,必须打开现存的消息队列,必须不使用IPC_CREAT。

发送和接收的消息都必须使用一个类似msgbuf的结构表示,msgbuf结构定义如下:struct msgbuf{long mtype;char mtext[1];}上面的定义,消息内容只有一个字节,是不实用的,一般我们需要重新定义一个结构:struct amsgbuf{long mtype;char mtext[200];}其中的mtype都是消息类型。

通信管道实验报告(3篇)

通信管道实验报告(3篇)

第1篇一、实验目的1. 理解通信管道的概念和作用。

2. 掌握管道的创建、使用和销毁方法。

3. 学习管道在进程间通信中的应用。

4. 熟悉管道的同步机制。

二、实验原理管道(Pipe)是UNIX系统中实现进程间通信(IPC)的一种古老且常用的方法。

它允许一个进程向另一个进程发送数据。

管道通常由两个端点组成:一个用于写入数据,另一个用于读取数据。

管道可以用于父子进程之间的通信,也可以用于兄弟进程之间的通信。

三、实验内容1. 创建管道:使用`pipe()`系统调用创建管道。

2. 写入数据:使用`write()`系统调用向管道写入数据。

3. 读取数据:使用`read()`系统调用从管道读取数据。

4. 管道的同步:使用`select()`或`poll()`等系统调用来实现管道的同步。

5. 管道的销毁:使用`close()`系统调用销毁管道。

四、实验步骤1. 创建管道:```cint pipefd[2];if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}```2. 创建子进程:```cpid_t pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}```3. 在子进程中写入数据:```cif (pid == 0) {close(pipefd[0]); // 关闭读端write(pipefd[1], "Hello, world!\n", 14); close(pipefd[1]); // 关闭写端exit(EXIT_SUCCESS);}```4. 在父进程中读取数据:```cclose(pipefd[1]); // 关闭写端char buffer[1024];read(pipefd[0], buffer, sizeof(buffer));printf("Received: %s\n", buffer);close(pipefd[0]); // 关闭读端```5. 同步管道:```cfd_set readfds;FD_ZERO(&readfds);FD_SET(pipefd[0], &readfds);select(pipefd[0] + 1, &readfds, NULL, NULL, NULL);```6. 销毁管道:```cclose(pipefd[0]);close(pipefd[1]);```五、实验结果1. 创建管道成功。

进程通信的实验报告

进程通信的实验报告

一、实验目的1. 理解进程通信的概念和作用。

2. 掌握进程通信的常用方法,包括管道、消息队列、信号量等。

3. 通过编程实践,加深对进程通信机制的理解和应用。

二、实验环境操作系统:Linux开发环境:gcc三、实验内容1. 管道通信2. 消息队列通信3. 信号量通信四、实验步骤及分析1. 管道通信(1)实验步骤1)创建一个父进程和一个子进程;2)在父进程中创建一个管道,并将管道的读端和写端分别赋给父进程和子进程;3)在父进程中,通过管道的写端发送数据给子进程;4)在子进程中,通过管道的读端接收父进程发送的数据;5)关闭管道的读端和写端;6)结束进程。

(2)实验分析通过管道通信,实现了父进程和子进程之间的数据传递。

管道是半双工通信,数据只能单向流动。

在本实验中,父进程向子进程发送数据,子进程接收数据。

2. 消息队列通信(1)实验步骤1)创建一个消息队列;2)在父进程中,向消息队列中发送消息;3)在子进程中,从消息队列中接收消息;4)删除消息队列;5)结束进程。

(2)实验分析消息队列是一种进程间通信机制,允许不同进程之间传递消息。

消息队列的创建、发送、接收和删除等操作都是通过系统调用实现的。

在本实验中,父进程向消息队列发送消息,子进程从消息队列接收消息,实现了进程间的消息传递。

3. 信号量通信(1)实验步骤1)创建一个信号量;2)在父进程中,对信号量执行P操作,请求资源;3)在子进程中,对信号量执行V操作,释放资源;4)结束进程。

(2)实验分析信号量是一种用于实现进程同步的机制。

在进程通信中,信号量可以用来协调多个进程对共享资源的访问。

在本实验中,父进程和子进程通过信号量实现了对共享资源的同步访问。

五、实验结果1. 管道通信实验结果:父进程成功向子进程发送数据,子进程成功接收数据。

2. 消息队列通信实验结果:父进程成功向消息队列发送消息,子进程成功从消息队列接收消息。

3. 信号量通信实验结果:父进程成功获取资源,子进程成功释放资源。

进程通讯管理实验报告(3篇)

进程通讯管理实验报告(3篇)

第1篇一、实验目的1. 理解进程通信的概念和原理;2. 掌握进程通信的常用机制和方法;3. 能够使用进程通信机制实现进程间的数据交换和同步;4. 增强对操作系统进程管理模块的理解。

二、实验环境1. 操作系统:Linux2. 编程语言:C3. 开发环境:GCC三、实验内容1. 进程间通信的管道机制2. 进程间通信的信号量机制3. 进程间通信的共享内存机制4. 进程间通信的消息队列机制四、实验步骤1. 管道机制(1)创建管道:使用pipe()函数创建管道,将管道文件描述符存储在两个变量中,分别用于读和写。

(2)创建进程:使用fork()函数创建子进程,实现父子进程间的通信。

(3)管道读写:在父进程中,使用read()函数读取子进程写入的数据;在子进程中,使用write()函数将数据写入管道。

(4)关闭管道:在管道读写结束后,关闭对应的管道文件描述符。

2. 信号量机制(1)创建信号量:使用sem_open()函数创建信号量,并初始化为1。

(2)获取信号量:使用sem_wait()函数获取信号量,实现进程同步。

(3)释放信号量:使用sem_post()函数释放信号量,实现进程同步。

(4)关闭信号量:使用sem_close()函数关闭信号量。

3. 共享内存机制(1)创建共享内存:使用mmap()函数创建共享内存区域,并初始化数据。

(2)映射共享内存:在父进程和子进程中,使用mmap()函数映射共享内存区域。

(3)读写共享内存:在父进程和子进程中,通过指针访问共享内存区域,实现数据交换。

(4)解除映射:在管道读写结束后,使用munmap()函数解除映射。

4. 消息队列机制(1)创建消息队列:使用msgget()函数创建消息队列,并初始化消息队列属性。

(2)发送消息:使用msgsnd()函数向消息队列发送消息。

(3)接收消息:使用msgrcv()函数从消息队列接收消息。

(4)删除消息队列:使用msgctl()函数删除消息队列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

while((fgets(line,MAXLINE,fpin))!=NULL) {
if(fputs(line,fpout)==EOF) {
fprintf(stderr,"fputs error to pipe. \n"); exit(1); } } if(ferror(fpin)) { fprintf(stderr,"fgets error. \n"); exit(1); } if(pclose(fpout)==-1) { fprintf(stderr,"pclose error. \n"); exit(1); } exit(0); } 运行结果:
3、有名管道的通信
有名管道使用的例子;代码如下: #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int mknod(const char *pathname,mode_t mode,dev_t dev); char string []="this is a example to show fifo communication";
二.消息缓冲机制
客户进程收到服务结果信息后,显示两者的通信过程,下面给出 客户进程和服务者进程通信示例的源程序: (1) 客户进程的通信过程 #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #define SVKEY 75 #define REQ 1 struct msgform {
为读进程分配文件表项、为写进程分配文件表
项、分配用户文件描述符
4、读/写进程互斥:内核为地址设置一个读指针 和一个写指针,按先进先出顺序读、写。为使 读、写进程互斥地访问pipe文件,需使各进程互 斥地访问pipe文件索引结点中的直接地址项。因 此,每次进程在访问pipe文件前,都需检查该索 引文件是否已被上锁。若是,进程便睡眠等待, 否则,将其上锁,进行读/写。操作结束后解 锁,并唤醒因该索引结点上锁而睡眠的进程。
一、什么是管道:
所谓管道,是指能够连接一个写进程和一个读进 程的、并允许它们以生产者—消费者方式进行通 信的一个共享文件,又称为pipe文件。由写进程 从管道的写入端(句柄1)将数据写入管道,而 读进程则从管道的读出端(句柄0)读出数据。 二、管道的类型: 1、有名管道:一个可以在文件系统中长期存在 的、具有路径名的文件。用系统调用mknod( )建 立。它克服无名管道使用上的局限性,可让更多 的进程也能利用管道进行通信。因而其它进程可 以知道它的存在,并能利用路径名来访问该文 件。对有名管道的访问方式与访问其他文件一 样,需先用open( )打开。 2、无名管道:一个临时文件。利用pipe( )建立起 来的无名文件(无路径名)。只用该系统调用所 返回的文件描述符来标识该文件,故只有调用 pipe( )的进程及其子孙进程才能识别此文件描述 符,才能利用该文件(管道)进行通信。当这些 进程不再使用此管道时,核心收回其索引结点。 3、pipe文件的建立:分配磁盘和内存索引结点、
实验题 进程的管道及消息通 小组 否பைடு நூலகம்


合作
姓名
班级


一、实验目的
1、了解什么是管道
2、熟悉LINUX支持的管道通信方式
3、了解Linux系统中的进程间通信机制,包括共 享内存和信号量。
二.实验环境
安装了Linux虚拟机的Windows 系统的计算机一台
三、实验内容与步骤
一、管道通信 1、创建无名管道的格式
#include<sys/types.h> #include<ctype.h> #include<unistd.h> int pipe(int filedes[2]); 真确返回:0,错误返回:-1。无名管道pipe()的使用 例子:使用无名管道pipe(),进行父子进程之间的通信。源代码如下: #include<sys/types.h> #include<ctype.h> #include<unistd.h> int pipe(int filedes[2]);
msgrcv(msqid,&msg,256,REQ,0);//接受客户发送的消息 printf("server is doing the service for a client.\n"); pint = (int *)msg.mtext; pid = * pint;//获得客户pid,以便进行服务 printf("server receive client's service request is client's pid: '%d'.\n",pid); msg.mtype = pid; pid = getpid(); /*经服务进程的的pid发送给客户 msgsnd(msqid,&msg,sizeof(int),0); } } 运行结果:
long mtype;//消息类型 char mtext[256];//消息正文 } main() { struct msgform msg; int msqid,pid,* pint; msqid = msgget(SVKEY,0777);//创建消息队列 pid = getpid();//获得当前进程标识 pint = (int *)msg.mtext;//获得消息正文首地址 * pint = pid;//将客户进程的pid复制到消息缓冲区中 msg.mtype = REQ; msgsnd(msqid,&msg,sizeof(int),0);//发送消息 msgrcv(msqid,&msg,256,pid,0);//这里pid作为消息类型 printf("client receive server's service result is server's pid: %d \n",pid) ;
四、实验过程与分析
在1例子中: 1、pipe( )是建立一无名管道,系统调用格式为 pipe(filedes)参数定义是int pipe(filedes);int filedes[2];其中,filedes[1]是写入端,filedes[0]是读 出端。 2、read( )的系统调用格式是read(fd,buf,nbyte),参 数定义是int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte;它的功能是从fd所指示的文件中读 出nbyte个字节的数据,并将它们送至由指针buf 所指示的缓冲区中。如该文件被加锁,等待,直 到锁打开为止。 3、write( )系统调用格式是read(fd,buf,nbyte),它的 功能是把nbyte 个字节的数据,参数定义同read( ),而父进程则从管道中读出来自两个进程的信 息,显示在屏幕上。从buf所指向的缓冲区写到 由fd所指向的文件中。如文件加锁,暂停写入, 直至开锁。 五、实验总结
main(argc,argv) int argc; char *argv[]; {
int fd; char buf[256];
int i; mknod("fifo",010777,0); if(argc==2) {
fd=open("fifo",O_WRONLY); } else {
fd=open("fifo",O_RDONLY); } for(i=0;i<26;i++) {
fprintf(stderr,"usage:a.out<pathname>\n"); exit(1); } if((fpin=fopen(argv[1],"r"))==NULL) { fprintf(stderr,"can't open %s \n",argv[1]); exit(1); } if((fpout=popen("/mnt/usb/mldm/chcase.exe","w"))==NULL) { fprintf(stderr,"popen error\n"); exit(1); }
2、打开一个以命令行为参数的管理文件,完成
进程之间的通信进程
例子:以命令行为参数的管理文件的示例。 假设有一个的可执行程序chcase,从标准输出设备读字符,将小写 字母转换成大写字母并进行输出。 主程序使用popen创建管道,实现将某文件中的字母转换成大写字 母。其中的文本文件名作为参数传进来。源程序如下: #include<sys/wait.h> #include<stdio.h> #define MAXLINE 100 int main(int argc,char *argv[]) { char line[MAXLINE]; FILE *fpin,*fpout; if(argc!=2) {
char parent[]="A message to pipe'communication.\n";
main() {
int pid,chan1[2]; char buf[100]; pipe(chan1); pid=fork(); if(pid<0) {
printf("to create child error\n"); exit(1); } if(pid>0) { close(chan1[0]); printf("parent process sends a message to child.\n"); write(chan1[1],parent,sizeof(parent)); close(chan1[1]); printf("parent process waits the child to terminate\n"); wait(0); printf("parent process terminate\n"); } else { close(chan1[1]); read(chan1[0],buf,100); printf("The message read by child process from parent is :%s.\n",buf); close(chan1[0]); printf("child process terminates\n"); } } 运行结果:
相关文档
最新文档