张三.操作系统实验1.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
班级:计科 1142 学号: 2014116212 99 姓名:张三 实验一 进程同步与互斥 实验目的 了解多进程并发执行时因控制不当而导致的运行结果不确定的竞争条件现象、以 及消除竞争条件所采取的措施。 实验内容 有一个数据文件,名字是 data,其中存放了一个十进制正整数。现有一个程序,该程序读出 文件 data 中的数据、将其加一、再将结果更新到 data 之中,上述动作重复进行一百万次。 如下给出完成上述功能的源程序: 01 #include stdio.h 02 #include stdlib.h 03 #include fcntl.h 04 #include sys/types.h 05 #include unistd.h 06 #include stdarg.h 07 #include string.h 08 int main() 09 { int num, fd,i; char buff[100]; fd = open(data, O_RDWR); if(fd=0){ printf(open error\n); return 1; } for(i=1;i=1000000;i++){ lseek(fd, 0, SEEK_SET); int len = read(fd, buff, 100); buff[len]=\0; num = atoi(buff); sprintf(buff, %d\n, num + 1); lseek(fd, 0, SEEK_SET); write(fd, buff,strlen(buff)); } close(fd); return 0; } 问题: 请在 linux 中编译、链接、执行这个程序。如果该程序只作为 单个 进程执行,请观 察运行结果,并分析代码。 在不改变程序代码的情况下, 怎样把上述程序作为 多个 进程来 并发 执行?请 观察并发执行情况下的运行结果,分析运行结果错误的具体原因。 请修改上述代码,采用上锁方式,以保证并发执行时运行结果的正确性,并分析得到了正 确结果的原因。 参考写法(不许复制) : 用 vi data 命令建立数据文件,并将文件内容设置为整数 1234。用 vi test1.c 命令创建程序 文件,并将上述源代码输入其中,保存、编译、连接、运行,最终结果是文件 data 中的原 整数变为 1001234 ,运行结果正确。该程序分析如下:第 11 行定义的 buff 字符数组用于存 放从文件中读出的数字字符形式(即 ascii码)的整数,其最大长度是 100位十进制数,实 际中不可能达到这样大的长度,长度定义为 100 只不过是保证了足够长度而已。第 10 行的 num 变量用于存放从 buff 转换而来的二进制形式的整数, fd 是打开 data 文件之后的描述符, 用于下文对 data 文件的读写操作。 第 12行打开文件, 如果因种种原因 (例如文件不存在等) 致使文件无法打开,则 13-16 行显示错误信息并返回。 17-25 行进行了一百万次循环操作, 每次循环中, 第 18 行将文件的读写指针归零 (即置于起始字节之处) ,因为文件刚刚被打开 之后其读写指针默认为指向了起始字节处,所以乍看起来第 18 行的操作似乎是多余的,其 实并不然。事实上第 24 行的写操作已经使得文件的读写指针置于文件末尾,所以一定要在 第 18 行重置文件指针, 只有这样才能读出新的数据。 类似地, 第 23 行的指针重置保证了用 新的数据 (即加了 1 之后的数据) 覆盖旧的数据, 如果缺少这一行, 将导致文件中存放一序 列递增的整数而不是一个整数。第 9行从文件中读取一个字符串放入 buff 之中,如前所述, buff 中保存的是字符串形式的整数,而在第 21 行,对 atoi 函数的调用则将字符串转换为二 进制形式,并存放于 num 之中。第 22 行将加 1 之后的 num 转换为十进制字符串,并保存 于 buff 之中。第 24 行将字符转写入文件。 26 行关闭文件, 27 行返回。 为了让程序以多个进程的形式并发执行,可以设置多个窗口。例如 cygwin 窗口标题条上 右击,选择 new 建立新窗口;超级终端 putty 可以启动多次,每次创建一个新窗口。每个窗 口中启动程序,从而实现了多个进程的并发执行。 (接下来写出你的观察,可以截屏协助说 明,并作出详细分析) 用锁修改上述代码,给出代码、观察实验现象、分析代码。 实验心得: 写出你对单次执行和并发进程的感受,操作系统对并发进程控制的重要性。

文档评论(0)

157****5685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档