2019-2020-1 20175307 20175308 20175319 实验三 并发程序

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;必须与互斥锁联合使用,单独无法执行.
    • 读写锁:针对多读者,少写者的情况设定
      • 若当前线程读数据,则允许其他线程读数据,但不允许写
      • 若当前线程写数据,则不允许其他线程读、写数据
  • 实验代码

    • 客户端代码不变。
    • 服务器代码增加功能
  • 运行结果截图

  • 与单线程的版本相比,多线程可以一次允许多个客户端连接,对于频繁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运行客户端

posted @ 2019-11-18 13:56  20175319江野  阅读(213)  评论(0编辑  收藏  举报