zoukankan      html  css  js  c++  java
  • 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小时

    • 改进情况:

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

    参考资料

  • 相关阅读:
    java中会存在内存泄漏吗,请简单描述?
    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
    SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
    SpringMVC怎么样设定重定向和转发的?
    Spring MVC的异常处理 ?
    如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
    Spring是什么?
    SpringMvc用什么对象从后台向前台传递数据的?
    SpringMvc中函数的返回值是什么?
    BeanFactory和ApplicationContext有什么区别?
  • 原文地址:https://www.cnblogs.com/pingcpingcuo/p/7822211.html
Copyright © 2011-2022 走看看