操作系统实验一进程管理与进程通信(计算机进程)

1.实验目的学习如何利用管道机制、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。2.实验内容(1)了解系统调用pipe()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。(2)编写一段程序,使其用管道来实现父子进程之间的进程通信。子进程向父进程发送自己的进程标识符,以及字符串“issendingamessageto…

大家好,又见面了,我是你们的朋友全栈君。

1 .实验目的

学习如何利用管道机制、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。

2 .实验内容

(1) 了解系统调用pipe()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。

(2) 编写一段程序,使其用管道来实现父子进程之间的进程通信。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent ! ”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。

(3) 编写一段程序,使其用共享存储区来实现父子进程之间的进程通信。父进程创建一个长度为512 字节的共享内存空间,显示写入该共享内存的数据;子进程将共享内存也附加到自己的地址空间,并向共享内存中写入数据。

3 .实验步骤

(1) 了解系统调用pipe()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。

pipe()创建一条管道进行信息传输。

shmget()得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符

shmat()连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问

shmdt()用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存

shmctl()共享内存管理,完成对共享内存的控制

(2) 编写一段程序,使其用管道来实现父子进程之间的进程通信。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent ! ”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。

程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(){
    int pid1,pid2;
    int fd[2];
    char out[512],in[512];
    pipe(fd);
    pid1=fork();
    if(pid1==0){
        sprintf(out,"%d is sending a message to parent!\n",getpid());
        printf("%s",out);
        write(fd[1],out,sizeof(out));
    }else{
        read(fd[0],in,sizeof(out));
        printf("%s",in);
    }
    return 0;
}

程序截图:

操作系统实验一进程管理与进程通信(计算机进程)

运行结果:

操作系统实验一进程管理与进程通信(计算机进程)

(3) 编写一段程序,使其用共享存储区来实现父子进程之间的进程通信。父进程创建一个长度为512 字节的共享内存空间,显示写入该共享内存的数据;子进程将共享内存也附加到自己的地址空间,并向共享内存中写入数据。

程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/shm.h>
#define SHMKEY 75
int main(){
    int id;
    char *addr;
    char message[512];
    id=shmget(SHMKEY,512,0777|IPC_CREAT);
    if(fork()==0){
        sprintf(message,"%d is sending message to parent",getpid());
        printf("%s\n",message);
        addr=shmat(id,0,0);
        strcpy(addr,message);
        shmdt(addr);
     }else{
        wait(0);
        addr=shmat(id,0,0);
        printf("%s\n",addr);
        shmdt(addr);
        shmctl(id,IPC_RMID,0);
      }
    return 0;
}

程序截图:

操作系统实验一进程管理与进程通信(计算机进程)

运行结果:

操作系统实验一进程管理与进程通信(计算机进程)

4 .思考

自己写的,有些地方不准确,如果错误还请指正

(1) 上述哪个通信机制提供了发送进程和接收进程之间的同步功能?这些同步是如何进行的?

消息缓冲机制。当写进程把一定数量的数据写入pipe,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空的pipe时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进程的同步。

 

(2) 上述通信机制各有什么特点,它们分别适合于何种场合?

管道通信(PIPE)

    两个进程利用管道进行通信时.发送信息的进程称为写进程.接收信息的进程称为读进程。管道通信方式的中间介质就是文件.通常称这种文件为管道文件.它就像管道一样将一个写进程和一个读进程连接在一起,实现两个进程之间的通信。写进程通过写入端(发送端)往管道文件中写入信息;读进程通过读出端(接收端)从管道文件中读取信息。两个进程协调不断地进行写和读,便会构成双方通过管道传递信息的流水线。

适用场合:数据单向流动,只能在具有亲缘关系的进程间使用。

优缺点:简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

 

共享内存通信(SHARED MEMORY)

    针对消息缓冲需要占用CPU进行消息复制的缺点.OS提供了一种进程间直接进行数据交换的通信方式一共享内存 顾名思义.这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段(作为中间介质)进行通信.它是一种最有效的数据通信方式,其特点是没有中间环节.直接将共享的内存页面通过附接.映射到相互通信的进程各自的虚拟地址空间中.从而使多个进程可以直接访问同一个物理内存页面.如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法.而它的局限性也在于此.即共享内存的诸进程必须共处同一个计算机系统.有物理内存可以共享才行。

适用场合:内存需要能被其他进程所访问且高效率通讯。

优缺点:共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。

 

 

如果对你有帮助的话点个赞鼓励一下吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128778.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt编写GIF录屏工具(开源)「建议收藏」

    Qt编写GIF录屏工具(开源)「建议收藏」在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基本上都支持gif动图,一般一个5秒左右的gif,800*600分辨率,可以很好的控制在500KB内,这样就比较完美的支持各大网站上传动图。最开始使用的是ScreenGif.exe,用了很久,感觉还可以,后面一…

    2022年9月20日
    2
  • nacicat15激活码-激活码分享

    (nacicat15激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2KLKA7BQFO-eyJsaWN…

    2022年4月1日
    66
  • JavaScript面向对象思想

    JavaScript面向对象思想javascript中的面向对象:ECMA标准定义JS中的对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)面向对象三个基本特征是:封装、继承、多态封装:将对象运行所需的资源封装在程序对象中,基本上是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可

    2025年6月17日
    4
  • TransactionScope 的基本原理简介

    TransactionScope 的基本原理简介C#的事务编程1Db事务DbConnection中创建基于当前连接的DbTransaction2使用TransactionScope,创建环境事务一旦创建,在这个环境包含的DbCo

    2022年7月4日
    35
  • pandas之分组groupby()的使用整理与总结

    pandas之分组groupby()的使用整理与总结前言在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分组来进行分析,这时通过pandas下的groupby()函数就可以解决。在使用pandas进行数据分析时,groupby()函数将会是一个数据分析辅助的利器。groupby的作用可以参考超好用的pandas之groupby中作者的插图进行直…

    2022年5月9日
    46
  • RemMai 3.0[通俗易懂]

    RemMai 3.0[通俗易懂]RemMai 3.0

    2022年4月22日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号