前情回顾
1. 信号处理   signal()
   * 异步通信方式 ---》 同步执行 异步执行

2. 信号量   Semaphore()
        acquire()  删除
 release()  增加
 get_value()  获取

3. 同步互斥机制 :
     解决了多个进程或者线程对共享资源的争夺
     Event   e.set  e.clear  e.wait
     Lock    lock.acquire()   lock.release()

4. 什么是线程 
   threading
      Thread()
      t.start()
      t.join()

      t.name  t.getName t.setName  t.daemon  t.is_alive()
  
5. 自定义线程类  
    继承 Thread 
    重写 run

6. 线程通信
   使用全局变量通信
   线程的同步互斥

7.  Python线程 GIL
      影响 : 同一时刻只能解释一个线程,造成python线         程效率低
      python线程 : 适用于高阻塞IO程序

**************************************************
进程线程的区别和联系

1. 两者都是多任务编程方式,都能够使用计算机的多核资源
2. 进程的创建删除消耗的计算机资源比线程要多
3. 进程空间独立,数据相互不干扰,有专门的IPC,线程使    用全局变量进行通信
4. 一个进程可以创建多个线程分支,两者之间存在包含关系
5. 多个线程公用进程的资源,在资源操作时往往需要同步互    斥
6. 进程线程在系统中都有自己特有的属性,ID,代码段,栈    区等资源

使用场景
* 需要创建较多并发,同时任务关联性比较强时一般用多线   程
* 不同的任务模块可能更多使用进程
* 使用进程线程需要考虑数据的处理复杂度,比如进程间通   信是否方便,同步互斥是否过于复杂

要求 :
1. 进程线程的区别和联系
2. 进程间通信方式都知道哪些,有什么特点
3. 同步互斥意义是什么,什么情况下用
4. 给一个情形,分析下用进程还是用线程,理由
5. 一些常见概念挖掘 : 僵尸进程,  进程状态,GIL

司机和售票员的故事
   * 创建父子进程分别代表司机和售票员
   * 当售票员收到SIGINT信号,给司机发送SIGUSR1信号此   时司机打印"老司机开车了"
     当售票员收到SIGQUIT信号,给司机发送SIGUSR2信号此时司机打印"车速有点快,系好安全带"
     当司机捕捉到SIGTSTP信号,给售票员发送SIGUSR1,售票员打印"到站了,请下车"
   * 到站后 售票员先下车,司机下车 (子进程先退出)

服务器模型

硬件服务器 : 主机  集群

厂商 : IBM  HP   联想   浪潮


软件服务器 :编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务

httpserver  ---》  处理http请求
webserver ---》 网站的后端应用服务器程序
邮箱服务器 --》 邮件处理
ftp文件服务器 --》 文件的上传下载

功能 : 网络连接   逻辑处理   数据交互   数据传输
        协议的实现

结构 : c/s   客户端服务器模型
        b/s   浏览器服务器模型

服务器目标 : 处理速度更快,并发量更高,安全性更强

硬件 : 更高的配置,更好的集成分布技术,更好的网络优         化和网络安全技术

软件 : 占用资源更少,运行更稳定,算法更优良,安全性         更好,并发性更高,更容易扩展

基础服务端模型

循环模型: 循环接收客户端请求,处理请求。同一时刻只            能处理一个请求,处理完毕后再处理下一个

    优点 : 实现简单,占用资源少
    缺点 : 无法同时处理多个客户端任务

    适用情况 : 处理的任务可以短时间完成,不需要建立             并发,更适合udp使用

并发模型:能够同时处理多个客户端请求
    IO并发 : IO多路复用
        优点 : 资源消耗少,IO处理速度快
 缺点 : 不能适用cpu密集型程序

    多进程/多线程并发:为每个客户端创建单独的进程线                     程,执行请求

        优点 : 每个客户端可以长期占有服务器运行程序
                能够使用多核资源,可以处理IO或者cpu运算
 缺点 : 消耗系统资源高
 

多进程并发模型

使用fork实现多进程并发
1. 创建套接字,绑定,监听
2. 等待接收客户端请求
3. 创建新的进程处理客户端请求
4. 原有进程继续等待接收新的客户端连接
5. 如果客户端退出则关闭子进程

cookie:
在父进程中忽略子进程状态改变,子进程退出自动由系统处理
signal.signal(signal.SIGCHLD,signal.SIG_IGN)


ftp文件服务器

项目功能
* 服务端和客户端两部分,要求启动一个服务端,可以同时   处理多个客户端请求
* 功能 : 1. 可以查看服务端文件库中所有的普通文件
          2. 从客户端可以下载文件库的文件到本地
   3. 可以将本地文件上传的服务端文件库
   4. 退出
* 客户端使用print在终端打印简单的命令提示,通过命令   提示发起请求

1. 技术分析 (fork  tcp 并发)
2. 每个功能要单独封装,整体功能写在一个类中
3. 如何搭建整体架构,完成网络通讯

功能分析
1. 获取文件列表
   客户端 :  * 发送请求
              * 得到回复判断能否获取列表
       * 接收文件名称列表打印
   服务端 : * 接收请求
             * 判断请求类型
      * 判断能否满足请求,回复信息确认
      * 执行请求发送文件列表
   
cookie:

os.listdir(path)  获取目录中文件列表
os.path.isfile()  判断是否为普通文件
os.path.isdir()  判断是否为目录

2 文件下载
  客户端 : * 发送请求 (文件名)
            * 得到回复判断能否下载
     * 下载文件

  服务端 : * 接收请求
            * 判断请求类型
     * 判断能否满足请求,回复信息确认
     * 执行请求发送文件