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

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

教材学习内容总结

第11章网络编程

1.客户端-服务器编程模型

一个服务器进程 -> 管理某种资源 -> 通过操作这种资源来为它的客户端提供某种服务
一个或多个客户端进程
  • 基本操作:事务

    当一个客户端需要服务时,向服务器发送一个请求,发起一个事务。 服务器收到请求后,解释它,并以适当的方式操作它的资源。 服务器给客户端发送一个相应,并等待下一个请求。 客户端收到响应并处理它。

  • 客户端和服务器都是进程。

2.网络

(1)对主机而言:网络是一种I/O设备 (2)物理上:网络是一个按照地理远近组成的层次系统 (3)协议 (4)全球IP因特网

3.套接字

  • 函数:

    • socket函数
    • connect函数
    • open_clientfd函数
    • bind函数
    • listen函数
    • open_listenfd函数
    • accept函数

4.Web服务器

(1)协议

  • Web 客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做 HTTP (Hypertext Transfer Protocol,超文本传输协议). HTTP 是一个简单的协议。一个 Web 客户端(即浏览器) 打开一个到服务器的因特网连接,并且请求某些内容。服务器响应所请求的内容,然后关闭连接。浏览器读取这些内容,并把它显示在屏幕上。

(2)内容

  • Web内容可以用一种叫做 HTML(Hypertext Markup Language,超文本标记语言)的语言来编写。一个 HTML 程序(页)包含指令(标记),它们告诉浏览器如何显示这页中的各种文本和图形对象。
  • Web 服务器以两种不同的方式向客户端提供内容:
    • 取一个磁盘文件,并将它的内容返回给客户端。磁盘文件称为静态内容 (static content), 而返回文件给客户端的过程称为服务静态内容 (serving static content)。 运行一个可执行文件,并将它的输出返回给客户端。运行时可执行文件产生的输出称为态内容 (dynamic content),而运行程序并返回它的输出到客户端的过程称为服务动态内容 (serving dynamic content)。

第12章并发编程

  • 并发:逻辑控制流在时间上重叠
  • 并发程序:使用应用级并发的应用程序称为并发程序。
  • 三种基本的构造并发程序的方法:
    • 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。
    • I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。
    • 线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。
基于进程的并发编程
  • 构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
  • 因为父子进程中的已连接描述符都指向同一个文件表表项,所以父进程关闭它的已连接描述符的拷贝是至关重要的,而且由此引起的存储器泄露将最终消耗尽可用的存储器,使系统崩溃。
  • 基于进程的并发echo服务器的重点内容:
    • 需要一个SIGCHLD处理程序,来回收僵死子进程的资源。
    • 父子进程必须关闭各自的connfd拷贝。对父进程尤为重要,以避免存储器泄露。
    • 套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
  • 进程的模型:共享文件表,但不是共享用户地址空间。
  • Unix IPC是指所有允许进程和同一台主机上其他进程进行通信的技术,包括管道、先进先出(FIFO)、系统V共享存储器,以及系统V信号量。
基于线程的并发编程
  • 线程:运行在进程上下文中的逻辑流。
  • 线程有自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。所有运行在一个进程里的线程共享该进程的整个虚拟地址空间。
  • 主线程:每个进程开始生命周期时都是单一线程。
  • 对等线程:某一时刻,主线程创建的对等线程 。
  • 线程与进程的不同:
    • 线程的上下文切换要比进程的上下文切换快得多;
    • 和一个进程相关的线程组成一个对等池,独立于其他线程创建的线程。
    • 主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。
  • 对等池的影响: 一个线程可以杀死它的任何对等线程;等待它的任意对等线程终止;
  • 每个对等线程都能读写相同的共享资源。
  • 线程例程:线程的代码和本地数据被封装在一个线程例程中。每一个线程例程都以一个通用指针作为输入,并返回一个通用指针。
  • 创建线程

    pthread create函数创建一个新的线程,并带着一个输入变量arg,在新线程的上下文中运行线程例程f。新线程可以通过调用pthread _self函数来获得自己的线程ID。

  • 终止线程
    • 一个线程的终止方式:

      1. 当顶层的线程例程返回时,线程会隐式的终止;
      2. 通过调用pthread _exit函数,线程会显示地终止。如果主线程调用pthread _exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程。
  • 回收已终止线程的资源

    pthread _join函数会阻塞,直到线程tid终止,回收已终止线程占用的所有存储器资源。pthread _join函数只能等待一个指定的线程终止。

  • 分离线程

    在任何一个时间点上,线程是可结合的或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死;一个可分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时有系统自动释放。

    默认情况下,线程被创建成可结合的,为了避免存储器漏洞,每个可集合的线程都应该要么被其他进程显式的回收,要么通过调用pthread _detach函数被分离。

  • 初始化线程

    pthread _once函数允许初始化与线程例程相关的状态。

    once _control变量是一个全局或者静态变量,总是被初始化为PTHREAD _ONCE _INIT.

