2017-2018-1 20155339 第八周课下作业
2017-2018-1 20155339 第八周课下作业
测试三
1.基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
2.服务器响应消息格式是
“
客户端IP:XXXX
服务器实现者学号:XXXXXXXX
当前时间: XX:XX:XX
”
上方提交代码
3.提交一个客户端至少查询三次时间的截图测试截图
提交至少两个客户端查询时间的截图测试截图
过程与结果
-
首先实现两个客户端的连接,学习了课本上的代码,并且实现,如下图。
-
实现规定要求的客户端和服务器,我用的是书上的代码,所以只需要改一下echo函数,将其中的输出有多少字节改成输出指定内容,因为需要输出时间,所以我在csapp.h中加入了
time.h
头文件。运行结果如下
遇到的问题
- 问题:在解决这道题中最主要的问题就是导入csapp.h头文件,一直出现问题。
- 解决方法:上网搜索试了很多方法,也请教了成功了的同学,都不行。后来无奈之下自己改了一下csapp.h,问题终于解决了。
家庭作业
- 4.47
参考了教材4-20的图,练习了这道题
取指阶段 icode:ifun =M1[PC]= D:0
valP<-PC+1//下一条指令地址
译码阶段:valB <- R[%ebp]//得到ebp的值,也就是新的栈指针esp的值
执行阶段:valE <- valB+4//栈指针的值加4
访存阶段:valM <-M4[valB]//读ebp中的值
写回阶段:R[%esp] <- valE //把更新后的指针赋值给esp
R[%ebp] <- valM//弹出的ebp的值
- 4.48
取指阶段:icode:ifun = M1[PC] = C:0
rA:rB <- M1[PC+1]
valC <- M4[PC+2]
valP <- PC+6
译码阶段:valB <- R[rB]
执行阶段:valE <- valB+valC
SetCC
访存阶段
写回阶段 R[rB] <- valE
多进程与多线程
多进程实现daytime
实现过程
- 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。
- 通过多进程实现daytime,需要用到
fork()
函数来创建子进程,由于fork()
函数会调用父进程fork()
函数之后的内容,因此每个客户端可以实现同一个服务器的同一服务。 - 代码链接
实现结果
-
服务器
-
客户端一
-
客户端二
多进程实现daytime
- 虽然通过进程节省了一笔内存的开销,但是比起进程还是会有些差距,进程对内存的开销更小。
基础知识
- 线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。
- Linux下创建一个线程可以调用
pthread_create()
函数来创建线程,int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);
,其中第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
实现过程
- 对于前面两种情况下的代码进行改进,调用了
pthread_create()
函数来运行多线程。
代码链接
实现结果
-
服务器
-
客户端一号
-
客户端二号
遇到的问题
-
问题一:当编辑的时候,提示如下问题
-
解决方法:编译的时候加上
-lpthread
,问题得打解决。