哈工大操作系统实验6—内存管理
来源:互联网 发布:java解压包的后缀 编辑:程序博客网 时间:2024/05/01 10:27
本次实验在信号量的基础上增加了共享内存,比较简单,只需要改写上次的pc.c代码即可
producer.c
#define __LIBRARY__#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#define Total 500#define BUFFERSIZE 10int main(){ int shmid; int put_pos = 0, i; int *ShareAddress; sem_t *empty, *full, *mutex; empty = (sem_t *)sem_open("empty", O_CREAT, 0777, 10); full = (sem_t *)sem_open("full", O_CREAT, 0777, 0); mutex = (sem_t *)sem_open("mutex",O_CREAT, 0777, 1); shmid = shmget( 555204, BUFFERSIZE*sizeof(int), IPC_CREAT|0666); /* if(!shmid) { printf("shmget failed!"); exit(0); }*/ ShareAddress = (int*)shmat(shmid, NULL, 0); /* if(!ShareAddress) { printf("shmat failed!"); exit(0); }*/ for( i = 0 ; i < Total; i++) { sem_wait(empty); sem_wait(mutex); ShareAddress[put_pos] = i; put_pos = ( put_pos + 1 ) % BUFFERSIZE; sem_post(mutex); sem_post(full); } while(1); return 0;}consumer.c
#define __LIBRARY__#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <sys/ipc.h>#include <sys/shm.h>#define Total 500#define BUFFERSIZE 10int main(){ int shmid; int get_pos = 0, i; int *ShareAddress; sem_t *empty, *full, *mutex; empty = (sem_t *)sem_open("empty", O_CREAT, 0777, 10); full = (sem_t *)sem_open("full", O_CREAT, 0777, 0); mutex = (sem_t *)sem_open("mutex",O_CREAT, 0777, 1); shmid = shmget( 555204, BUFFERSIZE*sizeof(int), IPC_CREAT|0666 ); /*返回共享内存的标识符*/ /* if(!shmid) { printf("shmget failed!"); fflush(stdout); exit(0); }*/ ShareAddress = (int*)shmat(shmid, NULL, 0); /* if(!ShareAddress) { printf("shmat failed!"); fflush(stdout); exit(0); }*/ for(i = 0; i < Total; i++) { sem_wait(full); sem_wait(mutex); printf("%d\n", ShareAddress[get_pos]); fflush(stdout); get_pos = ( get_pos + 1 ) % BUFFERSIZE; sem_post(mutex); sem_post(empty); } sem_unlink("empty"); sem_unlink("full"); sem_unlink("mutex"); return 0;}report
1.对于地址映射实验部分,列出你认为最重要的那几步(不超过4步),并给出你获得的实验数据。答:第一步是:寻找保存变量i的虚拟地址ds:0x3004所对应的LDT,ldtr的值是0x0068=0000000001101000(二进制),表示LDT表存放在GDT表的1101(二进制)=13(十进制)号位置。 GDT的位置已经由gdtr明确给出,在物理地址的0x00005cb8。dl和dh的值分别为0x52d00068,0x000082fd。组合出LDT表的物理地址0x00fd52d0。第二步是:由ds:0x0017=0000000000010111(二进制),所以RPL=11,可见是在最低的特权级(因为在应用程序中执行),TI=1,表示查找LDT表,索引值为10(二进制)= 2(十进制),表示找LDT表中的第3个段描述符(从0开始编号)。所以第3项“0x00003fff 0x10c0f300”就是寻找的ds段描述符。第三步是:段描述符“0x00003fff 0x10c0f300”组合成的“0x10000000”。这就是ds段在线性地址空间中的起始地址(ds段的段基址)。段基址+段内偏移,就是线性地址了。所以ds:0x3004的线性地址就是:0x10000000 + 0x3004 = 0x10003004。首先需要算出线性地址中的页目录号、页表号和页内偏移,它们分别对应了32位线性地址的10位+10位+12位,所以0x10003004的页目录号是64,页号3,页内偏移是4。页目录表的基址为0,其中第65个页目录项就是我们要找的内容,0x00000100 :0x00fa3027,页表所在物理页框号为0x00fa3,即页表在物理内存的0x00fa3000位置。进而得到0x00fa300c :0x00fa2067第四步是:线性地址0x10003004对应的物理页框号为0x00fa2,和页内偏移0x004接到一起,得到0x00fa2004,这就是变量i的物理地址。查看0x00fa2004 :0x12345678,证明其确实为i的物理地址。2.test.c退出后,如果马上再运行一次,并再进行地址跟踪,你发现有哪些异同?为什么?答: 相同的是虚拟地址不会改变,线性地址也不会改变,但是实际的物理地址改变了。因为虚拟地址和线性地址都是操作系统抽象出来的,再运行一次仍可以在当前位置, 而物理地址是动态分配的,可能上一次的物理地址已经被占用,所以操作系统会分配一块新的未被使用的来保存变量的值。
0 0
- 哈工大操作系统实验6—内存管理
- 哈工大操作系统实验3—进程管理
- 哈工大操作系统实验1—系统初始化
- 哈工大操作系统实验2—系统接口
- 哈工大操作系统实验4—进程同步
- 操作系统实验-内存管理
- 操作系统实验——内存管理
- 操作系统实验——内存管理
- 哈工大操作系统实验 6 字符显示的控制
- SWJTU 操作系统实验-内存管理
- 哈工大操作系统实验5—I/O设备管理
- 哈工大计算机网络实验—
- linux进程间内存共享和信号量协作[基于哈工大操作系统实验]
- Linux进程管理 进程状态和时钟滴答[哈工大操作系统实验]
- 哈工大操作系统实验 5 (暂时停刊)
- 操作系统实验——内存管理之页面置换算法
- [仿真实验]操作系统的内存管理
- 哈工大java实验 学生管理数据库
- Cocos2d-x中图字原理之深入分析
- oracle练习题
- JavaScript学习要点(二)
- 好题flag-(7.18)
- recommend
- 哈工大操作系统实验6—内存管理
- POJ 3322 Bloxorz I
- C# Action和Func
- 03-NSTimer的简单使用
- 1.文件IO函数练习及注意事项
- HDU 1159 Common Subsequence
- HDU 1243 反恐训练营
- 自动取款机中的秘钥介绍
- 学生反馈