zoukankan      html  css  js  c++  java
  • 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》学习指导
    ...
  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/l97----/p/7823548.html
Copyright © 2011-2022 走看看