1、实验三、 LINUX系统用户界面实验四、进 (线 )程同步与通信一、实验目的1、掌握 Linux系统中,图形界面和键盘命令的使用。2、学会一种 Linux下的编程环境。3、 掌握 Linux下 进程、线程 的概念。4、 了解 Linux进程 同步、通信 的主要机制,并通过 信号灯 操作实现进程间的同步Date 1二、预备知识1、 Linux下的信号灯及其 P、 V操作在 Linux中信号灯是一个 数据集合 ,用户可使用该集合的每个 元素 作为一个信号灯。信号量表0 1 2 3 4 50 1信号量数组012nDate 2( 1)创建一个指定索引的 信号灯id=semget( key, count
2、, flag )key: 信号量表 的一个索引序号,指定了一个数组count: 信号量数组 的大小flag:规定内核在特定情况下的执行动作id:返回的描述符 (类似于 open文件的描述符 )( 2)对信号灯数组操作的 一般形式 (Unix) semop( id, oplist, cont )oplist :信号量数组中, 某个元素 的下标count:操作数。为正表示 V操作;为负表示 P操作Date 3( 3)对信号灯数组控制操作的 一般形式 (Unix) semctl(id, number, cmd, arg )number:信号量数组中, 某个元素 的下标 cmd : 是一个控制操作命令
3、arg :是一个联合结构内核根据 cmd的值解释 arg如: 用于给信号灯赋初值Date 42、线程的操作( 1)线程创建pthread_create( pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *) , void *arg );pthread_t *thread:指定的线程标识void *(*start_routine)(void *):线程的执行函数void *arg:函数的参数Date 5( 2)线程挂起pthread_join( pthread_t th, void *thread_retur
4、n );功能:挂起当前线程直到由参数 th指定的线程终止,才被唤醒(用于控制线程的 执行 次序 )Date 63、共享内存使用共享内存,是运行在同一计算机上的多个进程,进行进程间通信的最快的方法。012n共 享存储区表 区 表进程表 本进程区表Date 7( 1)创建、或打开共享存储存区shmid=shmget (key, size, flag)key:指定的共享存储区表索引size :存储区中的字节数flag:规定内核在特定情况下的执行动作shmid:返回的描述符( 2)将共享存储区域 附接到 进程的地址空间 virtaddr=shmat(shmid, addr, flags) addr :
5、 用户想要的 共享存储区 附接的虚地址flags: 规定内核在特定情况下的执行动作virtaddr: 系统返回的 共享存储区 附接的虚地址Date 84、进程的创建及重新执行一个程序forkexecv5、编辑、 编译vicc o test -g test.c lpthread cc o sub1 sub1.cDate 9三、实验内容线程、子进程的创建1、模拟二个 线程 共享 一个缓冲区 的同步(test)2、模拟二个 进程 共享 一个缓冲区 的同步(main、 sub1、 sub2)要解决的问题: 在屏幕上怎么才能看到 进程等待 ?3、程序的 扩 充及改 进(1)用某种方式在屏幕上 显 示:送数据 到 缓 冲区、及从 缓 冲区 取数据(2) 将同步模型改 为 其他同步 问题Date 10