进程与线程
对于操作系统来说,一个任务就是一个进程(Process),其中的“子任务”称为线程(Thread)。
在运行中,多个线程共享进程的资源,进程是资源分配的基本单位,线程是独立运行和调度的基本单位。
进程之间是相互独立的,而线程之间没有单独的地址空间,一个线程死掉等于整个进程死掉。
Python的多进程/多线程实现:
- 多进程的程序可以用
multiprocessing
模块,它提供了一个Process
类来代表一个进程对象。如果要启动多个子进程,可以使用Pool
的方式来批量创建子进程。 - 多任务可以由多进程完成,也可以由一个进程内的多线程完成。python的线程可以用
threading
模块实现。但在多线程中,所有变量是由所有线程共享的,而多进程中变量是互不影响的。此外,由于python的GIL锁(Global Interpreter Lock),多线程并不能有效利用多核,多核人物需要用多进程实现。
堆与栈
- 栈(stack)像一个装数据的桶,后存放的先取,先存放的后取。它是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的
空间分配是由操作系统自动分配释放且自动回收,存放函数的参数值,局部变量的值等。所以栈数据的生存周期只在函数的运行过程中,运行后就释放掉,不可以再访问。 - 堆(heap)像一棵倒过来的树,是一个经过排序的树形数据结构,每个结点都有一个值。它是一种运算受限的线性表。堆的存取是随意的。
空间分配一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。
参考:
http://www.cleey.com/blog/single/id/776.html
https://www.jianshu.com/p/52b5a1879aa1
https://buptjz.github.io/2014/04/23/processAndThreads