江苏大学操作系统课程设计Linux系统管理实践与进程通信实现

上传人:be****l 文档编号:103851375 上传时间:2022-06-09 格式:DOC 页数:19 大小:967KB
收藏 版权申诉 举报 下载
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现_第1页
第1页 / 共19页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现_第2页
第2页 / 共19页
江苏大学操作系统课程设计Linux系统管理实践与进程通信实现_第3页
第3页 / 共19页
资源描述:

《江苏大学操作系统课程设计Linux系统管理实践与进程通信实现》由会员分享,可在线阅读,更多相关《江苏大学操作系统课程设计Linux系统管理实践与进程通信实现(19页珍藏版)》请在装配图网上搜索。

1、 .操作系统课程设计Linux系统管理实践与进程通信实现班级网络10 学号 31006100姓名YHD 指导老师詹 永 照 二零一三年一月八号一、设计容 1、Linux系统的熟悉与常用操作命令的掌握。2、Linux环境下进程通信的实现。(实现父母子女放水果吃水果的同步互斥问题,爸爸放苹果,女儿专等吃苹果,妈妈放橘子,儿子专等吃橘子,盘子即为缓冲区,大小为5。)二、Linux环境介绍1、Linux的由来与发展Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。1991年,芬兰学生Linux Torvalds开发了这个操作系统的核心部分,因为是Linux改良的mi

2、nix系统,故称之为Linux。2、Linux的优点(1)Linux具备UNIX系统的全部优点Linux是一套PC版的UNIX系统,相对于Windows是一个十分稳定的系统,安全性好。(2)良好的网络环境Linux与UNIX一样,是以网络环境为基础的操作系统,具备完整的网络功能,提供在Internet或Intranet的,FTP,www等各种服务。(3)免费的资源Linux免费的资源和公开的源代码方便了对操作系统的深入了解,给编程爱好者提供更大的发挥空间。3、Linux的特点1)全面的多任务,多用户和真正的32位操作系统2)支持多种硬件,多种硬件平台3)对应用程序使用的存进行保护4)按需取盘5

3、)共享存页面6)使用分页技术的虚拟存7)优秀的磁盘缓冲调度功能8)动态共享库9)支持伪终端设备10)支持多个虚拟控制台11)支持多种CPU12)支持数字协处理器387的软件模拟13)支持多种文件系统14)支持POSIX的任务控制15)软件移植性好16)与其它UNIX系统的兼容性17)强大的网络功能三、常用命令介绍1、目录操作和DOS相似,Linux采用树型目录管理结构,由根目录(/)开始一层层将子目录建下去,各子目录以 / 隔开。用户login后,工作目录的位置称为 home directory,由系统管理员设定。符号代表自己的home directory,例如 /myfile 是指自己hom

4、e目录下myfile这个文件。Linux的通配符有三种:*和?用法与DOS一样,-代表区间的任一字符,如test0-5即代表test0,test1,test5的集合。(1)显示目录文件 ls执行格式: ls -atFlgR name (name可为文件或目录名称)例: ls 显示出当前目录下的文件ls -a 显示出包含隐藏文件的所有文件ls -t 按照文件最后修改时间显示文件ls -F 显示出当前目录下的文件与其类型ls -l 显示目录下所有文件的许可权、拥有者、文件大小、修改时间与名称ls -lg 同上ls -R 显示出该目录与其子目录下的文件注:ls与其它命令搭配使用可以生出很多技巧(最简

5、单的如ls -l | more),更多用法请输入ls -help查看,其它命令的更多用法请输入命令名 -help 查看。(2)建新目录 mkdir执行格式: mkdir directory-name例: mkdir dir1 (新建一名为dir1的目录)(3)删除目录 rmdir执行格式: rmdir directory-name 或 rm directory-name例:rmdir dir1 删除目录dir1,但它必须是空目录,否则无法删除 rm -r dir1 删除目录dir1与其下所有文件与子目录rm -rf dir1 不管是否空目录,统统删除,而且不给出提示,使用时要小心(4)改变工作

