exit(0); }
五、 实验结果 1、写出运行结果
2、按要求认真书写实验报告 六、思考问题
1、在linux系统中定义了几种通信方式?这些通信方式的主要功能是什么? 2、linux的PIC的主要功能,并说明IPC中包含的通信机制有哪些?
10
实验七:进程管理----进程间通信(二) 一、 实验目的
linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉linux支持的消息通信机制及共享存储区机制。 二 实验准备
1、装有liunx系统的计算机
2、阅读 liunx系统的msg.c 、sem.c和 shm.c等原代码文件,熟悉linux的三种通信机制。 三、实验内容和要求
1.编写一段C语言程序使其完成:两段程序 test1和test2通过一个共享内存进行通信,其中test1 向共享内存中写数据,test2从共享内存中读出数据或信息并将数据或信息送入标准输出上。
2.用clone( )创建四个轻进程(线程),用参数指明共享内存等资源,通过共享内存模拟生产者—消费者问题,利用pthread_mutex_lock( ),
pthread_mutex_unlock( )等函数实现对共享存储区访问的互斥。 四、部分参考代码 1. #include
#define SHM_MODE (SHM_R | SHM_W) #define SHW_SIZE 2048 int main( )
{int segment_id,segment_size; char *shared_memory; pit_t pid;
if((segment_id=shmget(IPC_PRIVATE,SHM_SIZE,SHM_MODE))<0) printf(―shmget error !\\n‖);
if((shared_memory=shmat(segment_id,0,0))==(void*)-1) printf(―shmat error !\\n‖);
printf(―test1 send a message to shar memory. \\n‖); sprintf(shared_memory,‖Hello test2!\\n‖); shmdt(shared_memory); pid=fork( );
if(pid<0)printf(―Creating process error!\\n‖); else if(pid<0){wait(NULL);
shmctl(segment_id,IPC-RMID,0); exit(0);} else
{ if((shared_memory=shmat(segment_id,0,0))==(void*)-1) printf(―shmat error !\\n‖);
printf(―test2 get a message from share memory:%s ‖, shared_memory); shmdt(shared_memory); } }
11
五、 实验结果 1、写出运行结果
2、按要求认真书写实验报告
12
实验八:存储器管理----动态不等长存储资源分配算法 一、 实验目的
理解动态异长存储分区资源管理,掌握所需数据结构和管理程序了解各种存储分配算法的优点和缺点。 二、实验内容和要求
1 、分析Linux最先适应(First Fit,FF) 存储分配算法,即map数据结构、存储分配函数 malloc()和存储释放函数 mfree( ),找出与算法有关的成分。
2、修改上述与算法有关的成分,使其分别体现BF(Best Fit,最佳适应)分配原则和WF(Worst Fit, 最坏适应)分配原则。 三、实验设计
1、按内容要求编写最佳适应和最坏适应存储分配算法。
2、编写测试程序,对存储分配表进行初始化。然后对用户输入的请求和释放,按算法动态更新存储分配表,并将每次更新之后的存储分配表在屏幕上显示出来。 四、参考代码
#ifdef HAVE_CONFIG_H #include
#include
struct map map[MAPSIZE];
int BF_malloc(struct map *map,int size) {register int a,s;
register struct map *bp,*bpp; for(bp=mp;bp->m_size;bp++) {if(bp->m_size>=size){a=bp->m_addr; s=bp->m_size;
for(bpp=bp;bpp->m_size;bpp++) {if(bpp->m_size>=size&&bpp->m_sizem_addr; s=bpp->m_size; bp=bpp;} }
bp->m_addr+=size; if((bp->m_size - =size)==0) do{bp++;
(bp-1)->m_addr=bp->m_addr; }while((bp-1)->m_size=bp->m_size; return (a); } }
13
return (-1); }
int WF_malloc (struct map *map,int size) {register int a,s;
register struct map *bp,*bpp; for(bp=mp;bp->m_size;bp++) {if(bp->m_size>=size){a=bp->m_addr; s=bp->m_size;
for(bpp=bp;bpp->m_size;bpp++) {if(bpp->m_size>s ) { a=bpp->m_addr; s=bpp->m_size; bp=bpp;} }
bp->m_addr+=size; if((bp->m_size - =size)==0) do{bp++;
(bp-1)->m_addr=bp->m_addr; }while((bp-1)->m_size=bp->m_size;
return (a);
} } return (-1); }
void mfree(struct map *map,int aa,int size) { register struct map *bp; register int a; register int t; a=aa;
for(bp=mp;bp=m_addr<=a&&bp->m_sizeq!=0;bp++) if(bp>mp&&(bp-1)->m_addr+(bp-1)->m_size==a) {(bp-1)->m_size+=size;
if(a+size==bp->m_addr){ (bp-1)->m_size+= bp->m_size; while(bp->m_size) {bp++;
(bp-1)->m_addr=bp->m_addr; (bp-1)->m_size=bp->m_size; } } }
else{ if(a+size==bp->m_addr&& bp->m_size) { bp->m_addr - = size; bp->m_size+=size;} else if(size)
do{t=bp->m_addr;
14