python中的线程和进程的理解
转载链接
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
调度
在传统的计算机操作系统中,CPU调度的基本单位是进程。后来操作系统普遍引入了线程的概念,线程成为了CPU调度的基本单位,进程只能作为资源拥有的基本单位。
并行
由于线程的引入,原先一个进程只能有一个并发,现在一个进程可以有多个线程并行执行。早期的很多HTTP server都是通过线程来解决服务器的并发,比起之前用fork子进程来处理并发效率有了数倍的提升。这一切都得益于线程可以用进程更低的代价实现并发。
共享资源
下图用来说明线程和进程之间共享资源的情况。
- 进程的公有数据段内存(利用这些共享的数据,线程很容易的实现相互之间的通讯)
- 进程打开的FD(File Descriptor,文件描述符)
- 信号的处理器
- 进程用户ID(UID)与进程组ID(PGID)
隔离
Linux的线程会独立拥有如下资源(非共享):
- 线程ID,在Linux中线程和进程共享ID空间,在UNIX系统中线程的ID是和进程ID不同层面的概念
- 寄存器的值,这其实就是线程能作为独立调度单元的最必要的保证
- 线程的栈,这是线程能并行运行的保证
- 优先级,Linux的系统设计使得线程和进程除了在某些资源的共享&隔离有差异之外, 几乎是一视同仁的,所以他们可以有不同的priority。