20155212 2017-2018-1 《信息安全系统设计》第8周学习总结
教材学习内容总结
- C/S模型
- 步骤
- 当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务
- 服务器收到请求后,解释它,并以适当的方式操作它的资源
- 服务器给客户端发送一个响应,并等待下一个请求
- 客户端收到响应并处理它
- 套接字接口 (socket interface) 是一组函数,它们和 Unix I/O 函数结合起来,用以创建网络应用
- 函数
- socket()
- connect()
- open_clientfd()
- bind()
- listen()
- open_listenfd()
- accept()
- 步骤
- 所谓的并发,其实都是操作系统做的事情。比如多进程多进程是操作系统fork函数实现的、I/O多路复用需要内核挂起进程、多线程需要内核创建和挂起线程
- 进程:每个逻辑控制流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用进程间通信(IPC)。
- I/O多路复用:这种形式的并发,应用程序在一个进程的上下文中显示地调度它们自己的逻辑流。逻辑流被模拟为“状态机”,数据到达文件描述符后,主程序显示地从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享一个地址空间。
- 线程:线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度。线程可以看做是进程和I/O多路复用的合体,像进程一样由内核调度,像I/O多路复用一样共享一个虚拟地址空间。
- 基于进程的并发编程
- 构造并发最简单的就是使用进程,像fork函数。由于独立的地址空间,所以进程不会覆盖另一个进程的虚拟存储器。但是另一方面进程间通信就比较麻烦,至少开销很高。
- 基于I/O多路复用的并发编程
- 基本思想是:使用select函数,要求内核挂起进程,只有在一个或者多个I/O事件发生后,才将控制返给应用程序。
- 由于I/O多路复用是在单一进程的上下文中的,因此每个逻辑流程都能访问该进程的全部地址空间,所以开销比多进程低得多;缺点是编程复杂度高。
- 基于线程的并发编程
- 线程和进程的执行模型有些相似。每个进程的声明周期都是一个线程,我们称之为主线程。但是大家要有意识:线程是对等的,主线程跟其他线程的区别就是它先执行。
- 不同线程的栈是对其他线程不设防的,也就是说:如果一个线程以某种方式得到一个指向其他线程的指针,那么它可以读取这个线程栈的任何部分。
- 四类线程不安全函数:
- 不保护共享变量的函数。解决办法是PV操作。
- 保持跨越多个调用的状态函数。比如使用静态变量的函数。解决方法是不要使用静态变量或者使用可读静态变量。
- 返回指向静态变量的指针的函数。解决方法是lock-and-copy(枷锁-拷贝)
- 调用线程不安全函数的函数
教材学习中的问题和解决过程
- 电路中的寄存器和汇编中说的寄存器有区别吗?
- 在硬件中,寄存器直接将输入和输出线连接到电路的其他部分;在机器级编程中,寄存器代表的是CPU中为数不多的可寻址的字。
代码托管
其他
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 96/96 | 1/1 | 15/15 | |
第二周 | 30/126 | 1/2 | 21/36 | |
第三周 | 30/156 | 1/3 | 21/57 | |
第四周 | 10/156 | 1/4 | 20/77 | |
第五周 | 23/189 | 1/5 | 20/97 | |
第六周 | 201/390 | 1/6 | 8/95 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:8小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)