2017-2018-1 20155214 《信息安全系统设计基础》 第8周课下作业
2017-11-12 13:32
387 查看
2017-2018-1 20155214 《信息安全系统设计基础》
第8周课下作业
课下练习内容
完成家庭作业4.47,4.48,4.49
相应代码反汇编成X86-64汇编
把上述X86-64汇编翻译成Y86汇编,并给出相应机器码
把课上练习3的datetime服务器分别用多进程和多线程实现成并发服务器并测试
家庭作业4.47
作业要求:
写一个执行冒泡排序的Y86-64程序
A:书写并测试一个C版本,用指针引用数组元素,而不是用数组索引。
B:书写并测试这个函数和测试代码组成的Y86-64程序。
指针版本的冒泡排序
/*Bubble sorts:Pointer version*/ void bubble_p(long *data,int count){ long i,last,t; for(last = count-1;last > 0; last--){ for(i = 0;i < last; i++){ if(*(data+i+1)<*(data+i)){ t = *(data+i+1); *(data+i+1) = *(data+i); *(data+i) = t; } } } }
先使用
gcc -O2 -c bubble.c优化编译冒泡排序,这样编译出来的汇编代码量比较少。
使用命令
objdump -d bubble.o > bubble_x86-64.txt将反汇编的x86-64汇编代码储存到文本中。
然后我们打开y86-64模拟器,将x86-64代码翻译为y86-64代码
bubble.c(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
datetime服务器
作业要求:
1.实现多进程的并发服务器
2.实现多线程的并发服务器
多进程的并发服务器
设计思路在datetime服务器的基础上,在服务器循环监听中调用fork()生成子进程连接下一个客户端。其中需要用到一个SIGCHLD处理程序回收子进程资源。
void sigchld_handler(int sig){ pid_t pid; int stat; while((pid = waitpid(-1,&stat,WNOHANG))>0){ printf("child %d terminated\n",pid); } return; }
SIGCHLD的产生条件:
子进程终止时
子进程接收到SIGSTOP信号停止时
子进程处在停止态,接受到SIGCONT后唤醒时
借助SIGCHLD信号回收子进程
signal 的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示忽略掉该信号而不做任何处理)。signal如果调用成功,返回以前该信号的处理函数的地址,否则返回 SIG_ERR。
多线程的并发服务器
设计思路主线程监听客户端请求,创建对等线程返回时间。
通过指针
connfdp传递链接描述符
connfd,保证对等线程接收到与主线程通信的客户端。
在实现服务器代码时一度出现了
free(): invalid pointer:字样的错误
原因是, 在line:68,错误的将accept()函数返回的地址值赋值给了指针
connfdp,而不是指针储存的地址的内容。导致指针
connfdp地址值被更改。
而free()传入的地址不是 malloc 返回的地址,只有 malloc返回的地址才能free(),造成了错误。
在实现服务器代码时,对于主线程与对等线程,只在line:128关闭了一次连接符?
原因是不管主线程还是对等线程都运行在同一个进程中,共享相同的描述符表,并且以上代码通过指针传递描述符,并未增加描述符的个数。因此在代码中只需要关闭一次连接描述符即可。
最终运行截图
相关文章推荐
- 2017-2018-1 20155214 《信息安全系统设计基础》 第6周课下作业
- 2017-2018-1 20155214 《信息安全系统设计基础》 第8周学习总结
- 2017-2018-1 20155214 《信息安全系统设计基础》课程学习总结
- 2017-2018-1 20155214 《信息安全系统设计基础》 第9周学习总结
- 2017-2018-1 20155214 《信息安全系统设计基础》 第6周学习总结
- 2017-2018-1 20155214 《信息安全系统设计基础》 第11周学习总结
- 2017-2018-1 20155214 《信息安全系统设计基础》 第9周课下测试-mypwd
- 2017-2018-1 20155321 《信息安全系统设计基础》课下作业3
- 2017-2018-1 20155214 《信息安全系统设计基础》 第5周学习总结
- 2017-2018-1 20155229 《信息安全系统设计基础》课下作业
- 20155325 2017-2018 1 课上测试、课下作业、实验——码云&博客链接汇总 《信息安全系统设计基础》
- 2017-2018-1 20155214 《信息安全系统设计基础》 第7周学习总结
- 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd
- 2017-2018-1 20155214 《信息安全系统设计基础》实验三 并发程序
- 2017-2018-1 20155327 《信息安全系统设计基础》课堂测试&课下作业
- 2017-2018-1 20155336 《信息安全系统设计基础》加分作业:实现mypwd
- 2017-2018-1 20155215《信息安全系统设计基础》课程总结
- 2017-2018-1 20155314《信息安全系统设计基础》实验五 通讯协议设计
- 20155336 2017-2018 1 《信息安全系统设计基础》2017-9-27课堂实践
- 2017-2018-1 20155331+20155336《信息安全系统设计基础》实验一报告