6、目录位置 cd执行格式: cd name 例: cd 改变目录位置至用户login时的working directorycd dir1 改变目录位置,至dir1目录 cd user 改变目录位置,至用户的working directory cd 改变目录位置,至当前目录的上层目录 cd /user 改变目录位置,至上一级目录下的user目录 cd /dir-name1/dir-name2 改变目录位置,至绝对路径(Full path) cd 回到进入当前目录前的上一个目录(5)显示当前所在目录 pwd执行格式: pwd(6)查看目录大小du执行格式: du -s directory例:du d

7、ir1 显示目录dir1与其子目录容量(以kb为单位) du -s dir1 显示目录dir1的总容量(7)显示环境变量 echo $HOME 显示家目录 echo $PATH 显示可执行文件搜索路径 env 显示所有环境变量(可能很多,最好用env|more,env|grep PATH等)(8)修改环境变量,在bash下用export,如: export PATH=$PATH:/usr/local/bin想知道export的具体用法,可以用shell的help命令:help export2、文件操作(1)查看文件(可以是二进制的)容 cat执行格式:cat filename或more fil

8、ename 或cat filename|more例: cat file1 以连续显示方式,查看文件file1的容more file1 或 cat file1|more 以分页方式查看文件的容(2)删除文件 rm执行格式: rm filename例: rm file?rm f*(3)复制文件 cp执行格式: cp -r source destination例: cp file1 file2 将file1复制成file2 cp file1 dir1 将file1复制到目录dir1 cp /tmp/file1 将file1复制到当前目录 cp /tmp/file1 file2 将file1 复制到当

9、前目录名为file2cp r dir1 dir2 (recursive copy)复制整个目录。(4)移动或更改文件、目录名称 mv执行格式: mv source destination例: mv file1 file2 将文件file1,更名为file2 mv file1 dir1 将文件file1,移到目录dir1下mv dir1 dir2 (5)比较文件(可以是二进制的)或目录的容 diff执行格式: diff -r name1 name2 (name1、name2同为文件或目录)例: diff file1 file2 比较file1与file2的不同处diff -r dir1 dir2

10、 比较dir1与dir2的不同处(6)文件中字符串的查找 grep执行格式: grep string file例: grep abc file1 查找并列出串abc所在的整行文字(7)文件或命令的路径寻找执行格式一:whereis command 显示命令的路径执行格式二:which command 显示路径与使用者所定义的别名执行格式三:whatis command 显示命令的功能摘要执行格式四:find search -path -name filename -print搜寻指定路径下某文件的路径执行格式五:locate filename根据系统预先生成的文件/目录数据库(/var/lib

11、/slocate/slocate.db)查找匹配的文件/目录,查找速度很快,如果有刚进行的文件改变而系统未到执行定时更新数据库的时间,可以打入updatedb命令手动更新。(8)建立文件或目录的 ln例: ln source target1 建立source文件(已存在)的硬,命名为target1ln -s source target2 建立source文件的符号,命名为target2以下是几个常用命令操作的截图:四、设计思想当计算机中两个或多个进程在执行时需要使用公用缓冲区,并且对该缓冲区采取了互斥措施。这时如果并发执行这些进程就会造成CPU的极大浪费,这是操作系统设计要求不允许的。而这种现

12、象在操作系统和用户进程量存在。因此为了解决这一问题,提出了同步的概念,即把异步环境下的一组并发进程,因直接制约而互相发送消息、互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。在本次设计中,爸爸与妈妈、儿子与女儿的进程操作是互斥的,但是爸爸与女儿、妈妈与儿子进程之间的操作是同步的。因此要利用进程同步的方法来实现这几者之间的操作,当然其中也包含着互斥进程,因为盘子每次只能放入或取出一个水果。程序设计中有如下四个进程:father(),mother(),daughter(),son()。五、数据结构1、信号量semid_mutex作为进程的公有信号量,其初始值为1,可以实现进程

