进程、线程和协程的调度和运行原理总结。

系列文章

进程、线程的调度策略介绍

linux的操作系统详细调度策略可参考:http://blog.csdn.net/gatieme/article/details/51872659

linux中的进程主要有三种调度策略:

  1. 优先级调度:将进程分为普通进程和实时进程;

  2. 先进先出(队列)调度:实时进程先创建的先执行,直到遇到io或主动阻塞。

  3. 轮转调度(时间片):达到一定的CPU执行时间后强制切换;

多进程程序的调度其实还是线程的调度,线程才是CPU调度的基本单位;在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。

引起进程or线程调度的原因

  • 正在执行的进程执行完毕;

  • 执行中进程发生阻塞;(如调用sleep)

  • 执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列;

  • 执行中进程提出I/O请求后被阻塞;

  • CPU分配的时间片用完;(默认10ms)

  • 就绪队列中的某进程的优先级变得高于当前执行进程的优先级,引发强制切换;

linux下python进程or线程调度

如果我们使用python创建了多进程或多线程,可以认为这几个进程或线程是在公平队列(即优先级相同)的实时进程,那么其调度策略是FIFO和RR。

举个例子,假设现在有一个单核的CPU,python程序创建了5个线程,这五个线程会按创建的时间先后进入到一个公平队列中,CPU按先进先出原则开始执行第一个线程,如果遇到IO操作或休眠,或者执行这个线程的时间超过10ms;CUP就会停止当前线程,切换到第二个线程执行直到第五个线程;然后又从第一个线程开始循环,直到所有的线程执行完毕资源被操作系统回收。

当然,切换进程或线程也需要付出代价的,进程切换的代价大于线程。

进程、线程和协程的资源比较

进程:

  • 创建一个进程后,每个进程拥有自己独立的内存地址空间,代码段,数据段,BSS段,堆,栈等所有用户空间的信息;

  • 多进程中,子进程复制主进程的几乎所有信息,除了pid等特殊信息;

线程:

  • 一个进程下多个线程,多个线程共享进程的进程代码段,进程的公有数据(堆),进程的所拥有其他辅助资源;

  • 各个线程独立拥有的资源包括:线程id,程序计数器,一个栈,计数器寄存器和栈用来保存线程的执行历史和执行状态。

协程:

  • 协程可以看做轻量级的线程,即协程是在线程下开启,多协程在单线程下实现并发,而操作系统最多只能感知到线程,也就是说协程的切换对于操作系统来说是无感知的,属于程序级别的切换;

  • 多个协程共享单线程的代码段、公有数据(堆)等;

  • 每个协程拥有自己的栈来保存上下文状态,协程的切换开销更小,对操作系统来说,会认为一个开启了多协程的线程一直在计算;

  • 协程的优势在于切换的代价更小,因此CPU的有效利用率得到了提高。

  • python的协程主流通过gevent和asyncio模块实现,它们的核心原理都是底层用代码创建事件循环来对多个协程的上下文进行调度;

进程、线程和协程的应用场景

  • python的代码尽量避免使用多线程;

  • 如果上下文有一段代码可以分成相对独立的两个部分,如果独立的两个部分是CPU密集型,那么使用多进程;如果是IO密集型,那么使用协程;如果两者都涉及,可以考虑使用子进程中运行协程。

  • 业务代码为了快速创建协程或进程,同时增强代码的可读性,推荐使用匿名函数。

from redis import StrictRedis
rs = StrictRedis(host='192.168.1.20', port=6390, db=1) def get_rs1():
t = time.time()
res = gevent.joinall([gevent.spawn(lambda x: gevent.sleep(2), x=i) for i in range(2)])
ls = [x.get() if x.kwargs['x'] == 1 else x.get() for x in res]
print(ls)
print(time.time() - t)
if __name__ == '__main__':
get_rs1() # gevent需要判断返回的结果的顺序

python并发编程之进程、线程、协程的调度原理(六)的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. day30 网络编程 之进程,线程,协程

    进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...

  3. python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

    基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...

  4. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  5. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  6. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  7. 进程&线程&协程

    进程  一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...

  8. Python并发编程之进程池与线程池

    一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...

  9. python进程/线程/协程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

随机推荐

  1. SPOJ4717——Grid Points in a Triangle

    题目的意思很简单.就是要你求出斜率为a/b的一个点在原点,一条边为x=n的RT三角形里面有多少个整数点? 看完题目后依然没有思路,依然去看各个神牛写的题解.后来才反应过来. 题目的正解应该是这样的.递 ...

  2. 两个list比较相等元素

    1.实现方式 public class list { public static void main(String[] args) { List<String> list1 = new A ...

  3. C++解析(30):关于指针判别、构造异常和模板二义性的疑问

    0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...

  4. Repository HDU - 2846 (trie)

    题中没给范围 所以控制不好数组范围..不是超内存就是runtime.. 好吧 到了晚上终于调出来数组模拟的了 题意: 求含有某字符段的个数 解析: 把每个字符串遍历一遍 以每个元素为起点建树就好了.. ...

  5. CF662C Binary Table 枚举 FWT

    题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\( ...

  6. NLP度量指标BELU真的完美么?

    摘要: NLP重要评价准则之一——BLEU,真的完美无缺么? 刚接触自然语言处理的朋友通常会问我:当系统的输出是文本,而非对输入文本进行某种分类,如何对该系统进行评估.当模型的输入是文本信息,输出也是 ...

  7. 【Luogu1912】【NOI2009】诗人小G(动态规划)

    [Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...

  8. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  9. sloop公共程序之总体描述

    1:功能需求 开发一个公共库文件sloop.c,实现三个常用功能以供其它模块调用.三个功能如下: 功能一:实现一般的信号监听,调用模块只需传入要监听的信号和相应的回调函数就可以在信号到时调用回调函数处 ...

  10. lightoj 1020 (博弈水题)

    lightoj 1020 A Childhood Game 链接:http://lightoj.com/volume_showproblem.php?problem=1020 题意:一堆石子有 m 个 ...