您的位置:首页 > 其它

2017-2018-1 20155334第八周课堂实践总结+课下作业+教材内容总结

2017-11-12 22:17 477 查看

2017-2018-1 20155334第八周课堂实践总结+课下作业+教材内容总结

第八周测试的2、3项目在课上已经提交了

第八周测试-1:

lude <stdio.h>
int main(int argc,char *argv[]){
int sum=0,i=0;
for(i=1;i<argc;i++){
sum+=atoi(argv[i]);
}
printf("%d\n",sum);
}




第八周课下作业1:

完成家庭作业4.47,4.48,4.49

相应代码反汇编成X86-64汇编

把上述X86-64汇编翻译成Y86汇编,并给出相应机器码

家庭作业4,47:

void bubble(int *data, int count) {

if(count == 0)
return;
int i, j;
int *p, *q;
for(i=count-1; i!=0; i--)
{
p = data, q = data + 1;
for(j=0; j!=i; ++j)
{
if( *p > *q )
{
int t = *p;*p = *q;
*q = t;
}
p++, q++;
}
}
}

汇编代码:

00000000 <bubble_p>:
0:   56                      push   %esi
1:   53                      push   %ebx
2:   8b 44 24 10             mov    0x10(%esp),%eax
6:   8b 54 24 0c             mov    0xc(%esp),%edx
a:   8d 70 ff                lea    -0x1(%eax),%esi
d:   85 f6                   test   %esi,%esi
f:   7e 2d                   jle    3e <bubble_p+0x3e>
11:   8d b4 26 00 00 00 00    lea    0x0(%esi,%eiz,1),%esi
18:   31 c0                   xor    %eax,%eax
1a:   8d b6 00 00 00 00       lea    0x0(%esi),%esi
20:   8b 4c 82 04             mov    0x4(%edx,%eax,4),%ecx
24:   8b 1c 82                mov    (%edx,%eax,4),%ebx
27:   39 d9                   cmp    %ebx,%ecx
29:   7d 07                   jge    32 <bubble_p+0x32>
2b:   89 5c 82 04             mov    %ebx,0x4(%edx,%eax,4)
2f:   89 0c 82                mov    %ecx,(%edx,%eax,4)
32:   83 c0 01                add    $0x1,%eax
35:   39 f0                   cmp    %esi,%eax
37:   7c e7                   jl     20 <bubble_p+0x20>
39:   83 ee 01                sub    $0x1,%esi
3c:   75 da                   jne    18 <bubble_p+0x18>
3e:   5b                      pop    %ebx
3f:   5e                      pop    %esi

Disassembly of section .text.startup:

00000000 <main>:
0:   31 c0                   xor    %eax,%eax

y86:

0x0000:                        | Disassembly of section .text:
|
0x0000:                        | 00000000 <bubble_p>:
0x0000:                        |    0:  56                      push   %esi
0x0000:                        |    1:  53                      push   %ebx
0x0000:                        |    2:  8b 44 24 10             mov    0x10(%esp),%eax
0x0000:                        |    6:  8b 54 24 0c             mov    0xc(%esp),%edx
0x0000:                        |    a:  8d 70 ff                lea    -0x1(%eax),%esi
0x0000:                        |    d:  85 f6                   test   %esi,%esi
0x0000:                        |    f:  7e 2d                   jle    3e <bubble_p+0x3e>
0x0000:                        |   11:  8d b4 26 00 00 00 00    lea    0x0(%esi,%eiz,1),%esi
0x0000:                        |   18:  31 c0                   xor    %eax,%eax
0x0000:                        |   1a:  8d b6 00 00 00 00       lea    0x0(%esi),%esi
0x0000:                        |   20:  8b 4c 82 04             mov    0x4(%edx,%eax,4),%ecx
0x0000:                        |   24:  8b 1c 82                mov    (%edx,%eax,4),%ebx
0x0000:                        |   27:  39 d9                   cmp    %ebx,%ecx
0x0000:                        |   29:  7d 07                   jge    32 <bubble_p+0x32>
0x0000:                        |   2b:  89 5c 82 04             mov    %ebx,0x4(%edx,%eax,4)
0x0000:                        |   2f:  89 0c 82                mov    %ecx,(%edx,%eax,4)
0x0000:                        |   32:  83 c0 01                add    $0x1,%eax
0x0000:                        |   35:  39 f0                   cmp    %esi,%eax
0x0000:                        |   37:  7c e7                   jl     20 <bubble_p+0x20>
0x0000:                        |   39:  83 ee 01                sub    $0x1,%esi
0x0000:                        |   3c:  75 da                   jne    18 <bubble_p+0x18>
0x0000:                        |   3e:  5b                      pop    %ebx
0x0000:                        |   3f:  5e                      pop    %esi
|
0x0000:                        | Disassembly of section .text.startup:
|
0x0000:                        | 00000000 <main>:
0x0000:                        |    0:  31 c0                   xor    %eax,%eax
|
|

