




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 1课 程 实 验 报 告课程名称: 操作系统(co zu x tn)原理 专业(zhuny)班级: cs1209 学 号: 姓 名: 指导(zhdo)教师: 报告日期: 2015年1月5日 计算机科学与技术(jsh)学院目录(ml)1 实验(shyn)一 Linux线程及信号灯11.1 实验目的与内容1 1.1.1实验目的1 1.1.2 实验内容11.2 实验过程1 1.2.1 预备知识1 1.2.2 实验测试与结果21.3 实验总结31.4 源代码42 实验二 Linux进程及同步72.1 实验目的与内容7 2.1.1 实验目的7 2.1.2 实验内容72.2 实验过程7 2.2.1 预备
2、知识7 2.2.2 实验测试与结果82.3 实验总结92.4 源代码93 实验三 Linux文件目录操作133.1 实验目的与内容13 3.1.1 实验目的13 3.1.2 实验内容133.2 实验过程13 3.2.1 预备知识13 3.2.2 实验测试与结果143.3 实验总结153.4 源代码15第 页1实验(shyn)一 Linux线程及信号灯1.1 实验(shyn)目的与内容1.1.1实验(shyn)目的1、熟悉Linux线程接口。2、熟悉Linux信号灯编程。3、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。1.1.2 实验内容编程模拟实现飞机售票:
3、创建多个售票线程;使用公用全局变量保存已售票数量;创建互斥信号灯;对售票线程临界区实施P、V操作;编程模拟实现双线程单缓冲区的合作创建一个计算线程与一个输出线程;创建同步信号灯;缓冲区用全局公用数组变量;对计算线程与输出线程实施P、V操作;1.2 实验过程1.2.1 预备知识Linux下的信号灯及其P、V操作:表1. SEQ 表1. * ARABIC 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,&sop,
4、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); 线程:表1. SEQ 表1. * ARABIC 2 线程相关函数线程创建pthread_create(pthread_t *thread, pthread_attr_t*attr,void *(*start_routine)(void *),void *arg);线程挂起pthread_join(pthread_t th, void *thread_retr
5、un); 共享内存: 使用共享内存是运行在同一(tngy)计算机上的进程进行进程间通信的最快的方法,shmget与shmat 系统(xtng)调用。 进程(jnchng)控制: fork与execv系统调用; 编译、编辑、调试表1. SEQ 表1. * ARABIC 3 编译、编辑、调试编译cc o test -g test.c lpthread cc o sub1 sub1.c编辑vi调试gdb1.2.2 实验测试与结果测试结果:模拟售票说明(图1.1.1和1.1.2):共有300张票,有三个线程分别代表三个售票窗口图1.1.1图1.1.2说明(图1.1.3和1.1.4):每个窗口(chun
6、gku)每次只卖出一张,直到卖完 图1.1.3 图1.1.4测试结果(ji gu):双线程单缓冲区的合作图1.21.3 实验(shyn)总结本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对,运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。1.4 源代码1:#include #include #include #include #include int ticket=300;int mutex;void p(int semid,int semno) struct sembuf
7、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; sop.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个座位,请问(qngwn)您需要买几张?n,ticket); scanf(%d,&i); if(iticket
8、) printf(窗口1:剩余(shngy)票数不够); else ticket=ticket-i; v(mutex,0);void thread2(void) int i; p(mutex,0); printf(窗口2:本航班共有(n yu)%d个座位,请问您需要买几张?n,ticket); scanf(%d,&i); if(iticket) printf(窗口2:剩余(shngy)票数不够); else ticket=ticket-i; v(mutex,0);void thread3(void) int i; p(mutex,0); printf(窗口(chungku)3:本航班共有%d个
9、座位,请问您需要买几张?n,ticket); scanf(%d,&i); if(iticket) 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(&id1,NULL,(void*)thread1,NUL
10、L); ret2=pthread_create(&id2,NULL,(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);
11、pthread_join(id2,NULL); pthread_join(id3,NULL); return 0; 2:#include#include#include#include#includeint 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(semid,&sop,1);void V(int semid, int semno)struct sembuf sop;sop.sem_num=semno;so
12、p.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 i,ret1,ret2;union semun arg;arg.val=0;m=semget(IPC_PRIVATE,2,IPC_CREAT|066);semctl(m,0,SETVAL,arg);
13、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(&id2,NULL,(void*)pb,NULL);if(ret2!=0)printf(create pthread error!n);exit (1); printf(id is %dn,id2);pthread_join(id1,NULL);pthr
14、ead_join(id2,NULL);return 0;实验二 Linux进程(jnchng)及同步2.1 实验(shyn)目的与内容2.1.1 实验(shyn)目的了解并掌握Linux进程及同步2.2.2 实验内容 编程模拟实现誊抄; 创建三个誊抄进程; 基于共享内存建立缓冲区; 创建同步信号灯; 对各誊抄进程施加P、V操作;2.2 实验过程 2.2.1 预备知识并发程序的誊抄:get程序:负责从输入序列f中读取字符并送到缓冲区s中;copy程序:把缓冲区s中的数据复制到缓冲区t中去;put程序:从缓冲区t中取出数据打印;誊抄的实现:在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控
15、制进程的运行,设有4个信号灯分别为0、1、2、3在进程中对信号灯的控制(kngzh)可简写为:get()p(0);get操作;v(2);copy()p(1);p(2);copy操作;v(0);v(3);put()p(3);put操作;v(1);通过设置信号灯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操
16、作2.2.2 实验(shyn)测试与结果运行(ynxng)结果:图2使用./main打开程序2.3 实验总结通过此次实验了解了进程的创建,知道了进程与线程的区别。编写的程序输出固定的几个字符,功能上没做好,欠佳,有待优化。2.4 源代码头文件m.h#include #include #include #include #include #include #include #include #define LOOPS 10#define IPCKEY (key_t)0 x11#define SHMKEY1 (key_t)0 x222#define SHMKEY2 (key_t)0 x333voi
17、d P(int semid,int index);void V(int semid,int index);int semid;void V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信号灯数组灯的一个索引,指明(zhmng)哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值(shz)*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num
18、 = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;Main.c#includem.hint 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); re
19、s = semctl(semid,2,SETVAL,0); res = 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); else
20、 if(p2=fork() = 0) execv(./copy,NULL); else if(p3=fork()=0) execv(./put,NULL); p1=wait(&p1); p2=wait(&p2); p3=wait(&p3); if(semctl(semid,0,IPC_RMID,0)%cn,*t); else printf(put0n); V(semid,3); while(t0!=0); 实验(shyn)三 Linux文件目录操作3.1 实验目的(md)与内容3.1.1 实验(shyn)目的了解(lioji)并掌握Linux文件目录结构(jigu)3.1.2 实验内容编程实现
21、目录查询命令;功能类似ls -lR;查询指定目录下的文件及子目录信息;显示文件的类型、大小、时间等信息;递归显示子目录中的文件信息;3.2 实验过程3.2.1 预备知识Linux文件属性接口:表3. SEQ 表3. * ARABIC 1 文件属性接口函数功能int fstat(int fildes,struct stat *buf);返回文件描述符相关的文件的状态信息int lstat(const char *path, struct stat *buf);如读取到了符号连接,读取符号连接本身的状态信息int stat(const char *path, struct stat *buf);如
22、读取到了符号连接,读取的是符号连接指向文件的信息stat结构体几乎保存了所有的文件状态信息:本程序中主要用到st_mode 文件的权限信息和类型信息,检查类型时使用S_ISDIR(); 宏,检查是否是目录Linux目录结构接口:表3. SEQ 表3. * ARABIC 2 目录结构接口函数功能DIR *opendir(const char *name);通过路径打开一个目录,返回一个DIR结构体指针(目录流),失败返回NULL;struct dirent *readdir(DIR *)读取目录中的下一个目录项,没有目录项可以读取时,返回为NULL;int chdir(const char *path);改变目录,与用户通过cd命令改变目录一样,程序也可以通过chdir来改变目录,这样使得 fopen(),opendir(),这里需要路径的系统调用,可以使用相对于当前目录的相对路径打开文件(目录)。int closedir(DIR*)关闭目录流在本程序中,用到结构dirent中的char d_name256; (文件名)项 3.2.2 实验测试(csh)与结果运行(ynxng)结果:说明(shumng):图3.1为打开指定某一文件夹里的目录内容;图3.2为根目录的内容图3.1图3.23
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届贵州省遵义市高中名校高考化学押题试卷含解析
- 快速康复下的麻醉管理
- 2025年市政园林养护装备项目合作计划书
- 辽宁省抚顺市重点中学2025届高考化学三模试卷含解析
- 中考数学高频考点专项练习:专题14 考点31 菱形 (2)及答案
- 山东省昌乐县第一中学2025届高三一诊考试化学试卷含解析
- 子宫破裂的治疗及护理
- 安全生产管理课件
- 2025届安徽省泗县双语中学高三3月份第一次模拟考试化学试卷含解析
- 2025届陕西省汉中市部分学校高三第二次联考化学试卷含解析
- 支持企业建设中试平台实施方案
- DLT 572-2021 电力变压器运行规程
- 医院进修申请表
- 纸品代理经销协议
- 营养风险筛查与评估课件(完整版)
- HJ 636-2012 水质 总氮的测定 碱性过硫酸钾消解紫外分光光度法
- 《机场运行管理》考试复习题库(含答案)
- JBT 7248-2024 阀门用低温钢铸件技术规范(正式版)
- 【有人机与无人机协同作战效能评估探究15000字(论文)】
- 2024专升本英语答题卡浙江省
- 2024年荆门市水务局事业单位公开招聘工作人员招聘历年公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
评论
0/150
提交评论