【python内功修炼005】:Python并发编程之进程与线程(详解)

一、CPU与进程、线程的关系

转载于:进程与线程的一个简单解释

  1. 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

在这里插入图片描述

  1. 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

在这里插入图片描述

  1. 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

在这里插入图片描述

  1. 一个车间里,可以有很多工人。他们协同完成一个任务。

在这里插入图片描述

  1. 线程就好比车间里的工人。一个进程(车间)可以包括多个线程。

在这里插入图片描述

  1. 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

在这里插入图片描述

  1. 可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

在这里插入图片描述

  1. 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

在这里插入图片描述

  1. 还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

在这里插入图片描述

  1. 这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

  2. 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

在这里插入图片描述

  1. 操作系统的设计,因此可以归结为三点:
    (1)以多进程形式,允许多个任务同时运行;
    (2)以多线程形式,允许单个任务分成不同的部分运行;
    (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
    在这里插入图片描述

二、进程的概念

进程是表示资源分配的基本单位,又是调度运行的基本单位 。

参考我其他博文: https://blog.csdn.net/weixin_42444693/article/details/104931902

三、线程的概念

线程的定义:是进程的一个实体

  1. 用户角度: 我们打开QQ这个进程,它可以同时回复文字消息,语言消息,下载群文件等。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。
  2. 系统角度: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

四、多进程的特点

1、多进程优点
  • 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
  • 通过增加CPU,就可以容易扩充性能;
  • 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
  • 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
2、多进程的缺点
  • 逻辑控制复杂,需要和主程序交互;

  • 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算

  • 多进程调度开销比较大;

    五、多线程的特点

1、引入多线程的优点
  • 多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
  • 当前没有进行处理的任务时可以将处理器时间让给其它任务;
  • 占用大量处理时间的任务可以定期将处理器时间让给其它任务;
  • 可以随时停止任务;
  • 可以分别设置各个任务的优先级以优化性能。
2、多线程的缺点
  • 等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
  • 对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
  • 线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
  • 对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
3、什么时候使用多线程

是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:

  • 耗时或大量占用处理器的任务阻塞用户界面操作;
  • 各个任务必须等待外部资源 (如远程文件或 Internet连接)。
4、线程小故事

作者:IBM刘欣 我是一个线程

六、 Linux内核对多进程和多线程的支持方式

多线程比多进程成本低,但性能更低

结论: Linux下编程多用多进程编程少用多线程编程

在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。

多线程是平面交通系统,造价低,但红绿灯太多,老堵车

我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。

参考来源: http://blog.chinaunix.net/uid-29131868-id-5155428

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值