基于I/O多路复用的并发编程
  • echo服务器必须响应两个相互独立的I/O时间: 网络客户端发起连接请求、用户在键盘上键入命令行
  • I/O多路复用技术的基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
  • echo函数:将来自科幻段的每一行回送回去,直到客户端关闭这个链接。
  • 状态机就是一组状态、输入事件和转移,转移就是将状态和输入时间映射到状态,自循环是同一输入和输出状态之间的转移。
  • 事件驱动器的设计优点:
    • 比基于进程的设计给了程序员更多的对程序行为的控制
    • 运行在单一进程上下文中,因此,每个逻辑流都能访问该进程的全部地址空间,使得流之间共享数据变得很容易。
    • 不需要进程上下文切换来调度新的流。
  • 缺点: 编码复杂、不能充分利用多核处理器
线程存储器模型
  • 每个线程和其他线程一起共享进程上下文的剩余部分。包括整个用户虚拟地址空间,是由只读文本、读/写数据、堆以及所有的共享库代码和数据区域组成的。线程也共享同样的打开文件的集合。
  • 任何线程都可以访问共享虚拟存储器的任意位置。寄存器是从不共享的,而虚拟存储器总是共享的。
  • 将变量映射到存储器
    • 全局变量:虚拟存储器的读/写区域只会包含每个全局变量的一个实例。
    • 本地自动变量:定义在函数内部但没有static属性的变量。
    • 本地静态变量:定义在函数内部并有static属性的变量。
  • 共享变量
    • 变量v是共享的,当且仅当它的一个实例被一个以上的线程引用。
  • 用信号量同步线程
    • 共享变量引入了同步错误的可能性。
    • 线程i的循环代码分解为五部分:

      Hi:在循环头部的指令块

      Li:加载共享变量cnt到寄存器%eax的指令,%eax表示线程i中的寄存器%eax的值

      Ui:更新(增加)%eax的指令

      Si:将%eaxi的更新值存回到共享变量cnt的指令

      Ti:循环尾部的指令块。

  • 进度图
  • 进度图将指令执行模式化为从一种状态到另一种状态的转换。转换被表示为一条从一点到相邻点的有向边。合法的转换是向右或者向上。
  • 临界区:对于线程i,操作共享变量cnt内容的指令构成了一个临界区。
  • 互斥的访问:确保每个线程在执行它的临界区中的指令时,拥有对共享变量的互斥的访问。
  • 安全轨迹线:绕开不安全区的轨迹线 不安全轨迹线:接触到任何不安全区的轨迹线就叫做不安全轨迹线
  • 任何安全轨迹线都能正确的更新共享计数器。
  • 使用信号量来实现互斥
  • 二元信号量:将每个共享变量与一个信号量s联系起来,然后用P(S)和V(s)操作将这种临界区包围起来,这种方式来保护共享变量的信号量。
  • 互斥锁:以提供互斥为目的的二元信号量
  • 加锁:一个互斥锁上执行P操作称为对互斥锁加锁,执行V操作称为对互斥锁解锁。对一个互斥锁加了锁但还没有解锁的线程称为占用了这个互斥锁。
  • 计数信号量:一个呗用作一组可用资源的计数器的信号量
  • 竞争
    • 竞争:当一个程序的正确性依赖于一个线程要在另一个线程到达y点之前到达它的控制流中的x点时,就会发生竞争。
    • 线程化的程序必须对任何可行的轨迹线都正确工作。
    • 消除方法:动态的为每个整数ID分配一个独立的块,并且传递给线程例程一个指向这个块的指针
  • 死锁
    • 死锁:一组线程被阻塞了,等待一个永远也不会为真的条件。
    • 程序员使用P和V操作不当,以至于两个信号量的禁止区域重叠。
    • 重叠的禁止区域引起了一组称为死锁区域的状态。
    • 死锁是不可预测的。

代码托管

代码练习

注意:本章代码是多线程编译,pthread库不是linux系统默认的库,因此在编译的时候需要加上-lpthread参数。

countwithmutex.c

  • PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁。先创建tidA线程后运行doit函数,利用互斥锁锁定资源,进行计数,执行完毕后解锁。后创建tidB,与tidA交替执行。由于定义的NLOOP值为5000,所以程序最后的输出值为10000.程序的最后还需要分别回收tidAtidB的资源。

count.c

  • 差别在于这个代码countwithmutex.c与代码doit函数的for循环中没有引入互斥锁,只进行了单纯的计数,创建两个线程共享同一变量都实现加一操作。

condvar.c

  • 主函数中用srand(time(NULL))设置当前的时间值为种子,在后面的producer和consumer函数中调用rand()函数产生随机数。

