2017-2018-1 20155327 《信息安全系统设计基础》第八周学习总结
学习目标
掌握三种并发的方式:进程、线程、I/O多路复用
掌握线程控制及相关系统调用
掌握线程同步互斥及相关系统调用
客户端-服务器编程模型
1.每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器户端提供某种服务。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。—个FTP服务器就管理了一组磁盘文件,它为客户端进行它会为客户端进行存储和检索。相似地一个电子邮件服务器管理了一些文件,它为客户端进行读和更新。
2.客户端-服务器模型中的基本操作是事务
3.事务由四步组成
1)当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。例如,当Web览器需要一个文件时,它就发送一个请求给Web服务器
2)服务器收到请求后,解释它,并以适当的方式操作它的资源。例如,当Web服务器收到浏览器发出的请求后,它就读一个磁盘文件
3)服务器给客户端发送一响应,并等待下一个请求。例如,Web服务器将文件发送回客户端;
4)客户端收到响应并处理它。例如,当Web浏览器收到来自服务器的一页后,它就在屏幕上显示此页。
socket函数
1.Socket函数客户端和服务器使用函数来创建一个套接字描述符.
#include <sys/socket.h>
int socket(int domain,int tpye,int protocol);
clientfd=socket(AF_INET,SOCK_STREAM,0);```
1.其中,AF_INET表明我们正在使用因特网,而SCKET_STREAM表示这个套接字是因特网连接一个端点。Socket返回的clientfd描述符仅是部分打开的,还不能用于读写。如何完成打开套接字的工作,取决于我们是客户端还是服务器。
###connect函数
1.客户端通过connect函数来建立和服务器的连接。
```#include <sys/socket.h>
int connect(int sockfd,struct sockadd *serv_addr,int addrlen);```
1.connect函数试图与套接字地址为serv_addr的服务器建立一个因特网连接,其中addrlen是size of ( sockaddr_in )。Connect函数会阻塞,一直到连接成功建立或是发生错误如果成功,sockfd描述符现在就准备好可以读写了,并且得到的连接是由套接字对刻画的。
11.4.4 open_clientfd函数627
1.将socket和connect包装
1.open_clientfd的代码
###bind函数
```#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *my_addr,int addrlen);```
### listen函数
listen函数将sockfd从一个主动套接字转化为一个监听套接字。该套接字可以接受来自客户端的连接请求。backlog参数暗示了内核在开始拒绝连接请求之前,该放入队列中等待的未完成连接请求的数量
### accept函数
```#include <sys/socket.h>
int accept(int listenfd,struct sockaddr *addr,int *addrlen);```
##基于进程的并发编程
1.在接受连接请求之后,服务器派生一个子进程,这个子进程获得服务器描述符表的完整拷贝。子进程关闭它的拷贝中的监听描述符3,而父进程关闭它的已连接描述符4的拷贝,因为不再需要这些描述符了。这就得到了图中的状态,其中子进程正忙于为客户端提供服务。因为父子进程中的已连接描述符都指向同一个文件表表项,所以父进程关闭它的已连接描述符的拷贝是至关重要的。否则,将永远不会释放已连接描述符4的文件表条目,而且由此引起的存储器泄漏将最终消耗尽可用的存储器,使系统崩溃。
2.现在假设在父进程为客户端1创建了子进程之后,它接受一个新的客户端2的连接请求,并返回一个新的已连接描述符(比如描述符5)如图所示。然后,父进程又派生另一个子进程,这个子进程用已连接描述符5为它的客户端提供服务,如图所示。此时,父进程正在等待下一个连接请求,而两个子进程正在形地为它们各自的客户端提供服务。
![](http://images2017.cnblogs.com/blog/1071551/201711/1071551-20171114224605687-303470007.png)
![](http://images2017.cnblogs.com/blog/1071551/201711/1071551-20171114224615437-393418586.png)
##基于进程的并发服务器
一个基于进程的并发的echo服务器的代码,重要说明:
首先,通常服务器会运行很长时间,所以我们必须包括一个SIGCHLD处理程序,来回收僵死子进程资源。
其次,父子进程必须关闭他们的connfd拷贝。
最后,因为套接字的文件表表项的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
##基于i/o多路复用的并发编程651
1.比如一个服务器,它有两个I/O事件:1)网络客户端发起连接请求,2)用户在键盘上键入命令行。我们先等待那个事件呢?没有那个选择是理想的。如果accept中等待连接,那么无法相应输入命令。如果在read中等待一个输入命令,我们就不能响应任何连接请求(这个前提是一个进程)。
2.针对这种困境的一个解决办法就是I/O多路复用技术。基本思想是:使用select函数,要求内核挂起进程,只有在一个或者多个I/O事件发生后,才将控制返给应用程序。如图所示:横向的方格可以看作是一个n位的描述符向量。现在,我们定义第0位描述是“标准输入”,第3位描述符是“监听描述符”。
##基于线程的并发编程
每个线程都有自己的线程上下文,包括一个线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。所有的运行在一个进程里的线程共享该进程的整个虚拟地址空间。由于线程运行在单一进程中,因此共享这个进程虚拟地址空间的整个内容,包括它的代码、数据、堆、共享库和打开的文件。
##上周考试错题总结
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
学习进度条
代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 80/90 1/2 15/25
第三周 100/190 1/3 15/40
第四周 150/340 1/4 18/58
第五周 2/6 20/78
第六周 2/8 20/98
第七周 2124/ 2/10 20/118
第八周 2/12 30/148
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:35小时
实际学习时间:30小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
《深入理解计算机系统V3》学习指导
...