13、间的互斥,同时可以表示当前状态下盘子里可以放几个水果,实现进程间的同步。2、信号量semid_full1为进程father()与daughter()的私有信号量,初值为0,表示当前盘子里苹果的数目。3、信号量semid_full2为进程mother()与son()的私有信号量,初值为0,表示当前盘子里橘子的数目。六、设计流程爸爸放苹果流程图:father操作semid_mutex=0(P(semid_mutex)阻塞father进程是放苹果否唤醒daughter进程V(semid_full1)妈妈放橘子流程图:mother操作semid_mutex=0(P(semid_mutex)阻塞moth

14、er进程是放橘子否唤醒son进程V(semid_full2)女儿吃苹果流程图:daughter操作semid_full1=0(P(semid_full1)阻塞daughter进程是吃苹果否离开临界区唤醒father进程V(semid_mutex)儿子吃橘子流程图:son操作semid_full2=0(P(semid_full2)阻塞son进程是吃橘子否离开临界区唤醒mother进程V(semid_mutex)七、 源代码#include #include#include#include#include#include #include #include #include #include #i

15、nclude#include #define SHMKEY 9090 /*共享存储区的键*/#define SEMKEY_EMPTY 9091#define SEMKEY_MUTEX 9092#define SEMKEY_FULL1 9093#define SEMKEY_FULL2 9094 /*信号量数组的键*/*注意:上面的键在系统中必须唯一*/#define BUFF_LEN 5/*缓冲区可以存放10个产品*/#define PRODUCT_LEN 1 /*每个产品是一个字符串:sem_num=semnum; sem-sem_op=semop; sem-sem_flg=semflg; i

16、nt begin() char *addr, end; int shmid; int semid_empty, semid_full1,semid_full2, semid_mutex; struct sembuf sem_tmp; /*开辟共享存储区*/ if (shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777|IPC_CREAT|IPC_EXCL) = -1) if (errno = EEXIST) printf(The Buffer Has Existed!n); printf(Do You Want To Delete The

17、Buffer(Y = yes)?n=:); scanf(%c, &end); if(end = y | end = Y) /* 共享存储区、信号量并不随程序的结束而被删除,如果我们没删除的话, 可以用ipcs命令查看,用ipcrm删除 */ /*释放缓冲区*/ shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+3, 0777); if (shmctl(shmid,IPC_RMID,0) 0) perror(shmctl: falsed); /*同时释放信号量*/ semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*

18、获取全局信号量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); semctl(semid_mutex,0,IPC_RMID); semctl(semid_empty,0,IPC_RMID); semctl(semid_full1,0,IPC_RMID); semctl(semid_full2,0,IPC_RMID); else printf(Fail To Create B

19、uffer!n); return -1; addr = (char*)shmat(shmid, 0, 0);/*连接缓冲区*/ memset(addr, 0, BUFF_LEN * PRODUCT_LEN+3); /初始化存储区 为0 shmdt(addr); /*离开缓冲区*/ /*创建3个信号量:1个用于对缓冲区互斥,2个用于生产者、消费者同步*/ if(semid_mutex = semget(SEMKEY_MUTEX,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY_MUTEX Has Exist

20、ed!n); else printf(Fail To Create SEMKEY_MUTEX!n); return -1; if(semid_empty= semget(SEMKEY_EMPTY,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY_EMPTY Has Existed!n); else printf(Fail To Create SEMKEY_EMPTY!n); return -1; if(semid_full1 = semget(SEMKEY_FULL1,1, 0777|IPC_CREAT|

21、IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEM_FULL1 Has Existed!n); else printf(Fail To Create SEM_FULL1!n); return -1; if(semid_full2= semget(SEMKEY_FULL2,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEM_FULL2 Has Existed!n); else printf(Fail To Create SEM_FULL2!n); return -1;

22、/*给信号量赋初值*/ set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/ semop(semid_empty, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/ semop(semid_full1, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/ semop(semid_full2, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 1, 0);/*1*/ semop(

23、semid_mutex, &sem_tmp,1); return 0;/*下面的P,V是对系统调用的简单封装*/int P(int semid) struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; if(semop(semid, &p_buf, 1)=-1)/*semop参见课件ppt*/ perror (p (semid) falsed); exit (1); else return 0;int V(int semid) struct sembuf v_buf;/*struct 参见课件p

24、pt*/ v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = 0; if(semop(semid, &v_buf, 1)=-1) perror ( v (semid) failed); exit (1); else return 0;int father() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信号量集合id*/ int rc1,rc2,rc3; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*获取全局信号量id*/ sem

25、id_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc1=semctl(semid_empty,0,GETVAL); rc2=semctl(semid_mutex,0,GETVAL); if(rc1=0) return 1; /不能放 則等待 if(rc2=0 ) return 1; P(semid_empty);/*对私有信号量作P操作*/ P(semid_mutex); printf(

26、there is %d places to put applesn,rc1); printf(PUT AN APLLEn); V(semid_mutex); V(semid_full1); rc3=semctl(semid_full1,0,GETVAL); printf(daughter can get %d applesn,rc3); return 0;int mother() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信号量集合id*/ int rc1,rc2,rc3; semid_mutex = semget(SEMK

27、EY_MUTEX,1, 0777);/*获取全局信号量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc1=semctl(semid_empty,0,GETVAL); rc2=semctl(semid_mutex,0,GETVAL);if(rc1=0) return 1; /不能放 則等待 else if(rc2=0) return 1; P(semid_empty);

28、/*对私有信号量作P操作*/ P(semid_mutex); printf(there is %d places to put orangesn,rc1); printf(PUT AN ORANGE!n); V(semid_mutex); V(semid_full2); rc3=semctl(semid_full2,0,GETVAL); printf(son can get %d orangesn,rc3); return 0;int son() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信号量集合id*/ int rc1,

29、rc2; semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*获取全局信号量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc2=semctl(semid_full1,0,GETVAL); rc1=semctl(semid_full2,0,GETVAL);if(rc1=0) return 1; /不能放 則等待 P(semid_fu

30、ll2);/*对私有信号量作P操作*/ P(semid_mutex); printf(SUM:%d apples and %d orangesn,rc2,rc1); printf(there is %d oranges to get n,rc1); printf(GET AN ORANGE !n); V(semid_empty); V(semid_mutex); return 0;int daughter() int semid_empty, semid_full1,semid_full2, semid_mutex;/*信号量集合id*/ int rc1,rc2,rc3; semid_mute

31、x = semget(SEMKEY_MUTEX,1, 0777);/*获取全局信号量id*/ semid_empty = semget(SEMKEY_EMPTY,1, 0777); semid_full1 = semget(SEMKEY_FULL1,1, 0777); semid_full2 = semget(SEMKEY_FULL2,1, 0777); rc2=semctl(semid_full1,0,GETVAL); rc1=semctl(semid_full2,0,GETVAL);if(rc2=0) return 1; /不能放 則等待 P(semid_full1); P(semid_m

32、utex); printf(SUM:%d apples and %d orangesn,rc2,rc1); printf(there is %d apples to get n,rc2); printf(GET AN APPLEn); V(semid_empty); V(semid_mutex); return 0;int main() int pid; int i = 0, x;begin();pid = fork();if(fork()=0)father();if(fork()=0)mother();if(fork()=0)daughter();if(fork()=0)son(); ret

33、urn 0;八、调试与运行首先,利用g+ ks.cpp编译一次,若有错误,则根据错误提示对程序进行修改。其次,编译通过后执行./a.out,若原先已有共享缓冲区,则删除原先缓冲区,再创建新的共享缓冲区.,然后再次执行./a.out,观察系统进程调度。运行结果如下:九、设计总结在设计这个题目之前,由于对进程同步的实现方法不是很了解,对于怎样具体实现进程同步有很大的疑问,所以在网上进行了查找,但几经搜索都没有找到合适的材料。就是在这种虽然有一定基础,但并不能完全依靠的前提下,自己通过查找相关的书籍,了解本次设计中涉与到的数据结构后,成功实现了进程同步的功能。从对进程同步只是一个概念上的认识,到最终将它的功能实现这一过程,我感到非常满意与欣慰,因为这些都是通过自己的努力一步一步实现的。同时,本次课程设计也存在着不足之处。虽然熟悉和了解了程序中各数据结构的定义和创建,但是在一些细节问题上还没有一个很明确的认识,只是机械的合法的使用它。当然,在以后的课程设计中,我会更加追求完善,将不清晰的地方都弄明白。19 / 19

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!