2017-2018-1 20155318 《信息安全系统设计基础》第八周学习总结
教材学习内容总结
学习目标
- 掌握三种并发的方式:进程、线程、I/O多路复用
- 掌握线程控制及相关系统调用
- 掌握线程同步互斥及相关系统调用
教材学习
- 客户端-服务器编程模型
- 一个服务器进程 -> 管理某种资源 -> 通过操作这种资源来为它的客户端提供某种服务
- 一个或多个客户端进程,客户端和服务器都是进程
- 网络
- 对主机而言:网络是一种I/O设备,通过DMA(直接存储器存取方式)传送:从网络上接收到的数据从适配器经过I/O和存储器总线拷贝到存储器
- 协议:互联网由采用不同技术,互不兼容的局域网和广域网组成,并能使其相互通信。其中不同网络相互通信的解决办法是一层运行在每台主机和路由器上的协议软件,消除不同网络的差异。
- 协议提供的两种基本能力
- 命名机制:唯一的标示一台主机
- 传送机制:定义一种把数据位捆扎成不连续的片的同一方式
- CP/IP协议族:混合使用套接字接口函数和UnixI/O函数进行通信
- 世界范围的主机集合特性:
- 主机集合被映射为一组32位的IP地址
- 这组IP地址被映射为一组称为因特网域名的标识符
- 因特网主机上的进程能够通过连接和任何其他主机上的进程
- Web服务器
- HTTP (Hypertext Transfer Protocol,超文本传输协议):Web 客户端和服务器之间交互时用的一个基于文本的应用级协议。
- 一个 HTML 程序(页)包含指令(标记),它们告诉浏览器如何显示这页中的各种文本和图形对象。
- Web 服务器以两种不同的方式向客户端提供内容:
取一个磁盘文件,并将它的内容返回给客户端。磁盘文件称为静态内容 (static content), 而返回文件给客户端的过程称为服务静态内容 (serving static content)。 运行一个可执行文件,并将它的输出返回给客户端。运行时可执行文件产生的输出称为态内容 (dynamic content),而运行程序并返回它的输出到客户端的过程称为服务动态内容 (serving dynamic content)。
- 并发
- 并发程序:使用应用级并发的应用程序。
- 三种基本构造方法:
- 进程
- I/O多路复用
- 线程
- 基于进程的并发编程
- 在父进程中接受客户端连接请求后,创建一个新的子进程来为每个新客户端提供服务。
- 服务器会运行较长时间,需用SIGCHLD 处理程序回收僵死 (zombie) 子进程的资源
- 优缺点:
父、子进程间共享状态信息,但不共享用户地址空间。- 优点:一个进程不可能不小心覆盖另一个进程的虚拟存储器
- 缺点:独立的地址空间使得进程共享状态信息变得更加困难,进程控制和 IPC 的开销很高,速度变慢。
- 线程
- 主线程:每个进程开始生命周期时都是单一线程,在某一时刻,主线程创建一个对等线程 ,从这个时间点开始,两个线程就并发地运行。最后,因为主线程执行一个慢速系统调用。或者因为它被系统的间隔计时器中断, 控制就会通过上下文切换传递到对等线程。对等线程会执行一段时间,然后控制传递回主线程,依次类推。
- 创建:pthread_create 函数,一个输入变量arg,能用attr参数来改变新创建线程的默认属性。
- 终止:通过调用 pthreadexit 函数,线程会显式地终止。如果主线程调用 pthreadexit , 它会等待所有其他对等线程终止,然后再终止主线程和整个进程,返回值为 thread_return。
- 回收:线程通过调用 pthread_join 函数等待其他线程终止,pthreadjoin 函数会阻塞,直到线程 tid 终止,将线程例程返回的 (void*) 指针赋值为 threadreturn 指向的位置,然后回收己终止线程占用的所有存储器资源。
- 分离
- 初始化:pthread_once 函数
- 一个基于线程的并发服务器
- 调用 pthread_ create 时,如何将已连接描述符传递给对等线程
- 借助结构体可以把所有的函数化成万能函数的等价形式。
void * func( void * parameter)
typedef void* (*uf)(void * para)
- fflush(stdout):在printf()后使用fflush(stdout)将要输出的内容输出。
当使用printf()函数后,系统将内容存入输出缓冲区,等到时间片轮转到系统的输出程序时,将其输出。 - pthread_join()函数:以阻塞的方式等待thread指定的线程结束。
- 读者—写者问题:
- 读者优先,要求不让读者等待,除非已经把使用对象的权限赋予了一个写者。
- 写者优先,要求一旦一个写者准备好可以写,它就会尽可能地完成它的写操作。
- 饥饿就是一个线程无限期地阻塞,无法进展。
教材及代码学习中的问题和解决过程
暂无
代码托管
代码量截图
上周考试错题总结
1. 假设用ADD指令完成C表达式t=a+b的功能,有关条件码寄存器的说法正确的是?
答案ADF
A . 若t==0 ,则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指令不影响条件码寄存器
2. 假设%rax中的值为x, %rcx中的值为y,关于leaq指令,下面正确的()AC
A . leaq 6(%rax), %rdx; %rdx中值为6+x
B . leaq 6(%rax), %rdx; %rdx中值为6x
C . leaq 7(%rax, %rax,8), %rdx; %rdx中值为9x
D . leaq 7(%rax, %rax,8), %rdx; %rdx中值为63x
E . leaq 7(%rax, %rax,8), %rdx; %rdx中值为15x
3. 有关exec系列函数,下面说法正确的是()CE
A . 可以用char[][] 来传递argv
B . 进程调用了exec系列函数后,pid会变
C . 进程调用了exec系列函数后,代码会改变。
D . system()和exec系列等价。
E . exec系列函数中带e的要传入环境变量参数
F . exec系列函数中带v的要传入环境变量参数
4. 从程序员角度看进程状态有 ACD
A . 运行
B . 就绪
C . 停止
D . 终止
5. Unix/Linux中通过调用?可以获取子进程PID。D
A . getpid()
B . getppid()
C . getcpid()
D . fork()
6. 进程提供给应用程序的关键抽象让我们的程序感觉独占了处理器和内存。()提供了独占处理器的假象。
A . 地址空间
B . 虚拟内存
C . 逻辑控制流
D . 指令控制流
正确答案: C
7. 有关异常,下面说法正确的是()
A . 系统中的异常由异常名唯一确定
B . 异常表中存放的是异常处理程序
C . 异常表的起始地址存放在异常表基址寄存器中
D . 异常处理程序运行在内核模式下
正确答案: C D
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
其他(感悟、思考等)
使用多进程和多线程可大大提高代码的运行效率。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 3/3 | |
第二周 | 100/100 | 1/2 | 3/6 | |
第三周 | 300/400 | 1/3 | 4/10 | |
第四周 | 0/400 | 2/5 | 2/12 | |
第五周 | 25/425 | 1/6 | 4/16 | |
第六周 | 181/606 | 3/9 | 10/26 | |
第七周 | 201/807 | 2/11 | 7/33 | |
第八周 | -(包括脚本无意义)/6719 | 2/13 | 7/40 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:7小时
-
实际学习时间:7小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)