4 Matching Annotations
  1. Jun 2018
    1. gt.wait() # 真正开始执行
      import eventlet
      def func(*args, **kwargs):
          ... ...
          return 0
      
      gt = eventlet.spawn(func, *args, **kwargs)
      gt.wait()
      

      当要切换到的目标对象还未激活(从未运行过)时,在切换过程中会执行初始化动作并运行。

      主进程执行到gt.wait()时,会切换协程,真正开始执行代码

  2. May 2018
    1. When the read system call is invoked, the application blocks and the context switches to the kernel. The read is then initiated, and when the response returns (from the device from which you're reading), the data is moved to the user-space buffer

      由此可见,系统调用 --- system call 的一些特性:

      user-space 只能调用 system call(就像调用普通函数一样) user-space 不能执行 system call,system call 的执行在 kernel-space。 kernel-space 负责执行函数,函数的 body 部分就是与 IO 进行交互,read/write 等。 整个过程,user-space thread 不会 sleep,也就是不释放 CPU,且程序不再前进,所以是 blocking and sync 到底什么是 sync 和 async 注意:

      sync 的意思是 不释放CPU async 的意思是 释放CPU 如何理解呢:

      释放 CPU 的话,在 CPU 眼里就没有这个线程了,不会给其分配 time slicing, like this:

      .    |    |    |    |
      .    |    |    |    |
      .    |    |    |    |
      

      第一个线程是 async 的,那么他在 CPU 眼里是不存在的, CPU 也不会再给他分配 time slicing.

      |    |    |    |    |
      |    |    |    |    |
      |    |    |    |    |
      

      第一个线程是 sync 的,那么他在 CPU 眼里依旧存在, CPU 照常给他分配 time slicing.

      这就是 async 和 sync 的区别,他是关于 CPU是否给其分配 time slicing 的词汇 这就是 async 和 sync 的区别,他是关于 CPU是否给其分配 time slicing 的词汇

      user-space vs. kernel space 系统函数只能在 kernel-space 中执行;但可以在 user-space 中调用。 系统函数在 kernel-space 中执行完毕后需要把结果拷贝给 user-space 中发起调用的线程,作为函数的返回结果。 所以系统调用这个东西吧,像是隔了一层,和普通的 API 函数还不一样。> When the read system call is invoked, the application blocks and the context switches to the kernel. The read is then initiated, and when the response returns (from the device from which you're reading), the data is moved to the user-space buffer.

      由此可见,系统调用 --- system call 的一些特性:

      1. user-space 只能调用 system call(就像调用普通函数一样)
      2. user-space 不能执行 system call,system call 的执行在 kernel-space。
      3. kernel-space 负责执行函数,函数的 body 部分就是与 IO 进行交互,read/write 等。
      4. 整个过程,user-space thread 不会 sleep,也就是不释放 CPU,且程序不再前进,所以是 blocking and sync

      到底什么是 sync 和 async

      注意:

      • sync 的意思是 不释放CPU
      • async 的意思是 释放CPU

      如何理解呢:

      释放 CPU 的话,在 CPU 眼里就没有这个线程了,不会给其分配 time slicing, like this:
      
      .    |    |    |    |
      .    |    |    |    |
      .    |    |    |    |
      
      第一个线程是 async 的,那么他在 CPU 眼里是不存在的, CPU 也不会再给他分配 time slicing.
      
      |    |    |    |    |
      |    |    |    |    |
      |    |    |    |    |
      
      第一个线程是 sync 的,那么他在 CPU 眼里依旧存在, CPU 照常给他分配 time slicing.
      
      这就是 async 和 sync 的区别,他是关于 CPU是否给其分配 time slicing 的词汇
      

      这就是 async 和 sync 的区别,他是关于 CPU是否给其分配 time slicing 的词汇

      user-space vs. kernel space

      • 系统函数只能在 kernel-space 中执行;但可以在 user-space 中调用。
      • 系统函数在 kernel-space 中执行完毕后需要把结果拷贝给 user-space 中发起调用的线程,作为函数的返回结果。
      • 所以系统调用这个东西吧,像是隔了一层,和普通的 API 函数还不一样。
    1. 第三种选择,你站在讲台上等,谁解答完谁举手

      IO复用模型,Linux下的select, poll, epoll就是干这个的

      • select将用户socket对应fd注册进epoll
      • 然后epoll监听哪些socket上有消息到达,此时socket应采用非阻塞模式
    2. 操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知

      操作系统的这个通知机制,是I/O多路复用技术的基础