### 第八周课下作业2:
1. 把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试
client.c:

/*
* echoclient.c - An echo client
*/
/* $begin echoclientmain */
#include "csapp.h"

int main(int argc, char **argv)
{
int clientfd, port;
char *host, buf[MAXLINE];
rio_t rio;

if (argc != 3) {
fprintf(stderr, "usage: %s <host> <port>\n", argv[0]);
exit(0);
}
host = argv[1];
port = atoi(argv[2]);

clientfd = Open_clientfd(host, port);
Rio_readinitb(&rio, clientfd);

while (Fgets(buf, MAXLINE, stdin) != NULL) {

time_t t;
struct tm * lt;
size_t n;
printf("\n客户端IP:127.0.0.1\n");
printf("服务器实现者学号:20155334\n");

time (&t);//获取Unix时间
lt = localtime (&t);//时间结构
printf ("当前时间为:%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。
Rio_writen(clientfd, buf, strlen(buf));
Rio_readlineb(&rio, buf, MAXLINE);
Fputs(buf, stdout);
}
Close(clientfd); //line:netp:echoclient:close
exit(0);
}
/* $end echoclientmain */

多进程实现
修改server3.c代码:

#include "csapp.h"
void echo(int connfd,char *haddrp);

void sigchld_handler(int sig) //line:conc:echoserverp:handlerstart
{
while (waitpid(-1, 0, WNOHANG) > 0)
;
return;
}

int main(int argc, char **argv)
{
int listenfd, connfd, port;
char *haddrp;
socklen_t clientlen=sizeof(struct sockaddr_in);
struct sockaddr_in clientaddr;

if (argc != 2) {
fprintf(stderr, "usage: %s <port>\n", argv[0]);
exit(0);
}
port = atoi(argv[1]);

Signal(SIGCHLD, sigchld_handler);
listenfd = Open_listenfd(port);
while (1) {
connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen);
if (Fork() == 0) {
haddrp = inet_ntoa(clientaddr.sin_addr);
Close(listenfd);
echo(connfd,haddrp);
Close(connfd);
exit(0);
}
Close(connfd);
}
}

教材内容总结

第十一章

客户端-服务器编程模型:

每个网络应用都是基于客户端-服务器模型的。在该模型中,一个应用是由一个服务器进程和一个或多个客户端进程组成的。

服务器管理某种资源:

一个Web服务器管理了一组磁盘文件,它会代表客户端进行检索和执行;

一个FTP服务器管理了一组磁盘文件,它会为客户端进行存储和检索;

一个Emial服务器管理了一些文件,它为客户端进行读和更新。

客户端-服务器模型中的基本操作是事务,它由四步组成:

客户端向服务器发送一个请求,发起一个事务;

服务器收到请求后,解释之,并操作它的资源;

服务器给客户端发送一个响应,例如将请求的文件发送回客户端;

客户端收到响应并处理它,例如Web浏览器在屏幕上显示网页。

网络域名:



第十二章

线程执行模型:







基于进程的并发编程:

构造并发编程最简单的方法就是用进程,使用那些大家都很熟悉的函数,像fork、exec和waitpid。

步骤:

1)服务器监听一个监听描述符上的连接请求。

2)服务器接受了客户端1的连接请求,并返回一个已连接描述符。

3)在接受了连接请求之后,服务器派生一个子进程,这个子进程获得服务器描述符表的完整拷贝。子进程关闭它的拷贝中的监听描述符3,而父进程关闭它的已连接描述符4的拷贝,因为不再需要这些描述符了。

4)子进程正忙于为客户端提供服务,父进程继续监听新的请求。

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周75/751/15/0
第二周135/2101/24/9
第三周234/4441/36/15
第四周486/9301/48/23
第五周753/16833/743/66
第六周503/21862/954/120
第七周823/30062/1143/163
第八周756/37621/1252/215
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

计划学习时间:XX小时

实际学习时间:XX小时

改进情况:

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

《深入理解计算机系统V3》学习指导

...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