cp_t.c

  • mmap函数void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);将一个文件或者其他对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。
  • 成功执行时,mmap()返回被映射区的指针,munmap()返回0.失败时,mmap()返回MAP_FAILED,munmap返回-1.

createthread.c

  • 程序主要演示了创建线程函数pthread_create()函数的使用,用来打印进程和线程的ID

semphore.c

  • sem_init函数sem_init(sem_t *sem, int pshared, umsigned int value); 函数初始化一个定位在sem的匿名信号量;pshared参数为0指明信号量是由进程内线程共享,若为非0值则信号量在进程之间共享;value参数指定信号量的初始值。
  • sem_init()成功时返回0;错误时返回-1,并把errno设置为合适的值。

share.c

  • 运行结果

threadexit.c

  • 运行结果

hello_multi.c

  • 程序中的print_msg()函数中:在printf后的fflush(stdout);说明要立刻将要输出的内容输出,每输出一次停1秒,并循环5次。

hello_single.c

  • 根据代码,先单独执行print_msg("hello");——输出5个hello,后输出5个带换行的world

incprint.c

  • 由于定义中NUM=5,所以输出的count为1——5

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

  • 难过

学习进度条

|            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| --------   | :----------------:|:----------------:|:---------------:  |:-----:|
| 目标        | 5000行            |   30篇           | 400小时            |       |
| 第一周      | 200/200           |   2/2            | 20/20             |       |
| 第二周      | 300/500           |   2/4            | 18/38             |       |
| 第三周      | 500/1000          |   3/7            | 22/60             |       |
| 第四周      | 600/1300          |   4/9            | 30/90             |       |
| 第五周      | 650/1300          |   5/9            | 40/90             |       |
| 第六周      | 700/1300          |   6/9            | 50/90             |       |
| 第七周      | 800/1300          |   7/9            | 60/90             |       |
| 第八周      | 1200/1700         |   8/10           | 80/110            |       |

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

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

  • 计划学习时间:10小时
  • 实际学习时间:10小时

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

参考资料

时间: 2024-08-01 20:55:14

2017-2018-20155336 《信息安全系统设计基础》第八周学习总结的相关文章

信息安全系统设计基础第八周学习总结

第十章 系统级I/O 怎样学习系统编程(利用Linux学习Linux编程) 一.Unix I/O 一个Unix文件就是一个m字节的序列:B0,B1,B2,…,Bk,…,Bm-1 二.打开和关闭文件 1.进程通过调用open函数来打开一个已存在的文件或者创建一个新文件的: Int open(char *filename, int flags, mode_t mode); 2.通过调用close函数关闭一个打开的文件: Int close(int fd); 三.读和写文件 1.分别调用read和wr

信息安全系统设计基础第八周学习总结-吕松鸿

第10章 系统级I/O I/O:在主存和外部设备之间拷贝数据的过程. 10.1Unix I/O 一个Unix文件就是一个m个字节的序列: B0,B1,B2…Bk…B(m-1) 1.所有的输入输出都能以一种统一且一致的方式来执行: (1)打开文件 a.描述符:内核返回一个小的非负整数,它在后续对此文件的所有操作中标识这个文件. b. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0).标准输出(描述符为1).标准错误(描述符为2). (2)改变当前的文件设置. (3)读写文

信息安全系统设计基础第八周学习笔记

系统级I/O 前言:输入/输出是在主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程.输入操作时从I/O设备拷贝数据到主存,而输出操作时从主存拷贝数据到I/O设备. 10.1  Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,B2,B3...Bk...Bm-1. 所有的I/O设备,如网络.磁盘盒终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行.这是一种应用接口,成为Unix I/O. ①打开文件:一个应用程序通过要求内核打开相应地文件,

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

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

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

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

2017-2018-1 20155227 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 第六章 随机访问存储器 随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. (1)静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. 特点:由于SRAM的双稳态特性,只要有电,它就会永

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

2017-2018-1 20155334 <信息安全系统设计基础>第九周学习总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 教材学习内容总结 一.常见的存储技术: 基本的存储技术包括随机存储器(RAM).非易失性存储器(ROM)和磁盘. 1. RAM分静态RAM(SRAM)和动态RAM(DRAM). 2. SRAM快些,主要用做CPU芯片上的高速缓存,也可以用作芯片下的

2018-2019-1 20165225《信息安全系统设计基础》第九周学习总结

2018-2019-1 20165225<信息安全系统设计基础>第九周学习总结 教材学习内容总结 1.理解虚拟存储器的概念和作用; 2.理解地址翻译的概念; 3.理解存储器映射; 4.掌握动态存储器分配的方法; 5.理解垃圾收集的概念; 6.了解C语言中与存储器有关的错误; 虚拟存储器 物理和虚拟寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址.CPU根据物理地址访问存储器的方式是物理寻址. 虚拟存储器被组织为一个由存放在磁盘上的N个连续的字

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E