




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、o5persi 丁 yg长春工业大学计算机科学与工程学院操作系统是信息科学、计算机软件的核心和基础学科,对它的掌握程度, 决定着计算机学习者的发展水平及方向。同时它是一门实践性很强的课程,不仅 要学习书木上的理论,而且必须动手实践才能对操作系统基木原理真止理解。木 课程提供实验课,其口的在于加深学生对教学内容的理解,培养学生初步掌握操 作系统基木功能的设计方法及其实现过程。为使学生能更好的了解操作系统,木 次实验安排了熟悉linux操作系统的基木特性,在linux系统下进行实验题目的 设计与实现。实验1熟悉linux环境11.1实验冃的11.2实验内容11.3实验预习内容11.4 linux简
2、单命令简介11.5 linux的全屏幕程序应用41.6使用编辑器vi编辑文件5实验2进程调度算法设计72.1实验冃的72.2实验内容72.3实验要求72.4实验预习内容72. 5实验指导9实验3进程间通信算法设计183实验目的183.2实验内容183.3实验耍求183.4实验预习内容183.5实验指导19351共享内存程序设计193.5.2消息队列程序设计233.5.3管道通信程序设计27实验4死锁与哲学家就餐问题324.1采用预先分配法预防死锁的哲学家就餐问题324.1.1实验目的324.1.2实验要求324.1.3实验步骤324.2采用有序分配法预防死锁的哲学家就餐问题33421实验冃的3
3、34.2.2实验要求334.2.3实验步骤334.3不预防死锁情况卜的哲学家就餐问题34431实验目的344.3.2实验要求344.3.3实验步骤35实验5存储管理算法设计365.1 内存空间的分配和回收365.1.1实验目的365.1.2实验内容365.1.3实验要求365.1.4预习内容:365.1.5实验指导375.2虚拟存储管理395.2.1实验目的395.2.2实验内容395.2.3实验要求395.2.4预习内容4()5.2.5实验指导40实验6同步机制-读者与写者问题426.1实验冃的426.2实验内容426.3实验要求426.4预习内容436.5实验指导(算法分析)436.5.1
4、读者优先436.5.2写者优先476.5.3无优先496.5.4设计并分析测试数据516.5.5程序功能及界面设计516.5.6函数设计建议51实验7假脱机打印程序与虚拟设备527.1实验冃的527.2实验要求537.3数据结构分析537.4程序结构54操作系统课程实验候选题目57操作系统课程实验报告要求59主要参考文献60实验1熟悉linux环境1.1实验目的(1)熟悉linux下的基本操作,学会在linux环境下使用各种简单命令进 行操作。(2)学会在linux环境下或者使用vi编辑器编辑简单的c语言程序,并 能对其编译和调试。1.2实验内容(1)登陆系统,并使用各种简单命令來实现基本的文
5、件操作并观察linux 文件系统的特点;(2)写一c程序,并对该程序进行编译和链接,输岀程序的运行结果。1.3实验预习内容参阅相关linux的命令参考手册,熟悉linux下的操作命令。1.4 linux简单命令简介1.4.1命令的基本格式1、格式:$命令-命令选项参数1参数22、说明:字段间用一个或多个空格分开,linux对大小写敏感,只接受小 写命令。1.4.2常用命令1. who命令功能:可以列出当前登录到系统的所有用户的登录名、终端号和登录吋间$ whodavid tty04 nov 28 08:27daniel ttyol nov28 08:302. man命令可以显示在线电子文档3.
6、 pwd显示当前目录的绝对路径名$pwd/usr/jamcs4. cd改变工作目录$cd source (相对路径)$cd /usr/david (绝对路径)$cd $i1ome或者cd返回用户主目录5. mkdir创建目录$mkdir memos在当前目录f创建子目录$mkdir /sourcc/mcmos指定目录的名字$mkdir - p xx/yy/zz创建多个分级目录6. rmdir删除目录$ rmdir important删除一个空目录如果目录不空,则无法删除必须在父目录或者更高层删除了目录7. is显示指定目录的内容$ls列出当前目录内容$ls source显示目录source的文
7、件列表$ls source/first. c显示指定的文件$ls -a列出所有文件,包括隐藏文件$ls -r循环列出了目录的内容$ls -1按照长格式列表,显示文件的详细信息total 3-rw-r-r- 1 david student 1026 jun25 12:30 123-rw-r-r- 1 david student 684 jun25 12:30 reportdrw-rr 1 david student 48jun25 12:30 momos文件类型:第1列由10个字符组成,每行的第一个字符表示文件类型。-:普通文件d:目录文件b:块设备文件,例如磁盘c:字符设备文件,例如打印机文件
8、的访问模式:9个字符表示,r:允许读w:允许写x:允许执行第一组允许所有者的读、写和执行权限。第二组允许用户组的读、写和执行权限。第三组允许其他用户的读、写和执行权限。如果是可执行文件,标记执行许可权。& rm删除文件rm既可以删除文件,也可以删除目录。5命令没有任何警告信息,当删除文件的时候,不出问题的话,文件就 被删除了。rm-i删除文件前,确认rm-r删除指定的目录及目录中所有文件和了目录9. cp复制文件格式:cp源目标目的目标 如果目的目标已经存在,那么他的内容将被破坏。$cp f订el file210. niv移动文件、更改名字格式:mv源目标目的目标$mv filel f
9、ile2 (更改名字)cp和mv命令都可以接受多于两个的参数,但最后参数必须是目录$cp filel filc2 filc3 dircctoryl11. uptime命令:用來得到有关系统负载的大致数据。$uptime3:20pm up 2days, 2:41, 16 users, load average: 1. 90, 1. 43, 1. 33 uptime报告当前的时间,系统已经启动的时间以及有关任务负载的三个平 均数据(最后1分钟,最后5分钟,最后15秒),该数据是对cpu使用量的大致 接近。12. ps命令:生成一个报告,总结当前进程执行的统计信息。该命令的选 项控制要列出的进程和要
10、显示的信息。最常用的格式就是$ps - of-e:显示所有进程-f:显示详细信息uidpidppid cstimettytime cmdroot00009:36:35? 0:00schcdjamcs8881131517:02:05tty610:02via. txt其中:uid:用户idpid:进程idppid:父进程idc:当前的调度程序的值stime:进程的开始时间tty:和进程相关的终端time:总的cpu运行时间cmd:进程运行的命令13. nice命令:指定运行程序的优先值。格式:nice - n +卜数字 命令例:$nicc - n 10 myprog$nice - n - 10 m
11、yprog14. rcnicc命令:指定进程的优先值。格式:rcnicc - n +|-数字 pid例:$renice - n +10 1001$renice - n - 10 131315. k订1命令:向进程发信号并杀死进程。格式:kill -信号pid (s)信号是要发给进程的信号(可选),缺省是15,通知进程终止有时候发出kill信号z后进程依然可能存在。此时可以使用kill -9命令。 一般这样就能够保证杀死进程。当杀死一个进程的时候,也杀死了进程的所有了进程。1.5 linux的全屏幕程序应用在linux h设计全屏幕应用程序要使用curses函数库。假设我们的全屏幕 应用程序名为
12、tc. c,以下介绍设计步骤。1. 开机,登录,进入linux图形用户界面。2. 单击任务栏上的主菜单,选择“程序->应用程序->gedit文木编辑器” ,进入gedit的文木编辑界面。选择“文件->新建”命令,将创建一个新文档, 在文档窗口屮输入以下代码:include <unistd.h>include <stdlib. h>#inelude curses.h>int main(int argc, char* argv ) char select;/存放用户的菜单选项bool end二false; /循环控制变量,若为true则跳出循环,结束
13、程序的执行initscr( ) ;/初始化curses函数库/若用户没冇选择功能3则循环执行以下代码/清屏/刷新物理屏幕i );显示菜单i );i );i );i );main menu/接收用户的菜单选项while(!end)clear();refresh();printw(|printw(,z | l:fcfs printw(,z | 2:round robinprintw(z,| 3:exit printv( |printwcenter your choice(13):); refresh();doselect= (char)getch();refresh();while(select!
14、二t'&&select!二'2'&&select!二'3'); /若输入不是 1、2、3 则重新输 入clear();refresh();switch(select) case ' r :printw(,znfcfs. n);break;case ' 2 :printw(,znround rob in. n); break;case ' 3 :printw(,n");end二true;/根据用八选项显示和应信息printwpress getch(); refresh();endwin();
15、 return 0;any key to continue. n);/按任意键继续执行/恢复curses库原來的设置选择“文件-另存为”命令,将文档保存在当而目录下,并命 在作者 的机器上,实 际上是保存到输入完成后, 名为tc. c o/home/testbook/test_curses/tc. c 中。3. 单击任务栏上的终端仿真程序图标,进入外壳程序bash,用cd命令进入tc. c 所在的目录。cd /home/testbook/test_curses4. 编译tc. c生成可执行文件tc. o,即在命令提示符卜键入卜面的编译命令:gcc tc. c - o tc. o - lcurs
16、cs5.运行tc.o,即在命令提示符卜键入卜面的命令:./tc.o可以看到程序首先显示主菜单如 图1-e在主菜单下输入数字1,屏幕 输出如图l-2o按任意键回到主菜单, 在主菜单卜输入数字2,屏幕输出如图 1-3。按任意键冋到主菜单,在主菜单 卜输入数字3,屏幕输出如图1-4。按任意键结束程序的执行,回到basho|mainmenu1|1:fcfs2:round robinfcfs.press any key to continue.图1-2press any key to continue图1 -4round robin.press any key to continue.图1-31.6使用
17、编辑器vi编辑文件字符界面的linux系统,在命令提示符下键入以下命令将进入vi编辑器以 便编辑源程序。1. 进入linux的文本模式之后,在命令行键入vi f订ename. c然后冋车。vi 命令是打开vi编辑器。后面的filename, c是用户即将编辑的c文件名字。2. 最基本的命令i :当进入刚打开的文件时,不能写入信息,这时按一下键 盘上的i键(insert),插入的意思,就可以进入编辑模式了。如图1-5 所示:rra in( )pr int ln( *he i lo vor id!ma 2.26-33 全刑图1-5编辑模式3. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤
18、:1)按一下 键盘上的esc键;2)键入冒号(:),紧跟在冒号后而是wq (意思是保存 并退岀)。如果不想保存退岀,则在第二步键入冒号z后,键入q!(不带w ,机尾部保存)。如图1-6所示:mi in( )pr int ln( i lo u)r id!*);图1-6保存模式4. 退出vi编辑器的编辑模式z后,要对刚才编写的程序进行编译。编译的命 令是:gcc f 订ename, c -o outputf 订ermine, out,其中 gcc 是 c 的编译 器。参数:filename, c是要编译的源文件的名称,outputf订cnamc表示 输出文件名称,中括号表示括号内部的内容可输入也可
19、以不输入(中括号 本身不再命令行中出现)。如果不输入outputfilename, out,默认的输出 文件是a. out o5. 最后一步是运行程序,方法如b : . /outputf ilcnamc. out实验2进程调度算法设计2.1实验目的进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状 态转换,它提供了在可运行的进程之间复用cpu的方法。在进程管理屮,进程 调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就 绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程 优先占用处理器。本实验模拟在单处理器情况下的进程调度,目的是加深对进
20、程 调度工作的理解,掌握不同调度算法的优缺点。2.2实验内容选择两个调度算法作为两个实验题耳,实现处理器调度。2.3实验要求要求完成以下功能:运行处理器调度算法,显示就绪进程队列、显示运行进 程队列、显示阻塞进程队列、创建新进程、阻塞进程、唤醒进程、删除进程、退 出程序。实验报告中给出程序中使用的数据结构及流程图。2.4实验预习内容(1) 进程控制块为了管理和控制进程,系统在创建每一个进程时,都为其开辟一个专用的存 储区,用以随时记录它在系统中的动态特性。而当一个进程被撤消时,系统就收 回分配给它的存储区。通常,把这一存储区称为该进程的“进程控制块” (process control bloc
21、k )o由于pcb是随着进程的创建而建立,随着进程的撤消而取消的,因此系统 是通过pcb来“感知,,一个个进程的,pcb是进程存在的唯一标志。(2) 进程控制块队列在多道程序设计环境里,同时会创建多个进程。当计算机系统只冇一个cpu 吋,每次只能让一个进程运行,其他的进程或处于就绪状态,或处于阻塞状态。 为了对这些进程进行管理,操作系统要做三件事。 把处于相同状态的进程的pcb,通过各门的队列指针链接在一起,形 成一个个队列。通常有运行队列、就绪队列、阻塞队列。 为每一个队列设立一个队列头指针,它总是指向排在队列之首的进程的 pcbo 排在队尾的进程的pcb,它的“队列指针”项内容应该为“nu
22、lls或一 个特殊的符号,以表示这是该队的队尾pcb。在单cpu系统中,任何时刻都只有一个进程处于运行状态,因此运行队列 中只能有一个pcb;系统中所有处于就绪状态的进程的pcb排成一队,称其为“ 就绪队列一般地,就绪队列中会有多个进程的pcb排在里面,它们形成处理 机分配的候选对象。如果就绪队列里没有pcb存在,则称该队列为空;所有处 于阻塞状态进程的pcb,应该根据阻塞的原因进行排队,每一个都称为一个“阻 塞队列覽比如等待磁盘输入/输出进程的pcb排成一个队列,等待打印机输出 进程的pcb排成一个队列等。所以,系统中可以有多个阻塞队列,每个阻塞队 列中可以有多个进程的pcb,也可以为空。(
23、3)进程调度算法进程调度算法用于确定就绪队列中的哪一个进程即将获得cpuo常用的进 程调度算法有先來先服务法、时间片轮转法、优先数法等。 先來先服务调度算法先來先服务调度算法的基木思想是:以到达就绪队列的先后次序为标准來选 择占用处理机的进程。一个进程一旦占有处理机,就一直使用卜去,直至正常结 束或因等待某事件的发生而让出处理机。采用这种算法时,应该这样来管理就绪 队列:到达的进程的pcb总是排在就绪队列末尾;调度程序总是把cpu分配给 就绪队列中的第一个进程使用。 时间片轮转法时间片轮转调度算法的基木思想是:为就绪队列中的每一个进程分配一个称 为“时间片''的时间段,它是允许
24、该进程运行的时间长度。在使用完一个时间片后 ,即使进程还没有运行完毕,也要强迫其释放处理机,让给另一个进程使用。它 口己则返回到就绪队列末尾,排队等待卞一次调度的到来。采用这种调度算法时 ,对就绪队列的管理与先来先服务完全相同。主要区别是进程每次占用处理机的 时间由时间片决定,而不是只要占用处理机就一直运行下去,直到运行完毕或为 等待某一事件的发生而口动放弃。 优先数调度算法优先数调度算法的基本思想是:为每一个进程确定一个优先数,进程就绪队 列按照优先数排序。如何确定进程的优先数(也就是进程的优先级)?可以从如卜几个方面考虑。i)根据进程的类型。系统中既有系统进程,又有用户进程。系统进程 完成
25、的任务是提供系统服务,分配系统资源,因此,给予系统进程较高的优先数 能够提高系统的工作效率。ii)根据进程执行任务的重要性。重要性和紧迫性高的进程应当被赋予 较高的优先级。iii)根据进程程序的性质。一个cpu繁忙的进程,由于需要占用较长的 运行时间,影响系统整体效率的发挥,因此只能给予较低的优先数。一个i/o繁 忙的进程,给予它较高的优先数后,就能充分发挥cpu和外部设备z间的并行 工作能力。iv)根据对资源的要求。系统资源有处理机、内存储器和外部设备等。 可以按照一个进程所需资源的类型和数量,确定它的优先数。比如给予占用cpu 时间短或内存容量少的进程以较高的优先数,这样可以提高系统的吞吐
26、量。v)根据用户的请求。系统可以根据用户的请求,给予它的进程很高的 优先数,作“加急"处理。 多级队列调度算法多级队列调度算法也称多级反馈队列调度算法,它是时间片调度算法与 优先数调度算法的结合。实行这种调度算法时,系统中将维持多个就绪队列,每 个就绪队列具有不同的调度级别,可以获得不同长度的时间片。例如,系统维持 n个就绪队列,第1级就绪队列中进程的调度级别最高,可获得的时间片最短, 第n级就绪队列中进程的调度级别最低,可获得的时间片最长。具体的调度方法是:创建一个新进程时,它的pcb将进入第1级就绪队列 的末尾。对于在第1级到第n1级队列中的进程,如杲在分配给它的时间片内完 成了
27、全部工作,那么就撤离系统;如果在时间片没有用完时提出了输入/输出请 求或要等待某事件发生,那么就进入相应的阻塞队列里等待。在所等待的事件出 现时,仍回到原队列末尾,参与卜一轮调度(也就是每个队列实行先来先服务调 度算法);如果用完了时间片还没有完成口己的工作,那么只能放弃对cpu的使 用,降到低一级队列的末尾,参与那个队列的调度。对位于最后一个队列里的进 程,实行时间片轮转调度算法。整个系统最先调度1级就绪队列;只有在上一级就绪队列为空时,才去下一 级队列调度。当比运行进程更高级别的队列中到达一个进程(可以肯定,在此之 前比运行进程级别高的所有队列全为空)时,系统将立即停止当而运行进程的运 行
28、,让它回到口己队列的末尾,转去运行级别高的那个进程。可以看出,多级队列调度算法优先照顾i/o繁忙的进程。i/o繁忙的进程在 获得一点cpu时间后就会提出输入/输出请求,因此它们总是被保持在1、2级 等较前面的队列中,总能获得较多的调度机会。对于cpu繁忙的进程,它们需 要较长的cpu时间,因此会逐渐地由级别高的队列往下降,以获得更多的cpu 时间,它们“沉”得越深,被调度到的机会就越少。但是,一旦被调度到,就会获 得更多的cpu时间。2. 5实验指导实验中用到的主要数据结构是进程控制块,其结构如图21所示。数据项作用next前向指针,指向下一个进程控制块,用來构成进程队列processname
29、进程名称proccss_numbcr进程号,当进程有相同名称时,用来区分进程process_start_moment进程启动时刻process_need_time进程要求运行时间process_lime_slice时间片proccsspriority优先数图2-1进程控制块参考源代码: 进程调度算法 编译命令gcc process_schedule.cpp -o process_schedule.o -leurses程序清单 头文件 process_schedule>hsincludecurses. h> include <stdlib.h>sinclude <u
30、nistd.h>sincludestring. h> #define max_process 10int process_number=0;typedef struct pcb struct pcb *next; char process_name20; int process_number; int process_start_moment; int process_need_time; int process_time_slice; int processpriority;pcb;pcb pcb_tablemax_process;pcb *pcb_run二null;pcb *p
31、cb_free二mull;pcb *pcb_ready二hull;pcb *pcb_ready_rear=null;pcb *pcb_blockcd二mull;pcb *pcb_blocked_rear=null;void init_pcb_table();void display_process_queue(pcb *queue); pcb *create_process();void block_process_by_name();void wakeup_process();void fcfs ();void rr();void hpf();void mfbq();源文件 process_
32、schedule. cpp#include z/process_schedule h int main(int argc, char *argv) char select;initscr(); init_pcb_table(); bool end二false;while(!end) clear ();printw(main menu1 n0printw(z/1:first come first served1 n0printw(z/2:round robin1 n0printw(z/3:highest priority first1 n0printw(z/4:multi_level feedb
33、ack queue1 n0printw(z/5:display ready process queue1 n0printw(z/6:display blocked process queue1 n0printw(z/7:display running queue1 n0printw(z/a:create a process1 n0printw(z/b:delete a process1 n0printw(z/c:block a process1 n0printw(z/d:wakeup a process1 n0printw(z/8:exit1 n0printw(-iv)refresh ();p
34、rintw(z/select a function(1、&d):); refresh ();do先到先服务/时间片轮转调度/优先级调度优先数调度显示就绪进程队列显示等待进程队列/显示运行队列/创建一个队列/删除一个队列使一个队列进入等待状态/唤醒一个队列select= (char)getch();refresh ();while(!(49<=select&&select<=56) |(97<=select&&select<=100); clear ();refresh (); switch (select) case '
35、r :fcfs (); break;case ' 2": rr(); break;case ' 3":hpfo; break; case ' 4,:mfbqo ; break;case ' 5":printw(z/ready queue'rt);display_process_queue(pcb_ready);break;case ' 6 :printw(/?blocked queue'rt);display_process_queue(pcb_blocked); break;case ' t :pr
36、intw(z/running queuen);displar_process_queue (pcb_run); break;case ' a :create_process();break;case ' b":break;case ' c,:block_process_by_name();break;case ' d':wakeup_process();break;case ' 8":printw(zzn,/);end二true; ” ” printw(/zpress any key to continue. rt); get
37、ch();refresh ();endwin ();return 0;void init_pcb_table()int i二0;pcb_free=&pcb_table0;pcb_tablemax_process-1. next=null;pcb_tablemax_process-1. process_number=0; pcb_tablemax_process-1. process_start_moment=0; pcb_tablemax_process-1. process_need_time=0; pcb_tablemax_process1. process_time_slice=
38、0; pcb_tablemax_process-1. process_priority=0; strcpy(pcb_tablemax_process1. process_name,; for(i=0;i<max_pr0cess-l;i+)pcb_tablei next=&pcb_tablei+l; pcb_tablei. process_number=0; pcb_tablei process_start_moment=0; pcb_tablei process_neecl_time=0; pcb_tablei process_time_slice=0; pcb_tablei p
39、rocess_priority=0; strcpy (pcb_tablei process_name,z/,/);void display_process_queue(pcb *queue)pcb *p=queue;int i=4;slice | priority |n);i1lrmove(l, 1);printw(/z |111);move (2, 1);printw(z/ namenumber start | needmove (3, 1);printw(z,|111);while(p!=null)move(i, 1); printwci /z); printw(z,%sz/, p->
40、;process_name);moved, 12);printwci /z);printw(z,%d/z, p->process_number); move(i, 23);printw(/z ”); printw(z/%dz,, p->process_start jnoment); moved, 34);printwci /z);printw(z/%dz,, p->process_need_time); moved, 45);printw(/z ”);printw(z,%d/z, p->process_time_s 1 ice); move(i, 56);printwc
41、i /z);printw(z/%dz,, p->process_priority); moved, 67);printwci');p二p-next;i+;moved, 1);printw(z,|111);refresh (); void fcfs ()辻(pcb_ready二二null) ” ” printw(z,ready queue is empty, no process to run rt);elsepcb_run=pcb_ready;if(pcb_ready=pcb_ready_rear)pcb_ready=pcb_ready_rear=null;pcb_ready=p
42、cb_ready->next;pcb_run->next=null; void rr()void iipfovoid mfbq() ipcb *create_process()pcb *p=pcb_free;if(p=nulqreturn null;elsepcb_free=pcb_free->next;clear ();refresh ();priority |rt);printw(z/please enter the following fields:nz/); printw(z/ name | start_moment | needtime | time-slice s
43、canw ("%s%d%d%d%d", p->process_name,& (p->ptocess_start_moinent),&(p->process_need_t ime),& (p->process_t ime_slice), &(p->process_priority);p->process_number=(process_number+l)%100; process_number+;p->next二null;if(pcb_ready=null) pcb_ready=pcb_ready_re
44、ar=p;elsepcb_ready_rear->next=p; pcb_ready_rear=p; return p; void block_process_by_name()char process_name20; pcb *p=pcb_ready;pcb *previous_p=pcb_ready;辻(p=null) ” ” printw(z/ready queue is empty, no process can be blocked! n,z);return;display_process_queue(pcb_ready);printw(z/enter the process
45、name you want to block: nz,); );while(p!=null)if(!strcmp(p->process_name, process_name)break;previous_p=p;p=p->next;辻(p=null) ” ” printw(no such a process in ready queue:%snyou typed the wrong namen", process_name);return;elseif (p=pcb_ready_rear)无标题文档pcb_ready_rear=previous_p
46、;previous_p->next=p->next;if (pcb_blocked=null) pcb_blocked=pcb_blocked_rear=p; p-next二null;elsepcb_blocked_rear->next=p;pcb_blocked_rear=pcb_blocked_rear->next; p-next二null;void wakeup_process()pcb *p=pcb_blocked;if(pcb_blocked=null) ” ” printw(z/blocked queue is empty, no process needs
47、 to be wakeuped n”);else if(pcb_blocked=pcb_blocked_rear) pcb_blocked=pcb_blocked_rear=null;elsepcb_blocked=pcb_blocked->next;if (pcb_ready=null) pcb_ready=pcb_ready_rear=p; p->next=null;elsepcb_ready_rear->next=p; pcb_ready_rear=pcb_ready_rear->next; p->next二null;/wakeup实验3进程间通信算法设计3
48、.1实验目的1. 通过基础实验,基本掌握共享内存的程序设计。2. 通过编写程序,使读者掌握消息队列的设计方法。3. 通过编写程序,掌握通道通信的设计方法3.2实验内容1. 共享内存程序设计:创建两个进程,在a进程中创建一个共享内存,并 向其写入数据,通过b进程从共享内存中读出数据。2. 消息队列程序设计:创建一个消息队列,如何使用消息队列进行两个进 程(发送端和接受端)之间的通信,包括消息队列的创建、消息发送与读取、消 息队列的撤销和删除等多种操作。3. 管道通信程序设计:编写程序实现进程的管道通信,掌握冇名管道的创建和读 写方式,并熟悉linux支持的有名管道通信方式3.3实验要求理解进程通
49、信的不同方法,要求仿真实现共享内存方式或消息传递方式或管 道方式。运行程序并分析实验结果。实验报告中给出程序中使用的数据结构及流程图。3.4实验预习内容参阅相关资料,熟悉共享内存、消息队列、管道通信策略及实现技术。3.5实验指导3.5.1共享内存程序设计1. 函数说明:共享内存的实现分为两个步骤,第一步是创建共享内存,这里用 到的函数是shmget(),也就是从内存中获得一段共享内存区域。第二步映射共享 内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数 是shmatoo到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的 i/o读写命令对其进行操作。除此之外,当然还
50、有撤销映射的操作,其函数为 shmdt()o2. 共享内存的用法:使用共享内存进行进程间通信一般要经历卜面几个步骤:1 分配:进程通过调用shmget來分配一个共享内存块。2 映射:要让一个进程获取对一块共享内存的访问,这个进程必须先调用 shmat映射共享内存。3 脱离与释放:当进程结束使用共享内存时,使用shhkit使共享内存脱离 进程。当不再需要共享内存时,使用shmctl (sid, ipc_rmid, 0)删除它。3实验步骤及代码: 1)自己建立文件夹,然后分别编辑shm_com.h> shml.cs shm2.c. 1root©localhostbyy#vishm_
51、com.hrootlocalhostbyy#vishml.crootlocalhostbyy#cpshml.cshm2.croot©localhostbyy#vishm2.c/*shm com.h*/#dehne text_sz 2048struct shared_use_stint written_by_you;char some_uxttext_szl;功能描述:本程序申请和分配共享内存,然后轮询并读取共享内存中的数据,直至读到“end”/*shml.c*/#include<unistd>h>#include<stdio>h>#include&
52、lt;stdlib.h>#include<string.h>#include<sys/types>h>#include<sys/ipc.h>#include<sys/shnieh>#include f,shm_com.hnint main(void)int running=l;void *shared_memory=(void *)0;struct shared use st shared stuff;int shmid;/*创建共享内存*/shmid=shmget(key_t) 1234sizeof(struct shared_us
53、e_st),0666|ipc_creat);if(shmid=-l)fprintf(stderr/fshmget failednft); exit(exit_failure);/*映射共享内存勺shared_memory=shmat(shmidxvoid *)0,0); if(shared_memory=(void *)-1)fprintf(stderr/fshmat failednft); exit(exit_failure);printf(f,memory attached at %xn,(int)shared_memory);/*让结构体指针指向这块共享内存引 shared_stuff=
54、(struct shared_use_st *)shared_memory; 八控制读写顺序引shared_stuff->written_by_you=0;/*循环地从共享内存中读数据,直到读到“end”为止勺 while(running)if(shared_stuff->written_by_you)printf(myou wrote: %s115shared_stuff->some_text);/*读进程睡眠1秒,同时会导致写进程睡眠1秒,做到先读后写 勺 sleep(l);shared_stuff->written_by_you=0;if(strncmp(shared_stuff->some_text/fend,3)=0)running=o;/结束循环/*删除共享内存*/if(shmdt(shared_memory)=-l)fprintf(stderr/fshmdt failednm); exit(exit_failure); exit(exit_success);功能描述:本程序申请了上一段程序相同的共享内存,然后循环地向共享内存中写数据, 直
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 总承包招标文件详解专家讲座3篇
- 信息安全风险评估与控制保证书3篇
- 健身中心租赁合同范本运动健身3篇
- 大清包工程分包合同填写说明3篇
- 医院委托消毒灭菌供应协议2篇
- 工程进度付款规定3篇
- 动漫展览赞助协议3篇
- 城市规划专家聘用协议2篇
- 纺织工业化发展与城市经济融合研究考核试卷
- 生物技术在生物制品生产中的应用考核试卷
- 山水林田湖草生态环境调查技术规范DB41-T 1992-2020
- 大众旅游服务质量控制手册
- GB/T 44421-2024矫形器配置服务规范
- 大型活动策划与管理第八章 大型活动风险管理
- Q∕GDW 12165-2021 高海拔地区运维检修装备配置规范
- JGJ107-2016钢筋机械连接技术规程
- 妇科医生进修汇报课件
- 动态分析与设计实验报告总结
- 2024年江苏省泰州市海陵区中考一模数学试卷
- 从汽车检测看低空飞行器检测发展趋势
- DB32T 4740-2024 耕地和林地损害程度鉴定规范
评论
0/150
提交评论