2017-2018-1 20155339 《信息安全系统设计基础》第8周学习总结

2017-2018-1 20155339 《信息安全系统设计基础》第8周学习总结

教材学习内容总结

第十一章

  • 每个网络应用都是基于客户端-服务器模型。
  • 客户端和服务器的基本操作是事务。
  • 一个客户端-服务器的事务由四步组成:
    1.当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务;
    2.服务器收到请求后解释它,并以适当的方式解释它;
    3.服务器给客户端发送一个响应,并等待下一个请求;
    4.客户端收到相应并处理它。
  • 对主机而,网络只是一种I/O设备。
  • 物理上而言网络是一个按照地理远近组成的层次系统。最低层是LAN(局域网),最流行的局域网技术是以太网。
  • 一个以太网段包括一些电缆和集线器。
  • 使用一些电缆和网桥,多个以太网连接成的较大局域网称为桥接以太网。
  • 多个不兼容的局域网通过路由器的特殊件算计连接起来,组成Internet。
  • 每台因特网主机上都运行实现TCP/IP协议。
  • 把因特网看成世界范围的主机集合,满足以下特性:
    1.主机集合被映射为一组32位的IP地址。
    2.这组IP地址被映射为一组称为因特网域名的标识符。
    3.因特网主机上的进程能够通过连接和任何其他主机上的进程。
  • IP地址就是一个32位无符号整数,网络字节顺序为大端字节法。
  • 因特网客户端和服务器通过在连接上发送和接收字节流来通信。
  • 套接字接口是一组函数,与Unix I/O函数结合起来,用以创建网络应用。
  • 从Linux内核的角度看,一个套接字就是通信的一个端点。从Linux程序的角度来看,套接字就是一个有相应描述符的打开文件。
  • 服务器和客户端使用socket函数创建套接字描述符。
  • 客户端调用connect函数来建立和服务器的连接。
  • 套接字函数:bindlistenaccept,服务器用她们来和客户端建立连接。
  • bind函数将addr中的服务器套接字地址和套接字描述符sockfd连接起来。
  • listen函数:监听函数。
  • accept函数:服务器等待来自客户端的请求。
  • HTTP:Web 客户端和服务器之间交互时用的一个基于文本的应用级协议。
  • HTTP 是一个简单的协议。
  • 磁盘文件称为静态内容,返回文件给客户端的过程称为服务静态内容。
  • 运行可执行文件是产生的输出称为动态内容,运行程序并返回他的输出到客户端的过程称为服务动态内容。

