2019-2020-1 20175307 20175308 20175319 实验三 并发程序
小组成员
20175307高士淳
20175308杨元
20175319江野
实验步骤
1
- 实验要求
学习使用Linux命令wc(1)
基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端
客户端传一个文本文件给服务器
服务器返加文本文件中的单词数 man
命令查询:
- wc指令
- 语法:wc [选项] 文件…
- 说明:统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。
- 参数:
- -c 统计字节数
- -l 统计行数
- -m 统计字符数。这个标志不能与-c标志一起使用
- -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串
- -L 打印最长行的长度
- -help 在线帮助。
- -version 显示版本信息。
- 实验代码
- 测试
test1.txt
,test2.txt
2
-
实验要求
使用多线程实现wc服务器并使用同步互斥机制保证计数正确
上方提交代码
下方提交测试
对比单线程版本的性能,并分析原因 -
多线程之间同步机制:
- 互斥锁:以排他的方式,防止共享资源被并发访问;互斥锁为二元变量, 状态为0-开锁、1-上锁;开锁必须由上锁的线程执行,不受其它线程干扰.
- 操作流程:
I. 创建互斥锁
II. 申请锁:若可用,立刻占用;否则,阻塞等待
III. do-something
IV. 释放锁
V. 销毁锁
- 操作流程:
- 条件变量:满足某个特定条件时,可通过条件变量通知其它线程do-something;必须与互斥锁联合使用,单独无法执行.
- 读写锁:针对多读者,少写者的情况设定
- 若当前线程读数据,则允许其他线程读数据,但不允许写
- 若当前线程写数据,则不允许其他线程读、写数据
- 互斥锁:以排他的方式,防止共享资源被并发访问;互斥锁为二元变量, 状态为0-开锁、1-上锁;开锁必须由上锁的线程执行,不受其它线程干扰.
-
实验代码
- 客户端代码不变。
- 服务器代码增加功能
- 多线程
- 同步互斥机制
- server_1.c
-
运行结果截图
-
与单线程的版本相比,多线程可以一次允许多个客户端连接,对于频繁IO操作的程序,可以有效地并发,工作效率更高,性能更好。但是由于线程需要创建和切换,采用多线程反而会降低执行速度。
3
- 实验要求
交叉编译多线程版本服务器并部署到实验箱中
PC机作客户端测试wc服务器
提交测试截图 - 将实验箱与电脑相连,参照实验一 开发环境的熟悉的步骤操作,确保目标机(超级终端)和宿主机(虚拟机Ubuntu)能互相ping通(实验箱IP为192.168.0.232,Ubantu的IP为192.168.0.230)
- 修改客户端代码
- 用交叉编译器
arm-none-linux-gnuenbi-gcc
编译server.c
- 参照实验一 开发环境的熟悉,挂载共享目录,通过NFS把宿主机中的程序运行目录映射到目标机中
- 在超级终端运行服务器
armserve
,在Ubantu运行客户端