




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程实验报告 课程名称: 操作系统原理 专业班级: cs1209 学 号: 姓 名: 指导教师: 报告日期:2015年 1月 5日 计算机科学与技术学院 目录 1 实验一 Linux 线程及信号灯 1 1.1 实验目的与内容 1 1.1.1实验目的 1 1.1.2 实验内容 1 1.2 实验过程 1 1.2.1 预备知识 1 1.2.2 实验测试与结果 2 1.3 实验总结 3 1.4 源代码 4 2 实验二 Linux 进程及同步 7 2.1 实验目的与内容 7 2.1.1 实验目的 7 2.1.2 实验内容 7 2.2 实验过程 7 2.2.1 预备知识 7 2.2.2 实验测试与结果 8
2、 2.3 实验总结 9 2.4 源代码 9 3 实验三 Linux 文件目录操作 13 3.1 实验目的与内容 13 3.1.1 实验目的 13 3.1.2 实验内容 13 3.2 实验过程 13 3.2.1 预备知识 13 3.2.2 实验测试与结果 14 3.3 实验总结 15 3.4 源代码 15 实验一 Linux 线程及信号灯 1.1 实验目的与内容 1.1.1 实验目的 1、熟悉 Linux 线程接口。 2、熟悉 Linux 信号灯编程。 3、了解 Linux 进程同步与通信的主要机制,并通过信号灯操作实现进程间 的同步与互斥。 1.1.2 实验内容 1、编程模拟实现飞机售票: 创
3、建多个售票线程; 使用公用全局变量保存已售票数量; 创建互斥信号灯; 对售票线程临界区实施 P、V 操作; 2、编程模拟实现双线程单缓冲区的合作 创建一个计算线程与一个输出线程; 创建同步信号灯; 缓冲区用全局公用数组变量; 对计算线程与输出线程实施 P、V 操作; 1.2 实验过程 1.2.1 预备知识 Linux 下的信号灯及其 P、V 操作: 表 1. 1 P、 V 操作定义 void p(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid
4、, void v(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid, 1 第 1 页 线程: 表 1. 2 线程相关函数 线程创建 pthread create(pthread t *thread, pthread attr t void *(*start routine)(void *),void *arg); *attr, 线程挂起 pthread join(pthread t th, void *thread retrun); 共享内存:
5、使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方 法, shmget与 shmat 系统调用。 进程控制: fork 与 execv 系统调用; 编译、编辑、调试 表 1. 3 编译、编辑、调试 编译 cc o test -g test.c lpthread cc o sub1 sub1.c 编辑 vi 调试 gdb 1.2.2 实验测试与结果 测试结果:模拟售票 说明(图 1.1.1和 1.1.2):共有 300张票,有三个线程分别代表三个售票窗口 1 第 2 页 图 1.1.1 图 1.1.2 说明(图 1.1.3和 1.1.4):每个窗口每次只卖出一张,直到卖完 图 1.1
6、.3 图 1.1.4 测试结果:双线程单缓冲区的合作 图 1.2 1.3 实验总结 本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让 我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对, 1 第 3 页 运行一两次可能没问题,但运行几万次可能会出现问题,此 bug 老师给我指 出的,程序还有待优化。 1.4 源代码 1: #include #include #include #include #include int ticket=300; int mutex; void p(int semid,int semno) struct sembuf sop; sop.s
7、em_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid, void v(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid, void thread1(void) int i; p(mutex,0); n,ticket); printf( 窗口 1:本航班共有 %d 个座位,请问您需要买几张? scanf(%d, if(iticket) printf( 窗口 1:剩余票数不够 ); else
8、ticket=ticket-i; v(mutex,0); void thread2(void) int i; p(mutex,0); n,ticket); n,ticket); printf( 窗口 2:本航班共有 %d 个座位,请问您需要买几张? scanf(%d, if(iticket) printf( 窗口 2:剩余票数不够 ); else ticket=ticket-i; v(mutex,0); void thread3(void) int i; p(mutex,0); printf( 窗口 3:本航班共有 %d 个座位,请问您需要买几张? scanf(%d, if(iticket)
9、printf( 窗口 3:剩余票数不够 ); else ticket=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( ret2=pthread_create( ret3=pthread_create( if(ret1!=0) printf(Creat 1st p
10、thread 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); pthread_join(id2,NULL); pthread_join(id3,NULL); return 0; 2: #include #include #include #include #include int q100; int m; int w=0; void P
11、(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid, void V(int semid, int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid, void pa() P(m,1); w+; qw+=1; V(m,0); void pb () P(m,0); printf(jieguo = %dn,qw); w-; V(m
12、,1); int main(void) pthread_t id1; pthread_t id2; pthread_t id3; pthread_t id4; int 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( if(ret1!=0) printf(create pthread error!n); exit (1); pr
13、intf(id is %dn,id1); ret2=pthread_create( 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 实验目的与内容 2.1.1 实验目的 了解并掌握 Linux 进程及同步 2.2.2 实验内容 编程模拟实现誊抄; 创建三个誊抄进程; 基于共享内存建立缓冲区; 创建同步信号灯; 对各誊抄进程施加 P、V
14、操作; 2.2 实验过程 2.2.1 预备知识 并发程序的誊抄: get 程序:负责从输入序列 f 中读取字符并送到缓冲区 s 中; copy程序:把缓冲区 s 中的数据复制到缓冲区 t中去; put程序:从缓冲区 t 中取出数据打印; 誊抄的实现: 在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有 4 个信号灯分别为 0、1、2、3 在进程中对信号灯的控制可简写为: get() p(0); get 操作; v(2); copy() p(1); p(2); copy 操作; v(0); v(3); put() p(3); put 操作; v(1); 通过设置信号灯
15、0 的初值和利用 copy 对信号灯 0 做 v 操作,使得 当信号灯 0的资源个数 0 时,可 以进行 get 操作 通过设置信号灯 1、2 的初值和利 用 put 对信号灯 1 做 v 操作、利用 get对信号灯 2做 v操作,使得当 信号灯 1 和信号灯 2 的资源个数 均 0 时,可以进行 copy 操作 通过设置信号灯 3 的初值和利用 copy 对信号灯 3 做 v 操作,使得 当信号灯 3 的资源个数 0 时,可 以进行 put 操作 2.2.2 实验测试与结果 运行结果: 图2 使用./main 打开程序 2.3 实验总结 通过此次实验了解了进程的创建,知道了进程与线程的区别。
16、编写的程序输 出固定的几个字符,功能上没做好,欠佳,有待优化。 2.4 源代码 头文件 m.h #include #include #include #include #include #include #include #include #define LOOPS10 #define IPCKEY (key_t) 0 x11 #define SHMKEY1(key_t) 0 x222 #define SHMKEY2(key_t) 0 x333 void P(int semid, int index); void V(int semid, int index); int semid; void
17、 V(int semid, int index) struct sembuf sem; 1 第 9 页 sem.sem num = index; /* 信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1; /* 加到当前信号灯的数值 */ sem.sem_flg = 0; semop(semid, return ; void P(int semid, int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid, return ; Main.
18、c #includem.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 = semctl(semid,3,SETVAL,1); shmid1 = shmg
19、et(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); else 第 10 页 if(p2=fork() = 0) execv(./copy,NULL); else if(p3=fork()=0) execv(./
20、put,NULL); p1=wait( p2=wait( p3=wait( if(semctl(semid,0,IPC_RMID,0)%cn,*t); else printf(put0n); V(semid,3); while(t0!=0); 第 12 页 实验三 Linux 文件目录操作 3.1 实验目的与内容 3.1.1 实验目的 了解并掌握 Linux 文件目录结构 3.1.2 实验内容 编程实现目录查询命令; 功能类似 ls -lR; 查询指定目录下的文件及子目录信息; 显示文件的类型、大小、时间等信息; 递归显示子目录中的文件信息; 3.2 实验过程 3.2.1 预备知识 Linux
21、 文件属性接口: 表 3. 1 文件属性接口 函数 功能 int fstat(int fildes,struct stat *buf); 返回文件描述符相关的文件的状态信 息 int lstat(const char *path, struct stat *buf); 如读取到了符号连接, 读取符号连接本 身的状态信息 int stat(const char *path, struct stat *buf); 如读取到了符号连接, 读取的是符号连 接指向文件的信息 stat结构体几乎保存了所有的文件状态信息: 本程序中主要用到 st_mode 文件的权限信息和类型信息,检查类型时使用 S_IS
22、DIR(); 宏,检查是否是目录 Linux 目录结构接口: 表 3. 2 目录结构接口 函数 功能 DIR *opendir(const char *name); 通过路径打开一个目录, 返回一个 DIR 结构体 指针(目录流),失败返回 NULL ; struct dirent *readdir(DIR *) 读取目录中的下一个目录项,没有目录项可以 1 第 13 页 读取时,返回为 NULL ; int chdir(const char *path); 改变目录 ,与用户通过 cd 命令改变目录一样, 程序也可以通过 chdir 来改变目录,这样使得 fopen(),opendir(),这里需要路径的系统调用, 可 以使用相对于当前目录的相对路径打开文件 (目录 )。 int closedir(DIR*) 关闭目录流 在本程序中,用到结构 dirent 中的 char d_name256; (文件名)项 3.2.2 实验测试与结果 运行结果: 说明:图 3.1 为打开指定某一文件夹里的目录内容;图 3.2为根目录的内容 图 3.1 第 14 页 图 3.2 3.3 实验总
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上饶市中石化2025秋招网申填写模板含开放题范文
- 初中碳化物测试题及答案
- 中国移动金华市2025秋招财务审计类专业追问清单及参考回答
- 迪庆自治州中石化2025秋招面试半结构化模拟题及答案油田勘探开发岗
- 中国移动崇左市2025秋招财务审计类专业追问清单及参考回答
- 国家能源北海市2025秋招面试专业追问及参考电气工程岗位
- 东莞市中石化2025秋招面试半结构化模拟题及答案法律与合规岗
- 中国联通海东市2025秋招面试无领导高频议题20例
- 体育技能考试试题及答案
- 文山自治州中储粮2025秋招仓储保管岗高频笔试题库含答案
- 公路工程技术创新管理制度
- 国家职业技术技能标准 4-04-05-05 人工智能训练师 人社厅发202181号
- 2024年新人教版八年级上册物理全册教案
- 伤口造口专科护士进修汇报
- MOOC 实验室安全学-武汉理工大学 中国大学慕课答案
- 彩钢房建造合同
- 2型糖尿病低血糖护理查房课件
- 医院物业服务投标方案
- 高压燃气管道施工方案
- 国家免疫规划疫苗儿童免疫程序说明-培训课件
- GB/T 13298-1991金属显微组织检验方法
评论
0/150
提交评论