资源描述:
《最新操作系统实验一剖析教学讲义PPT.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、操作系统实验一剖析实验一进程与线程-Linux进程与线程通讯实验目的深刻理解线程和进程的概念,掌握线程与进程在组成成分上的差别,以及与其相适应的通讯方式和应用目标。Linux系统的fork()保持了UNIX的经典语义,被创建进程具有独立于父进程的地址空间,二者之间的通讯通常可采用pipe机制。clone()是Linux系统特有的系统调用,可以通过参数确定父子之间是否共享存储空间等资源,在地址空间等资源共享的情况下clone实质相当于创建了一个轻进程或线程,这是clone的通常用法。实际在Linux系统中,fork以及用户级线程pthread都是基于clone实现的。实验内容以Linux系统
2、进程和线程机制为背景,掌握fork()和clone()系统调用的形式和功能,以及与其相适应的高级通讯方式。由fork派生的子进程之间通过pipe通讯,由clone创建的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。以生产消费问题为例,通过实验理解fork()和clone()两个系统调用的区别。程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。实验准备使用pipe的例子:close(piepe_fd[0]);//关闭管道的读端注:只有已关闭的管道才能被使用.write(pipe_fd[1],w_buf,4);将w_buf的前4个元素写入管道
3、中.read(pipe_fd[0],r_buf,4);将管道中的前4个元素读入r_buf中.注:由于pipe操作一般都比较慢,所以需要用sleep函数来等待一段时间.实验准备wait(等待子进程中断或结束)定义函数pid_twait(int*status);函数说明wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。参数:status可以设成NULL。子进程的结束状态值请参考waitpid()。返回值:如果执行成功则返
4、回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。实验准备使用wait函数的例子for(i=0;i<4;i++)pid=wait(&status);由于之前创建了4个子进程,所以在这里需要等这四个进程都结束后才能退出,其中每个子进程结束,都会返回自己的进程号.实验设计(1)用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递信息。(2)修改程序,要求实现输出4个子进程的进程号.(3)看看每次实验结果是否一样,想想为什么.HaveFun!实验准备clone系统调用intclone(int(*fn)(void
5、*arg),void*stack,intflags,void*arg);其中fn是轻进程所执行的函数,stack是轻进程所使用的栈,flag是CLONE_VM,CLONE_FS,CLONE_FILES,CLONE_SIGHAND,CLONE_PID的组合,arg是调用过程的对应参数。Clone()的关键是flag的设定,CLONE_VM表示子进程共享父进程内存,CLONE_FS表示子进程共享父进程的文件系统,CLONE_SIGHAND表示子进程共享父进程的消息处理机制,CLONE_PID是指子进程继承父进程的id号。实验准备其他需要注意的问题:(1)由于clone()函数不在标准库中,所以
6、编译时需要加上-pthread选项(posix线程库)(2)利用pidwait()函数(需要引入sys/wait.h)等待线程结束:waitpid(-1,&status,__WALL);实验准备由于semaphore不在Linux系统默认的库中,所以在编译中请加-lrt参数(posix实时扩展库)sem_wait(&s)和sem_post(&s)分别相当于信号灯的P操作和V操作。其中s是说明为说明为sem_t类型的信号灯。intsem_init(sem_t*sem,intpshared,unsignedintvalue);sem_init创建一个信号灯,并初始化其值为value.pshar
7、ed决定了信号量能否在几个进程间共享.由于目前Linux还没有实现进程间共享信号灯,所以这个值只能够取0.实验准备pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex)分别用于加锁和解锁。参数为pthread_mutex_tmutex定义的互斥锁。初始化pthread_mutex_init(&mutex,NULL)。实验设计用clone函数创建四个线程,模拟生产者消