第十二章

  • 如果逻辑控制流在时间上重叠,那么他们就是并发的,出现在计算机系统的许多不同层面上。
  • 应用级并发在以下情况中发挥作用:
    1.访问慢速I/O设备。
    2.与人交互。
    3.通过推迟工作以降低延迟。
    4.服务多个网络客户端。
    5.在多核机器上进行并行计算。
  • 使用应用级并发的应用程序称为并发程序。现代操作系统提供了三种基本的构造并发程序的方法,如下:
    1.进程。
    2.I/O多路复用。
    3.线程。
  • 构造并发程序最简单的方法就是使用进程,使用像fork、exec和waitpid这样的函数。
  • 一个构造并发服务器的自然方法就是,在父进程中接收客户端连接请求,然后创建一个新的子进程来为每个新客户提供服务。
  • 通常服务器会运行很长的时间,所以我们必须要包括一个 SIGCHLD 处理程序,来回收僵死 (zombie) 子进程的资源。
  • 父子进程必须关闭它们各自的 connfd 拷贝。父进程必须关闭它的已连接描述符,以避免存储器泄漏。直到父子进程的 connfd 都关闭了,到客户端的连接才会终止。
  • 在父子进程之间共享状态信息,通过共享文件表,但是不共享用户地址空间。
  • I/O 多路复用(I/O multiplexing) 技术:基本的思路就是使用 select 函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
  • 使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
  • 服务器使用I/O多路复用,借助 select 函数检测输入事件的发生。服务器调用 select 函数来 检测两种不同类型的输人事件:
    1.来自一个新的客户端的连接请求到达
    2.一个己存在的客户端的己连接描述符准备好可以读了。
  • 一个状态机 (state machine) 就是一组状态 (state)、输入事件(input event) 和转移(transition),其中转移是将状态和输入事件映射到状态。
  • 自循环(self-loop) 就是同一输入和输出状态之间的转移。
  • 相比之下,基于进程的设计给了程序员更多的对进程行为的控制,运行在单一进程上下文中,每个逻辑流都能访问全部的地址空间,在流之间共享数据就变得很容易。
  • 缺点:编码复杂。伴随着并发粒度的减小,复杂性还会上升。粒度是指每个逻辑流每个时间片执行的指令数量。
  • 线程:是运行在进程上下文中的逻辑流,由内核自动调度,有自己的线程上下文,包括一个唯一的整数线程ID,栈、栈指针、程序计数器、通用目的寄存器和条件码。所有运行在一个进程里的线程共享该进程的整个虚拟地址空间。
  • 基于线程的逻辑流结合了基于进程和基于 I/O 多路复用的流的特性。
  • 线程由内核自动调度,并且内核通过一个整数 ID 来识别线程。
  • 每个进程开始生命周期时都是单一线程(主线程)。
  • Posix 线程 (Pthreads) 是在 C 程序中处理线程的一个标准接口。Pthreads定义了大约 60 个函数,允许程序创建、杀死和回收线程,与对等线程安全地共享数据,还可以通知对等线程系统状态的变化。
  • 线程的代码和本地数据被封装在一个线程例程(thread routine) 中。
  • 创建线程pthread_create 函数创建一个新的线程,并带着一个输入变量arg,在新线程的上下文中运行线程例程f。能用attr参数来改变新创建线程的默认属性。 当该函数返回时,参数 tid包含新创建线程的ID。新线程可以通过调用 pthreadself 函数来获得它自己的线程 ID。
  • 终止线程:一个线程是通过以下方式之一来终止的。
    1.当顶层的线程例程返回时,线程会隐式地终止。
    2.通过调用 pthreadexit 函数,线程会显式地终止。如果主线程调用 pthreadexit , 它会等待所有其他对等线程终止,然后再终止主线程和整个进程,返回值为 thread_return。
  • 回收已终止的线程资源:线程通过调用 pthread_ join 函数等待其他线程终止。pthread _ join函数会阻塞,直到线程tid终止,回收已终止线程占用的所有存储器资源。pthread _join函数只能等待一个指定的线程终止。 int pthread_join(pthread_t tid,void **thread_return); 成功则返回0,出错则为非零。
  • 分离线程:在任何一个时间点上,线程是可结合的 (joinable) 或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死,在被回收之前,它的存储器资源是没有被释放的。int pthread_deacth(pthread_t tid);
  • 初始化线程:pthread_once 函数允许初始化与线程例程相关的状态。
pthread_once_t once_control=PTHREAD_ONCE_INIT;  
int pthread_once(pthread_once_t *once_control,void (*init_routine)(void));  

总是返回0.

  • 一个变量是共享的,当且仅当多个线程引用这个变量的某个实例。
  • 每个线程都有自己独立的线程上下文,包括一个唯一的整数线程ID,栈、栈指针、程序计数器、通用目的寄存器和条件码。
  • 全局变量:定义在函数之外的变量,虚拟存储器的读/写区域只会包含每个全局变量的一个实例。
  • 本地自动变量:定义在函数内部但是没有static属性的变量。
  • 本地静态变量:定义在函数内部并有static属性的变量。
  • 一个变量v是共享的,当且仅当变量的一个实例被一个以上的线程引用。
  • 信号量s是具有非负整数值的全局变量,只有两种特殊的操作来处理,这两种操作称为P和V。
    1.P(s):如果s是非零的,那么P将s减一,并且立即返回。如果s为零,那么就挂起这个线程,直到s变为非零。
    2.V(s):将s加一,如果有任何线程阻塞在P操作等待s变为非零,那么V操作会重启线程中的一个,然后该线程将s减一,完成他的P操作。
  • 一个线函数被称为是线性安全的,当且仅当被多个并发线程反复的调用时,它会一直产生正确的结果。
  • 显式可重入的:所有函数参数都是传值传递,没有指针,并且所有的数据引用都是本地的自动栈变量,没有引用静态或全剧变量。
  • 隐式可重入的:调用线程小心的传递指向非共享数据的指针。
  • 当一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达他的控制流x点时,就会发生竞争。
  • 消除竞争的方法:动态的为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针
  • 死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。

实践

  • 学习这两章,我实践了课后的daytime服务器分别用多进程和多线程实现成并发服务器并测试。
  • 步骤见另一篇博客,结果如下
  • 多进程:
    -- 服务器

-- 客户端一

-- 客户端二

  • 多进程:
    -- 服务器

-- 客户端一号

-- 客户端二号

代码调试中的问题和解决过程

  • 问题1:出现下图所示问题
  • 问题1解决方案:编译时加上-lpthread来,就解决了。

