付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程实验报告课程名称:操作系统原理专业班级:cs1209学号:姓名:指导教师:报告日期:2015年1月5日计算机科学与技术学院目录1 实验一 Linux 线程及信号灯.11.1实验目的与内容 .11.1.1 实验目的 .11.1.2实验内容 .11.2实验过程 .11.2.1预备知识 .11.2.2实验测试与结果 .21.3实验总结 .31.4源代码 .42 实验二 Linux 进程及同步 .72.1实验目的与内容 .72.1.1实验目的 .72.1.2实验内容 .72.2实验过程 .72.2.1预备知识 .72.2.2实验测试与结果 .82.3实验总结 .92.4源代码 .93 实验三 Li
2、nux 文件目录操作.133.1实验目的与内容 .133.1.1实验目的 .133.1.2实验内容 .133.2实验过程 .133.2.1预备知识 .133.2.2实验测试与结果 .143.3实验总结 .153.4源代码 .15实验一Linux 线程及信号灯1.1 实验目的与内容实验目的1、熟悉 Linux 线程接口。2、熟悉 Linux 信号灯编程。3、了解 Linux 进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。实验内容1、编程模拟实现飞机售票:创建多个售票线程;使用公用全局变量保存已售票数量;创建互斥信号灯;对售票线程临界区实施P、V 操作;2、编程模拟实现双线程单
3、缓冲区的合作创建一个计算线程与一个输出线程;创建同步信号灯;缓冲区用全局公用数组变量;对计算线程与输出线程实施P、V 操作;1.2 实验过程预备知识Linux 下的信号灯及其P、V 操作:表 1. 1 P、V 操作定义void p(int semid,int semno)void v(int semid,int semno)struct sembuf sop;sop.sem_num=semno;sop.sem_op=-1;sop.sem_flg=0;semop(semid,&sop,1);struct sembuf sop;sop.sem_num=semno;sop.sem_op=1;
4、sop.sem_flg=0;semop(semid,&sop,1);线程:表1. 2线程相关函数线程创建pthread_create(pthread_t *thread, pthread_attr_t*attr,void *(*start_routine)(void *),void *arg);线程挂起pthread_join(pthread_t th, void *thread_retrun);共享内存:使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法, shmget与 shmat 系统调用。进程控制:fork 与 execv 系统调用;编译、编辑、调试表1. 3编译
5、、编辑、调试编译cc otest-g test.c lpthreadcc o sub1 sub1.c编辑vi调试gdb实验测试与结果测试结果:模拟售票说明(图和):共有300 张票,有三个线程分别代表三个售票窗口图图说明(图和):每个窗口每次只卖出一张,直到卖完图图 测试结果:双线程单缓冲区的合作图 1.21.3 实验总结本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对,运行一两次可能没问题,但运行几万次可能会出现问题,此 bug 老师给我指出的,程序还有待优化。1.4 源代码1:#include <stdio
6、.h>#include <pthread.h>#include <linux/sem.h>#include <sys/types.h>#include <stdlib.h>int ticket=300;int mutex;void p(int semid,int semno)struct sembuf sop;sop.sem_num=semno;sop.sem_op=-1;sop.sem_flg=0;semop(semid,&sop,1);void v(int semid,int semno)struct sembuf sop;so
7、p.sem_num=semno;sop.sem_op=1;sop.sem_flg=0;semop(semid,&sop,1);void thread1(void)int i;p(mutex,0);printf(" 窗口 1:本航班共有 %d 个座位,请问您需要买几张?n",ticket);scanf("%d",&i);if(i>ticket)printf(" 窗口 1:剩余票数不够");elseticket=ticket-i;v(mutex,0);void thread2(void)int i;p(mutex,0
8、);printf(" 窗口 2:本航班共有 %d 个座位,请问您需要买几张? n",ticket); scanf("%d",&i);if(i>ticket)printf(" 窗口 2:剩余票数不够");elseticket=ticket-i;v(mutex,0);void thread3(void)int i;p(mutex,0);printf(" 窗口 3:本航班共有 %d 个座位,请问您需要买几张? n",ticket); scanf("%d",&i);if(i>
9、ticket)printf(" 窗口 3:剩余票数不够");elseticket=ticket-i;v(mutex,0);int main()pthread_t id1,id2,id3;int ret1,ret2,ret3;union semun arg;mutex =semget(IPC_PRIVATE,IPC_CREAT);arg.val = 1;semctl(mutex,0,IPC_RMID,0);ret1=pthread_create(&id1,NULL,(void*)thread1,NULL);ret2=pthread_create(&id2,NU
10、LL,(void*)thread2,NULL);ret3=pthread_create(&id3,NULL,(void*)thread3,NULL);if(ret1!=0)printf("Creat 1st pthread error!n");exit(1);if(ret2!=0)printf("Creat 2st pthread error!n");exit(1);if(ret3!=0)printf("Creat 3st pthread error!n");exit(1);pthread_join(id1,NULL);pth
11、read_join(id2,NULL);pthread_join(id3,NULL);return 0;2:#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<linux/sem.h>#include<sys/types.h>int q100;int m;int w=0;void P(int semid,int semno)struct sembuf sop;sop.sem_num=semno;sop.sem_op=-1;sop.sem_flg=0;semop(
12、semid,&sop,1);void V(int semid, int semno)struct sembuf sop;sop.sem_num=semno;sop.sem_op=1;sop.sem_flg=0;semop(semid,&sop,1);void pa()P(m,1);w+;qw+=1;V(m,0);void pb()P(m,0);printf("jieguo = %dn",qw);w-;V(m,1);int main(void)pthread_t id1;pthread_t id2;pthread_t id3;pthread_t id4;int
13、 i,ret1,ret2;union semun arg;arg.val=0;m=semget(IPC_PRIVATE,2,IPC_CREAT|066);semctl(m,0,SETVAL,arg);arg.val=1;semctl(m,1,SETVAL,arg);ret1=pthread_create(&id1,NULL,(void*)pa,NULL);if(ret1!=0)printf("create pthread error!n");exit (1);printf("id is %dn",id1);ret2=pthread_create(
14、&id2,NULL,(void*)pb,NULL);if(ret2!=0)printf("create pthread error!n");exit (1);printf("id is %dn",id2);pthread_join(id1,NULL);pthread_join(id2,NULL);return 0;实验二Linux 进程及同步2.1 实验目的与内容实验目的了解并掌握 Linux 进程及同步实验内容编程模拟实现誊抄;创建三个誊抄进程;基于共享内存建立缓冲区;创建同步信号灯;对各誊抄进程施加P、V 操作;2.2 实验过程预备知识并发程
15、序的誊抄:get 程序:负责从输入序列 f 中读取字符并送到缓冲区 s 中; copy 程序:把缓冲区 s 中的数据复制到缓冲区 t 中去 ; put 程序:从缓冲区 t 中取出数据打印;誊抄的实现:在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有4 个信号灯分别为0、1、2、3在进程中对信号灯的控制可简写为:get()copy()put()p(0);p(1);p(3);get 操作;p(2);put 操作;v(2);copy 操作;v(1);v(0);v(3);0 的初值和利用1、2 的初值和利3 的初值和利用通过设置信号灯通过设置信号灯通过设置信号灯copy 对
16、信号灯 0做 v 操作,使得用 put 对信号灯1做 v 操作、利用copy 对信号灯 3做 v 操作,使得当信号灯 0 的资源个数 >0 时,可get 对信号灯 2 做 v 操作,使得当当信号灯 3 的资源个数 >0 时,可以进行 get 操作信号灯 1 和信号灯2 的资源个数以进行 put 操作均>0 时,可以进行copy 操作实验测试与结果运行结果:图 2使用 ./main 打开程序2.3 实验总结通过此次实验了解了进程的创建,知道了进程与线程的区别。编写的程序输出固定的几个字符,功能上没做好,欠佳,有待优化。2.4 源代码头文件 m.h#include<sys/
17、types.h>#include<sys/sem.h>#include<semaphore.h>#include<stdio.h>#include<stdlib.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/shm.h>#defineLOOPS10#defineIPCKEY (key_t)0x11#defineSHMKEY1(key_t)0x222#defineSHMKEY2(key_t)0x333voidP( intsemid, intindex
18、);voidV( intsemid, intindex);intsemid;voidV( intsemid, intindex)structsembuf sem;sem.sem_num = index; /* 信号灯数组灯的一个索引,指明哪个信号灯 */ sem.sem_op = 1; /* 加到当前信号灯的数值 */sem.sem_flg= 0;semop(semid,&sem, 1);return ;voidP( intsemid, intindex)structsembuf sem;sem.sem_num = index;sem.sem_op = - 1;sem.sem_flg=
19、 0;semop(semid,&sem, 1);return ;Main.c#include"m.h"int main(void)int res,i;struct shmid_ds *buf;int cmd;int shmid1,shmid2;char *s,*t;pid_t p1,p2,p3;semid = semget(IPCKEY,4,IPC_CREAT|0666);res = semctl(semid,0,SETVAL,0);res = semctl(semid,1,SETVAL,1);res = semctl(semid,2,SETVAL,0);res =
20、 semctl(semid,3,SETVAL,1);shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);printf("%d",shmid1);s=(char *)shmat(shmid1,NULL,NULL);shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666);t=(char *)shmat(shmid2,NULL,NULL);if(p1=fork() = 0)execv("./get",NULL);elseif(p2=fork() = 0)ex
21、ecv("./copy",NULL);elseif(p3=fork()=0)execv("./put",NULL);p1=wait(&p1);p2=wait(&p2);p3=wait(&p3);if(semctl(semid,0,IPC_RMID,0)<0)printf("error");shmctl(shmid1,IPC_RMID,0);shmctl(shmid2,IPC_RMID,0);return 0;Get.c#include"m.h"int main(void)int i=0
22、;int shmid1;char *s,*t,str="linux!"semid = semget(IPCKEY,4,IPC_CREAT|0666);shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);s=(char *)shmat(shmid1,NULL,NULL);doP(semid,1);*s=stri;printf("getn");i+;V(semid,0);while(s0!='0');Copy.c#include"m.h"int main(void)in
23、t j=0;int shmid1,shmid2;char *s,*t;semid = semget(IPCKEY,4,IPC_CREAT|0666);shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);s=(char *)shmat(shmid1,NULL,NULL);shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666);t=(char *)shmat(shmid2,NULL,NULL);doP(semid,0);P(semid,3);strcpy(t,s);printf("co
24、pyn");V(semid,2);V(semid,1);while(t0!='0');Put.c#include"m.h"int main(void)int k=0;int shmid1,shmid2;char *s,*t;semid = semget(IPCKEY,4,IPC_CREAT|0666);shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666);t=(char *)shmat(shmid2,NULL,NULL);do/*if(t0='0')break;*/P(semid,
25、2);if(t0!='0')printf("put->%cn",*t);else printf("put->0n");V(semid,3);while(t0!='0');实验三Linux 文件目录操作3.1 实验目的与内容实验目的了解并掌握 Linux 文件目录结构实验内容编程实现目录查询命令;功能类似 ls -lR ;查询指定目录下的文件及子目录信息;显示文件的类型、大小、时间等信息;递归显示子目录中的文件信息;3.2 实验过程预备知识Linux 文件属性接口:表 3. 1 文件属性接口函数int fstat
26、(int fildes,struct stat *buf);功能返回文件描述符相关的文件的状态信息intlstat(const char *path,structstat*buf);int stat(const char *path, struct stat *buf);如读取到了符号连接, 读取符号连接本身的状态信息如读取到了符号连接, 读取的是符号连接指向文件的信息stat 结构体几乎保存了所有的文件状态信息:本程序中主要用到 st_mode 文件的权限信息和类型信息,检查类型时使用 S_ISDIR(); 宏,检查是否是目录Linux 目录结构接口:表3. 2目录结构接口函数DIR *op
27、endir(const char *name);功能通过路径打开一个目录, 返回一个DIR结构体struct dirent *readdir(DIR *)指针 (目录流 ),失败返回 NULL ;读取目录中的下一个目录项,没有目录项可以int chdir(const char *path);读取时,返回为 NULL ;改变目录 与用户通过cd命令改变目录一样,,程序也可以通过chdir 来改变目录,这样使得fopen(),opendir(),这里需要路径的系统调用, 可以使用相对于当前目录的相对路径打开文件(目录 )。int closedir(DIR*)关闭目录流在本程序中,用到结构dirent 中的 chard_name256; (文件名)项实验测试与结果运行结果:说明:图 3.1 为打开指定某一文件夹里的目录内容;图3.2 为根目录的内容图 3.1图 3.23.3 实验总结本程序显示包含目录下的文件名及深度、目录名与深度,功能上创建时间等还未作出,有待改良。3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络攻击防御与数据安全恢复手册
- 小学主题班会课件:心理健康呵护快乐健康成长
- 小学主题班会课件:孝顺父母,尊敬师长
- 汽车销售业务技巧作业指导书
- 催办2026年年度财务结算确认函(6篇)
- 学习方法提升学习效率小学主题班会课件
- 建筑行业工程验收与质量检测标准手册
- 2026年铜川市耀州区事业单位人员招聘考试模拟试题及答案详解
- 2026年铁岭市银州区事业单位人员招聘笔试模拟试题及答案详解
- 2026年张家口市桥西区事业单位人员招聘考试参考题库及答案详解
- 公司2026年上半年工作总结及下半年工作计划
- 八年级上册道德与法治知识点清单
- 工业CT检测技术员职业资格考试复习题库(附答案)
- 500储罐施工方案(3篇)
- 《一年级期末总结班会》 课件
- T∕JSF 041-2025 抗松墨天牛马尾松鉴定技术规程
- 铝型材开模合同范本
- 二十四节气课件
- 心源性心脏病课件
- 脚手架施工安全风险评估方案
- 2025年新媒体运营师(中级)考试真题试卷及详细答案
评论
0/150
提交评论