下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、班级:计科1141 学号:0姓名:邓超荣实验一进程同步与互斥实验目的 了解多进程并发执行时因控制不当而导致的运行结果不确定的竞争条件现象、以及消除竞争条件所采取的措施。实验内容有一个数据文件,名字是data,其中存放了一个十进制正整数。现有一个程序,该程序读出文件data中的数据、将其加一、再将结果更新到data之中,上述动作重复进行一百万次。如下给出完成上述功能的源程序:01 #include 02 #include 03 #include 04 #include 05 #include 06 #include 07 #include 08 int main()09 10 int num,
2、fd,i;/ num变量用于存放从buff转换而来的二进制形式的整数 / fd是打开data文件之后的描述符,用于下文对data文件的读写操作11 char buff100;/ 定义的buff字符数组用于存放从文件中读出的数字字符形式的整数12 fd = open(data, O_RDWR);/打开文件13 if(fd=0)/如果文件不存在14 printf(open errorn);15 return 1;16 17 for(i=1;i=;i+)/循环一百万次循环循环18 lseek(fd, 0, SEEK_SET);/ 将文件的读写指针归零19 int len = read(fd, buf
3、f, 100);/len存放从文件读入的数字符的长度20 bufflen=0;/在字符串后添加空格代表结束21 num = atoi(buff);/ 调用atoi函数,将字符串转换为二进制形式,并存放在num22 sprintf(buff, %dn, num + 1);/num+1,循环10000次后就是+num23 lseek(fd, 0, SEEK_SET);/ 将文件的读写指针归零即置于起始字节之处24 write(fd, buff,strlen(buff);/将更新后的数重新写入文件中25 26 close(fd);/关闭文件27 return 0;/返回28 问题:1. 请在linu
4、x中编译、链接、执行这个程序。如果该程序只作为单个进程执行,请观察运行结果,并分析代码。首先向data文件中输入1107,并进行保存。该程序分析如下:第10行中定义变量num存放从buff的字符串中转换而来的二进制形式的整数,变量fd存放打开data文件之后的描述符;第11行中定义长度为100的字符数组,用于存放从data文件中读出的数字字符形式的整数;第12行打开data文件;第13-16行判断文件是否打开,如果没有,则输出open error提示;第17-25行,循环次操作,第18行,在每次循环都将文件的读写指针指向文件的起始位置;第19行,len保存读入字符串的长度;第20行,在字符串结
5、尾加入空格符以示结束;第21行,调用atoi()函数,将buff的字符串转变为二进制数;第22行,对转变得二进制数进行+1操作;第23行,把文件的读写指针至于文件起始位置;第24行,将更新的数据重新写回data文件中。如此循环一百万次,相当于data中存放的数据加上一百万,所以得出图中所示结果。2.在不改变程序代码的情况下,怎样把上述程序作为多个进程来并发执行?请观察并发执行情况下的运行结果,分析运行结果错误的具体原因。答:要实现多进程并发执行,可多个窗口对同一程序进行运行。 由于data文件初始值为1234,所以两个进程在并发执行的情况下,正确结果应该为,可是最后结果却为。显然与正确结果不符
6、。此主要原因在于,在两个进程同时执行的时候,可能会在同一时间对num进行操作,导致重读,如原本进程1对2加1后为3,进程而对3加1后为4.而现实中可能产生的情况是进程1和进程2同时对2进行加1操作,所以得到最终结果是3而不是4;另一种情况是,进程1已进行了加1操作但在保存到文件之前,进程2执行到读取文件数据,因此,进程2读取的还是原本数据,进行加1操作后仍然是进程1执行操作后的数据。所以当多进程并发执行时,最后得出的结果与预想中的结果不同。3.请修改上述代码,采用上锁方式,以保证并发执行时运行结果的正确性,并分析得到了正确结果的原因。修改后,代码如下:#include #include #in
7、clude #include #include #include #include int main() struct flock fl;/定义结构体flock,设置锁 int num, fd,i; char buff100; fd = open(data, O_RDWR); if(fd=0) printf(open errorn); return 1; fl.l_whence = SEEK_SET;/设置文件读写位置 fl.l_start = 1;/开始位置为1 fl.l_len = 1;/长度为1 fl.l_pid = getpid();/获取进程 for(i=1;i=;i+) fl.l_
8、type = F_WRLCK;/对文件加锁 fcntl(fd, F_SETLKW, &fl);/对文件逐个扫描 lseek(fd, 0, SEEK_SET); int len = read(fd, buff, 100); bufflen=0; num = atoi(buff); sprintf(buff, %dn, num + 1); lseek(fd, 0, SEEK_SET); write(fd, buff,strlen(buff); fl.l_type = F_UNLCK;/解锁文件 fcntl(fd, F_SETLKW, &fl); close(fd); return 0;该程序分析结果如下:当进程1对文件进行操作时,对文件进行加锁,防止其他进程对文件同时操作,也就是,其他进程阻塞。当进程1完成操作对文件解锁后,进程2被唤醒,进而对文件进行操作,在操作前,同样对文件进行加锁。如此类推,对个进程交替执行,保证了结果的正确性。实验心得:写出你对单次执行和并发进程的感受,操作系统对并发进程控制的重要性。在数据量比较少的情况下,单次执行的速度比并发执行的速度占有一定的优势。但在数据量的达到百万上亿的时候,单次执行的速度明显不尽人意。而并发执行能多个进程同时对一个程序进行操作,就如,工厂里生产汽车零件,一个人一天的产量必定少于多个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年河北省石家庄市深泽县达标名校6月初三押题测试卷(2)生物试题(理工农医类)试题含解析
- 2026年存量海绵项目盘活路径与资产优化配置策略
- 广东省佛山市顺德区2025-2026学年初三下学期第一次统一考试生物试题试卷含解析
- 2026年江西省鹰潭市中考化学试题押题预测卷含解析
- 2026年山东省济南实验市级名校初三第一次诊断生物试题含解析
- 2026年极地钻机混合动力系统冷启动与能效优化
- 2026年智能体运行成本控制:小模型路由器与大模型分级调用策略
- 2026年精密磨床故障规律与预测性维护实施
- 2025年临床执业《内科学》阶段测试
- 中邮速递专员岗位招聘面试全解
- 25-26第二学期初三年级历史备课组工作计划:研析中考真题优化复习策略提升历史学科应试能力
- 城市公共交通运营与服务规范
- 林业项目监理工作总结与报告
- 化工造粒工安全教育考核试卷含答案
- 制冷基础知识课件
- 锅炉满水培训课件
- 放射科质控管理(技师组)
- 2026年江西单招新能源汽车技术专业基础经典题详解
- 手键拍发课件
- 2026春教科版(新教材)小学科学一年级下册(全册)教学设计(附教材目录)
- 管理研究方法:逻辑、软件与案例 课件 第6章:社会网络分析及应用
评论
0/150
提交评论