20145202 《信息安全系统设计基础》第12周学习总结(2)
课本知识总结
11网络编程
11.1客户端-服务器编程模型
- 一个应用是由一个服务器进程或者多个客户端进程组成的
- 客户端-服务器模型中的基本操作是事物,四步
1.当一个客户端需要服务时,他向服务器发送一个请求,发起一个事务。
2.服务器接收到以后,解释他,并且以适当的方式操作他的资源。
3.服务器给客户端发送一个响应,并等待下一个请求。
4.客户端收到响应并且处理他。
11.2网络
- 客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
- 最流行的局域网技术是以太网。
- 一个以太网段包括一些电缆和一个叫集线器的小盒子。
- 多个以太网段可以连接成较大的局域网,成为桥接以太网。
- 每台路由器对于他所连接到的每个网络都有一个适配器(端口)。
- 协议有的两种能力:
1.命名机制
2.传送机制 - 一个主机和路由器如何使用互联网协议在不兼容的局域网间传送数据,8个步骤:P617
11.3全球IP因特网
- 每台主机都运行实现TCP/IP协议的软件,几乎每个计算机都支持这个协议。
- TCP和UDP区别:P619
- 因特网满足以下特性:
1.主机集合被映射为一组32位的IP地址
2.这组IP地址被映射为一组成为因特网域名的标识符。
3.因特网主机上的进程能够通过链接和任何其他因特网主机上的进程通信。 - TCPIP为任意正整数数据定义了一项统一的网络字节顺序(大端字节顺序)
11.4套接字接口
- 套接字接口是一组函数,他们和UnixI/O函数结合起来,用于创建网络应用。往后还有各种函数P625
12并发编程
- 访问慢速I/O设备:
- 与人交互:
- 通过推迟工作以降低延迟
- 服务多个网络客户端:
- 在多核机器上进行并发运算
- 进程:
- I/O多路复用:
- 线程:
12.1基于进程的并发编程
12.2基于I/O多路复用的并发编程
- select函数:等待一组描述符准备好读
- init_pool:初始化池
- add_client:将客户端添加到池里
- check_clients:把每一个准备好的链接描述符的一个文本回送回去。
12.3基于线程的并发编程
- 线程就是运行在进程上下文中的逻辑流。
- pthread_create:创建一个新的线程,并带着一个输入变量arg,返回时,参数tid包含新创建的线程ID。
- 一个线程的终止:P659
- pthread_join:等待其他函数终止。
- 在任何一个时间点上,线程是可结合的,或者是分离的。
- pthread_detach:分离可结合线程tid。
- pthread_once:允许初始化与线程例程相关的状态。
- pthread_control:他是一个变量,全局变量或者静态量。
12.4多线程程序中的共享变量
P662
12.5用信号量同步线程
- 共享变量会引起同步错误。
12.6使用线程提高并行性
12.7其他并发问题
课后题的的学习
2.68
3.67
A:
根据联合体的所有成员相对于基地址的偏移量都为0这一点,加上int占有4个字节,而地址(*next)也占有四个字节,即可做出此题。
e1.p:0
e1.x:4
e2.y:0
e2.next:4
B:
根据联合体的字节补齐和其满足的两个条件即可做出此题。
e1中int *p --4字节 int x---4字节 和为8字节
e2中int y --4字节 union ele *next --4字节 和为8字节
因为两个结构体所占有的字节大小均为8且符合字节补齐规则,所以该联合体结构总共需要8个字节。
C:
在做此题前先明确该联合体中,需要先访问成员才可以访问成员中的变量这一点,即你要获取x,必须要先获得e1,而后进入e1结构体访问x,最终形成e1.x。
1.很明显的movl 8(%ebp),%edx 此语句作用为get up at %edx
2.试着按顺序写出语句,但发现并不能确定每一个语句准确表示的是什么,所以就观察其中有特点的语句进行分析。
3.发现语句中subl (%edx), %eax表示为%eax = eax - (%edx),(%edx)为整数,并且%edx保存的是up,满足条件且偏移量为0的情况只有e2.y即,减数为up->e2.y。同时可得被减数存储在%eax中。
4.题目中有*(up->__)表示一个整数这个信息,再对应联合体结构中仅有int *p满足该条件,并且在汇编代码中,由上一步可知被减数存储在%eax中,可知movl (%eax), %eax是对被减数赋值的语句,可得在此语句之前%eax为地址,并且应该为up->e1.p,即被减数应该为up->e1.p。
5.但再往上看发现第三行的%eax是由(%ecx)获得,并且%ecx由4(%edx)获得,但%edx指向了up->e2.y,所以被减数应该是有4的偏移量,明显的%ecx应该为up->e2.next,对应的%eax为up->e2.next->e1.p。
6.最终只剩下得数的表示了,明显对应的是movl %eax,4(%ecx)这条语句,%ecx为up->e2.next,%ecx+4应该为up->e2.next->e1.x,即得数为up->e2.next->e1.x。
最终的结果:
up->e2.next->e1.x = *(up->e2.next->e1.p) - up->e2.y
4.47
取值:icode:ifun<-----M1[pc]=D:0 #题目中的已知条件
valP<-----pc+1 #这个指令只有表明指令类型的一个字节,所以下一条指令的地址只需要加上1.
译码:valA<----R[%ebp] #因为本条leave指令相当于 rrmovl %ebp,%esp;popl %esp;所以读取%ebp的地址值是必须的。
valB<----R[%esp] #因为popl %esp;所以读取%esp的地址值是必须的。
执行:valE<-----valB+4 #弹栈需要将栈顶指针%esp增加4.
访存:valM<----M4[valA] #将%ebp的值读入存储器
写回:R[%esp]<----valE #栈顶指针下移
R[%ebp]<----valM #将栈顶的值放入%esp中
更新PC:PC<----valP #下一条指令的地址
思路:前提:leave相当于rrmovl %ebp,%esp;popl %ebp;参照了书上popl指令在顺序中的计
算。在这道题中思考明白了一个问题,就是rrmovl rA,%esp;与pushl rA;的区别。前者是将rA的地址复制到栈顶指针指向的位置,指针并不移动,后者是将rA的地址压入栈,指针地址值减去4,指针上移。
6.31
7.11
- 3、4行是数据段,开始于存储器地址0x08049448的位置,总的存储器大小是0x194字节,从文件偏移的0x448处开始的0xe8个字节初始化。
- 在加载之前,未初始化的全局变量不会在目标文件中分配存储空间,但是在加载之后,像.bss中的符号等数据需要占用空间,所以剩下的字节对应运行时将被初始化为0的.bss数据.
8.10
A. 调用一次,返回两次: fork
B. 调用一次,从不返回: execve, longjmp
C. 调用一次,返回一次或者多次: setjmp
9.13
A.虚拟地址:0x0040
13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0
B.地址翻译
参数 值
VPN 0x01
TLB索引 0x01
TLB标记 0x00
TLB命中 No
缺页 Yes
PPN -
10.6
输出 fd2 = 4
因为已经有0 1 2被打开,fd1是3,fd2是4,关闭fd2之后再打开,还是4。
10.7
int main(int argc, char **argv)
{
int n;
rio_t rio;
char buf[MAXBUF];
Rio_readinitb(&rio, STDIN_FILENO);
while((n = Rio_readnb(&rio, buf, MAXBUF)) != 0)
Rio_writen(STDOUT_FILENO, buf, n);
}
12.18
XXXX
遇到的问题
第一次出现这个框,还以为虚拟机炸了
现在虚拟机没问题但是小键盘不能用了,只要用小键盘输入数字的话就会出现这种情况
代码的学习
XXXX
代码托管
http://git.oschina.net/tuolemi/haha