区别

从操作系统分配资源的角度上来看

  • 进程是系统资源分配的单位
  • 线程是CPU调度的最小单位

什么是所谓的"资源",其中包括什么?

查看进程中的所有线程

  1. 通过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
    
  2. 通过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)上的场景,即便是多进程依然要等待,反而多线程更轻,数据共享更容易

results matching ""

    No results matching ""