区别
从操作系统分配资源的角度上来看
- 进程是系统资源分配的单位
- 线程是CPU调度的最小单位
什么是所谓的"资源",其中包括什么?
- Thread
- Memory Space
- Privileges(UID, etc.)
- File descriptor
- Environment(root directory, current directory, etc.) 答案来自:https://stackoverflow.com/a/7623538
查看进程中的所有线程
通过
ps -T -p <pid>
root@iZ947mgy3c5Z:~# ps -T -p 24323 PID SPID TTY TIME CMD 24323 24323 pts/7 00:00:00 python3 24323 24324 pts/7 00:00:00 python3 24323 24325 pts/7 00:00:00 python3 24323 24326 pts/7 00:00:00 python3 24323 24327 pts/7 00:00:00 python3
通过top命令可以看到更为详细的线程情况
top - 13:51:15 up 54 days, 22:04, 5 users, load average: 0.11, 0.09, 0.06 Threads: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.7 us, 1.3 sy, 0.0 ni, 95.6 id, 1.0 wa, 0.0 hi, 0.3 si, 0.0 st KiB Mem: 1016308 total, 938488 used, 77820 free, 121820 buffers KiB Swap: 0 total, 0 used, 0 free. 134484 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24425 root 20 0 322900 6404 2612 S 0.0 0.6 0:00.02 python3 24426 root 20 0 322900 6404 2612 S 0.0 0.6 0:00.00 python3 24427 root 20 0 322900 6404 2612 S 0.0 0.6 0:00.00 python3 24428 root 20 0 322900 6404 2612 S 0.0 0.6 0:00.00 python3 24429 root 20 0 322900 6404 2612 S 0.0 0.6 0:00.00 python3
一个进程中一定会包含线程么?
这方面的资料来自:https://stackoverflow.com/questions/7623493/zero-threaded-process
通俗意义上来说,是的,一个进程至少包含一个主线程才能正常工作
但是,有一种进程除外,就是僵尸进程,虽然它里面没有线程,但是它根本不算是一个正常的工作进程
[root@Da ~]# top -H -p 2127
top - 20:16:42 up 39 min, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 1 total, 0 running, 0 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.4%us, 1.4%sy, 0.0%ni, 95.8%id, 2.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 236532k total, 196292k used, 40240k free, 32360k buffers
Swap: 2031608k total, 0k used, 2031608k free, 59304k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2127 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 a.out <defunct>
从数据共享上来看
- 同进程下各子进程之间是相互隔离的,数据是不共享的,所以需要其他方式来实现进程间通信
- 同进程下各线程之间数据共享的
从执行效率上来看
- 由于GIL的问题,python多线程无法使用多个CPU
- 多进程则很好的利用CPU资源
那多线程用什么用呢? 用于非CPU密集型业务,也就是IO密集型业务,例如大量的时间都在等待IO(网络IO、磁盘IO)上的场景,即便是多进程依然要等待,反而多线程更轻,数据共享更容易