代码托管

上周考试错题总结

  • 1、有关gdb调试汇编,下面说法正确的是()
    A .可以用disas反汇编当前函数
    B .以16进制形式打印%rax中内容的命令是 print /x $rax
    C .可以用info registers查看所有寄存器的值
    D .可以用info frame 查看所有栈帧的信息
    E .可以使用up,down切换栈帧
    正确答案: A B C E

  • 7、假设用ADD指令完成C表达式t=a+b的功能,有关条件码寄存器的说法正确的是()
    A .若t0 ,则ZF=1
    B .若t<0, 则CF=1
    C .若t<0, 则SF=1
    D .若(a<0
    b<0)&&(t<0 != a<0), 则OF=1
    E .若(a<0==b<0)&&(t<0 != a<0), 则CF=1
    F .leaq指令不影响条件码寄存器
    G .cmp指令不影响条件码寄存器
    正确答案: A D F

  • 9、对于下面的值,有关算术运算的指令正确的是()

Image 1.png
A .addq %rcx,(%rax), 目的地址是0x100
B .addq %rcx,(%rax), 目的地址的内容是0x100
C .subq %rdx, 8(%rax) 的值是0xA8
D .incq 16(%rax)值是12
正确答案: A B C

  • 11、以下代码是将void decode1(long *xp, long *yp, long *zp)反汇编的结果,下面说法正确的是()

A .从汇编代码看出,decode1的参数先入栈的是zp
B .从汇编代码看出,decode1的参数先入栈的是xp
C .函数功能等价于 t=x; x=y; y=z; z=t;
D .函数功能等价于 x=y; y=z; z=x;
正确答案: C

  • 16、
    ( 多选题 | 1 分)

对于图中内存地址和寄存器的值,下面说法正确的是()

Image 5.png
A .%rax的值是0x100
B .(%rax)的值是0x100
C .(%rax)的值是0x104
D .(%rax)的值是0xFF
E .4(%rax)的值是0xAB
F .(%rax,%rcx,4)的值是0xAB
G .(%rax,%rcx,4)的值是0x104
正确答案: A D E F

  • 21、x86-64中指令长度是()字节
    A .1
    B .2
    C .4
    D .1-4
    E .1-8
    F .1-15
    G .1-16
    H .以上都不对
    正确答案: F
  • Linux信号处理说法正确的是()
    A .
    可以用signal()处理信号
    B .
    一个信号最多只能被接收一次
    C .
    kill(1)用来杀死进程
    D .
    kill(1)用来发送信号
    E .
    可以通过键盘发送信号
    F .
    可以用sigaction()处理信号
    正确答案:A B D E F
  • 有关exec系列函数,下面说法正确的是()
    A .
    可以用char[][] 来传递argv
    B .
    进程调用了exec系列函数后,pid会变
    C .
    进程调用了exec系列函数后,代码会改变。
    D .
    system()和exec系列等价。
    E .
    exec系列函数中带e的要传入环境变量参数
    F .
    exec系列函数中带v的要传入环境变量参数
    正确答案:C E
  • 关于代码 int main(){} 说法正确的是()
    A .
    返回值是0
    B .
    返回值不确定
    C .
    会调用exit(0)
    D .
    返回值大于0
    E .
    上面代码运行完,在命令行中运行echo $? 的值是0
    正确答案:A C E
  • Unix/Linux中通过调用( )可以获取子进程PID。
    A .
    getpid()
    B .
    getppid()
    C .
    getcpid()
    D .
    fork()
    正确答案:D
  • 有关异常,下面说法正确的是()
    A .
    系统中的异常由异常名唯一确定
    B .
    异常表中存放的是异常处理程序
    C .
    异常表的起始地址存放在异常表基址寄存器中
    D .
    异常处理程序运行在内核模式下
    正确答案:C D
  • Linux中,信号(Signal)是一种()异常控制流。
    A .
    硬件层
    B .
    操作系统层
    C .
    用户层
    D .
    网络层
    正确答案: C

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 其他

本周结对学习情况

- [20155306](https://home.cnblogs.com/u/0831j/)
- 结对照片
- 结对学习内容
    第十一、十二章

其他(感悟、思考等,可选)

学习效率依旧较低。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90
第五周 300/1300 2/9 30/90
第六周 706/2006 1/10 50+/140+
第七周 838/2838 1/11 23/163
第八周 150/3088 2/13 40/203

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:20小时

  • 实际学习时间:40小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/pingcpingcuo/p/7822211.html