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


    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》学习指导
    ...
  • 相关阅读:
    曲演杂坛--Update的小测试
    曲演杂坛--使用TRY CATCH应该注意的一个小细节
    Backup--查看备份还原需要的空间
    INDEX--创建索引和删除索引时的SCH_M锁
    曲演杂坛--蛋疼的ROW_NUMBER函数
    曲演杂坛--使用ALTER TABLE修改字段类型的吐血教训
    曲演杂坛--查看那个应用连接到数据库
    TempDB--临时表的缓存
    (转)spark日志配置
    CDH版本java开发环境搭建
  • 原文地址:https://www.cnblogs.com/l97----/p/7823548.html
Copyright © 2020-2023  润新知