20145230 《信息安全系统设计基础》第十三周学习总结
20145230 《信息安全系统设计基础》第十三周学习总结
教材学习内容总结
网络编程
- 每个网络应用都是基于客户端-服务器模型的,一个应用是有一个或者多个客户端进程组成的。
- 客户端-服务器模型中的基本操作是事务:
1.当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
2.服务器收到请求后,解释它,并以适当的方式操作它的资源。
3.服务器给客户端发送一个响应,并等待下一个请求。
4.客户端收到响应并处理它。 - 物理上而言,网络时一个按照地理远近组成的层次系统。最低层是LAN。
- 一个以太网段包括一些电缆(通常是双绞线)和一个叫做集线器的小盒子。电缆一端连接到主机的适配器,另一端连接到集线器的一个端口上。
- 每个以太网适配器都有一个全球唯一的48位地址,一台主机可以发送一段位,称为帧,到这个网段内其他任何主机。
- 使用一些电缆和叫做网桥的小盒子,多个以太网段可以连接成较大的局域网,称为桥接以太网,一些电缆连接网桥与网桥,而另外一些连接网桥和集线器。
- 网桥比集线器更充分地利用了电缆带宽,在层次的更高级别中,多个不兼容的局域网可以通过叫做路由器的特殊计算机连接起来,组成一个internet。
- 下一软件消除了不同网络之间的差异,这种协议控制主机和路由器如何协同工作来实现数据传输。
- 命名机制:不同的局域网技术有不同和不兼容的方式来为主机分配地址。
- 传送机制:在电缆上编码位和将这些位封装成帧方面,不痛的联网技术有不同的和不兼容的方式。
- 每台因特网主机都运行实现TCP/IP协议(传输控制协议/互联网络协议)的软件,几乎每个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。
- IP协议提供基本的命名方法和递送机制,TCP是一个构建在IP之上的复杂协议,提供了进程间可靠的全双工(双向的)连接。
- TCP/IP为任意整数数据项定义了统一的网络字节顺序。htonl函数将32位整数由主机字节顺序转换为网络字节顺序。ntohl函数将32位整数从网络字节顺序转换为主机字节。
- localhost名字为引用运行在同一台机器上的客户端和服务器提供了一种便利的可移植的方式,这对调试相当有用。
- 因特网客户端和服务器 通过在连接上发送和接收字节流来通信,一个套接字是连接的一个端点。服务器套接字地址中的端口通常是某个知名的端口,是和这个服务相对应的。
- 一个连接是由它两端的套接字地址唯一确定的。这对套接字地址叫做套接字对。
- 套接字接口是一组函数,它们和Unix I/O函数结合起来,用以创建网络应用。
- 客户端和服务器使用socket函数来创建一个套接字描述符。AF-INET表明我们正在使用因特网,而SOCK-STREAM表示这个套接字是因特网连接的一个端点。
- 客户端通过调用connect函数来建立和服务器的连接。
- open_clientfd函数和运行在主机hostname上的服务器建立一个连接,并在知名端口port上监听连接请求。
- bind函数告诉内核将my_addr中的服务器套接字地址 和套接字描述符sockfd联系起来。
- 服务器调用listen函数告诉内核,描述符是被服务器而不是客户端使用的。
- open_listenfd函数打开和返回一个监听描述符,这个描述准备好在知名端口port上接受连接请求。
- 服务器通过调用accept函数来等待来自客户端的连接请求。
- Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP。
并发编程
-
并发:逻辑控制流在时间上重叠
-
并发程序:使用应用级并发的应用程序称为并发程序。
-
三种基本的构造并发程序的方法: 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。
-
I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。
-
线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。
-
基于进程的并发编程
-
构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
-
因为父子进程中的已连接描述符都指向同一个文件表表项,所以父进程关闭它的已连接描述符的拷贝是至关重要的,而且由此引起的存储器泄露将最终消耗尽可用的存储器,使系统崩溃。
-
基于进程的并发echo服务器的重点内容: 需要一个SIGCHLD处理程序,来回收僵死子进程的资源。
-
父子进程必须关闭各自的connfd拷贝。对父进程尤为重要,以避免存储器泄露。
-
套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
-
进程的模型:共享文件表,但不是共享用户地址空间。
-
关于进程的优劣: 优点:一个进程不可能不小心覆盖两一个进程的虚拟存储器。
-
缺点:独立的地址空间使得进程共享状态信息变得更加困难。进程控制和IPC的开销很高。
-
Unix IPC是指所有允许进程和同一台主机上其他进程进行通信的技术,包括管道、先进先出(FIFO)、系统V共享存储器,以及系统V信号量。
-
基于I/O多路复用的并发编程
-
echo服务器必须响应两个相互独立的I/O时间: 网络客户端发起连接请求
-
用户在键盘上键入命令行
-
I/O多路复用技术的基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
-
将描述符集合看成是n位位向量:b(n-1),……b1,b0 ,每个位bk对应于描述符k,当且仅当bk=1,描述符k才表明是描述符集合的一个元素。可以做以下三件事:
-
分配它们;
-
将一个此种类型的变量赋值给另一个变量;
-
用FDZERO、FDSET、FDCLR和FDISSET宏指令来修改和检查它们。
-
echo函数:将来自科幻段的每一行回送回去,直到客户端关闭这个链接。
-
状态机就是一组状态、输入事件和转移,转移就是将状态和输入时间映射到状态,自循环是同一输入和输出状态之间的转移。
-
事件驱动器的设计优点:
-
比基于进程的设计给了程序员更多的对程序行为的控制
-
运行在单一进程上下文中,因此,每个逻辑流都能访问该进程的全部地址空间,使得流之间共享数据变得很容易。
-
不需要进程上下文切换来调度新的流。
-
缺点:
-
编码复杂
-
不能充分利用多核处理器
-
粒度:每个逻辑流每个时间片执行的指令数量。并发粒度就是读一个完整的文本行所需要的指令数量。
-
用信号量同步线程
-
共享变量引入了同步错误的可能性。
-
线程i的循环代码分解为五部分:
-
Hi:在循环头部的指令块
-
Li:加载共享变量cnt到寄存器%eax的指令,%eax表示线程i中的寄存器%eax的值
-
Ui:更新(增加)%eax的指令
-
Si:将%eaxi的更新值存回到共享变量cnt的指令
-
Ti:循环尾部的指令块。
-
进度图
-
进度图将指令执行模式化为从一种状态到另一种状态的转换。转换被表示为一条从一点到相邻点的有向边。合法的转换是向右或者向上。
-
临界区:对于线程i,操作共享变量cnt内容的指令构成了一个临界区。
-
互斥的访问:确保每个线程在执行它的临界区中的指令时,拥有对共享变量的互斥的访问。
-
安全轨迹线:绕开不安全区的轨迹线。
不安全轨迹线:接触到任何不安全区的轨迹线就叫做不安全轨迹线。 -
任何安全轨迹线都能正确的更新共享计数器。
-
使用线程提高并行性
-
写顺序程序只有一条逻辑流,写并发程序有多条并发流,并行程序是一个运行在多个处理器上的并发程序。并行程序的集合是并发程序集合的真子集。
-
其他并发问题
-
线程安全
-
线程安全:当且仅当被多个并发线程反复地调用时,它会一直产生正确的结果。
-
线程不安全:如果一个函数不是线程安全的,就是线程不安全的。
-
线程不安全的类: 不保护共享变量的函数
-
保持跨越多个调用的状态的函数。
-
返回指向静态变量的指针的函数。解决办法:重写函数和加锁拷贝。
-
调用线程不安全函数的函数。
-
可重入性
-
可重入函数:当它们被多个线程调用时,不会引用任何共享数据。可重入函数是线程安全函数的一个真子集 。
-
关键思想是我们用一个调用者传递进来的指针取代了静态的next变量。
-
显式可重入:没有指针,没有引用静态或全局变量
-
隐式可重入:允许它们传递指针
-
可重入性即使调用者也是被调用者的属性,并不只是被调用者单独的属性。
代码运行
-
condvar
-
count
-
countwithmutex
-
cp_t
-
createThread
-
semphore
-
share
-
threadexit
本周代码截图
- 20145230/IS-design-20145230 - 码云 - 开源中国 https://git.oschina.net/20145230/IS-design-20145230
心得体会
本周学习的内容书本上的内容有两章,分别是网络编程和并发编程,网络编程主要是讲述的是客户端和服务器之间连接过程,二并发编程主要介绍的是逻辑控制流在时间上的重叠,就是一种操作系统内核用来运行多个应用程序的机制。然后这周也编译运行了一些代码,感觉任务特别特别多,因为下一个星期又有20分的考试,所以还要复习前面的家庭作业。自己也知道,必须把握好下一周的考试才能稳住。最后,希望自己下一周考试超常发挥,分拿到越多越好!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 2000行 | 20篇 | 400小时 | |
第一周 | 2/2 | 20/20 | 初步了解Linux的一些基本命令 | |
第二周 | 1/3 | 15/35 | 了解vim编辑器 | |
第三周 | 86/86 | 1/4 | 25/60 | 了解了信息的表示和处理 |
第五周 | 79/79 | 1/5 | 30/90 | 了解了程序的机器级表示 |
第七周 | 84/305 | 1/7 | 20/140 | 了解存储器的层次结构 |
第八周 | 0/305 | 2/9 | 30/170 | 期中总结 |
第九周 | 133/438 | 2/11 | 30/200 | 了解了Linux操作系统提供的基本I/O服务 |
第十周 | 420/858 | 2/13 | 30/230 | 对常用指令的代码进行了分析调试 |
第十一周 | 507/1365 | 2/15 | 30/260 | 了解异常控制流 |
第十二周 | 0/1365 | 2/17 | 20/280 | 了解了指针的内容 |
第十三周 | 437/1802 | 1/18 | 30/310 | 了解了多线程的内容 |