进程,线程,协程

目录

1.1 进程

1.2 线程

1.3 协程

1.4 select,epool,pool

1.1 进程

  进程是资源分配的最小单位( 内存、cpu、网络、io)

    一个运行起来的程序就是一个进程

      什么是程序(程序是我们存储在硬盘里的代码)

      硬盘(256G)、内存条(8G)

      当我们双击图标,打开程序的时候,实际上就是通过I/O操作(读写)内存条里面

      内存条就是我们所指的资源

      CPU分时

        CPU比你的手速快多了,分时处理每个线程,但是由于太快然你觉得每个线程都是独占cpu

        cpu是计算,只有时间片到了,获取cpu,线程真正执行

        当你想使用 网络、磁盘等资源的时候,需要cpu的调度

  进程具有独立的内存空间,所以没有办法相互通信

    进程如何通信

      进程queue(父子进程通信)

      pipe(同一程序下两个进程通信)

      managers(同一程序下多个进程通信)

      RabbitMQ、redis等(不同程序间通信)

    为什么需要进程池

      一次性开启指定数量的进程

      如果有十个进程,有一百个任务,一次可以处理多少个(一次性只能处理十个)

      防止进程开启数量过多导致服务器压力过大

1.2 线程

  有了进程为什么还需要线程

    因为进程不能同一时间只能做一个事情

  什么是线程

    线程是操作系统调度的最小单位

    线程是进程正真的执行者,是一些指令的集合(进程资源的拥有者)

    同一个进程下的读多个线程共享内存空间,数据直接访问(数据共享)

    为了保证数据安全,必须使用线程锁

  GIL全局解释器锁

    在python全局解释器下,保证同一时间只有一个线程运行

    防止多个线程都修改数据

  线程锁(互斥锁)

    GIL锁只能保证同一时间只能有一个线程对某个资源操作,但当上一个线程还未执行完毕时可能就会释放GIL,其他线程就可以操作了

    线程锁本质把线程中的数据加了一把互斥锁

      mysql中共享锁 & 互斥锁

        mysql共享锁:共享锁,所有线程都能读,而不能写

        mysql排它锁:排它,任何线程读取这个这个数据的权利都没有

      加上线程锁之后所有其他线程,读都不能读这个数据

    有了GIL全局解释器锁为什么还需要线程锁

      因为cpu是分时使用的
  死锁定义

    两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

1.3 协程

  什么是协程

    协程微线程,纤程,本质是一个单线程

    协程能在单线程处理高并发

      线程遇到I/O操作会等待、阻塞,协程遇到I/O会自动切换(剩下的只有CPU操作)

      线程的状态保存在CPU的寄存器和栈里而协程拥有自己的空间,所以无需上下文切换的开销,所以快、

    为甚么协程能够遇到I/O自动切换

      协程有一个gevent模块(封装了greenlet模块),遇到I/O自动切换
  协程缺点

    无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上

    线程阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

  协程最大优点

    不仅是处理高并发(单线程下处理高并发)

    特别节省资源(500日活,用php写需要两百多态机器,但是golang只需要二十多太机器)

      200多台机器一年

      二十多天机器一年

1.4 select,epool,pool

  I/O的实质是什么?

    I/O的实质是将硬盘中的数据,或收到的数据实现从内核态 copy到 用户态的过程

    本文讨论的背景是Linux环境下的network IO。

    比如微信读取本地硬盘的过程

      微信进程会发送一个读取硬盘的请求----》操作系统

      只有内核才能够读取硬盘中的数据—》数据返回给微信程序(看上去就好像是微信直接读取)

  用户态 & 内核态

    系统空间分为两个部分,一部分是内核态,一部分是用户态的部分

    内核态:内核态的空间资源只有操作系统能够访问

    用户态:我们写的普通程序使用的空间

    进程,线程,协程_第1张图片

 

 

  select

    只能处理1024个连接(每一个请求都可以理解为一个连接)

    不能告诉用户程序,哪一个连接是活跃的
  pool

    只是取消了最大1024个活跃的限制

    不能告诉用户程序,哪一个连接是活跃的
  epool

    不仅取消了1024这个最大连接限制

    而且能告诉用户程序哪一个是活跃的

 

你可能感兴趣的:(进程,线程,协程)