進程以及狀態html
1. 進程
程序:例如xxx.py這是程序,是一個靜態的python
進程:一個程序運行起來後,代碼+用到的資源 稱之爲進程,它是操做系統分配資源的基本單元。linux
不只能夠經過線程完成多任務,進程也是能夠的git
2. 進程的狀態
工做中,任務數每每大於cpu的核數,即必定有一些任務正在執行,而另一些任務在等待cpu進行執行,所以致使了有了不一樣的狀態github
就緒態:運行的條件都已經慢去,正在等在cpu執行
執行態:cpu正在執行其功能
等待態:等待某些條件知足,例如一個程序sleep了,此時就處於等待態
編程
linux上進程有5種狀態:
1. 運行(正在運行或在運行隊列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的造成或接受到信號)
3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生)
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放)
5. 中止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後中止運行運行)
ps工具標識進程的5種狀態碼:
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue)
S 中斷 sleeping
T 中止 traced or stopped
Z 僵死 a defunct ("zombie") process segmentfault
線程與進程是操做系統裏面的術語,簡單來說,每個應用程序都有一個本身的進程。
操做系統會爲這些進程分配一些執行資源,例如內存空間等。
在進程中,又能夠建立一些線程,他們共享這些內存空間,並由操做系統調用,
以便並行計算。多線程
32位系統受限於總線寬度,單個進程最多可以訪問的地址空間
只有4G,利用物理地址擴展(PAE)
技術,可讓CPU訪問超過4G內存。可是在單個進程仍是隻能訪問4G
空間,PAE的優點是可讓不一樣進程累計使用的內存超過4G。
在我的電腦上,仍是建議使用64位系統,便於使用大內存
提高程序的運行性能。併發
建立線程以後,線程並非始終保持一個狀態。其狀態大概以下:oracle
線程有着不一樣的狀態,也有不一樣的類型。大體可分爲:
GIL即全局解釋器鎖,它使得python的多線程沒法充分利用
多核的優點,可是對於I/O操做頻繁的爬蟲之類的程序,
利用多線程帶來的優點仍是很明顯的。
若是要利用多核優點,仍是用多進程吧。
https://tracholar.github.io/wiki/python/python-multiprocessing-tutorial.html
能夠直接使用top命令後,查看%MEM的內容。能夠選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用狀況的話可使用以下的命令:
(1)top
top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器
能夠直接使用top命令後,查看%MEM的內容。能夠選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用狀況的話可使用以下的命令:
$ top -u oracle
內容解釋:
PID:進程的ID
USER:進程全部者
PR:進程的優先級別,越小越優先被執行
NInice:值
VIRT:進程佔用的虛擬內存
RES:進程佔用的物理內存
SHR:進程使用的共享內存
S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值爲負數
%CPU:進程佔用CPU的使用率
%MEM:進程使用的物理內存和總內存的百分比
TIME+:該進程啓動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。
COMMAND:進程啓動命令名稱
經常使用的命令:
P:按%CPU使用率排行
T:按MITE+排行
M:按%MEM排行
能夠根據進程查看進程相關信息佔用的內存狀況,(進程號能夠經過ps查看)以下所示:
$ pmap -d 14596
python中的多線程其實並非真正的多線程,若是想要充分地使用多核CPU的資源,在python中大部分狀況須要使用多進程。
Python提供了很是好用的多進程包multiprocessing,只須要定義一個函數,Python會完成其餘全部事情。
藉助這個包,能夠輕鬆完成從單進程到併發執行的轉換。
multiprocessing支持子進程、通訊和共享數據、執行不一樣形式的同步,提供了Process、Queue、Pipe、Lock等組件。
---------------------
1.https://segmentfault.com/q/1010000011117956
該題主描述了一樣的問題。我以爲比較有意義的回答是這個
multiprocessing.Pool 只是用來啓動多個進程而不是在每一個core上啓動一個進程。換句話說Python解釋器自己不會去在每一個core或者processor去作負載均衡。這個是由操做系統決定的。
若是你的工做特別的計算密集型的話,操做系統確實會分配更多的core,但這也不是Python或者代碼所能控制的或指定的。
multiprocessing.Pool(num)中的num能夠很小也能夠很大,好比I/O密集型的操做,這個值徹底能夠大於cpu的個數。
硬件系統的資源分配是由操做系統決定的,若是你但願每一個core都在工做,就須要更多的從操做系統出發了~
在後續的回答中給出了一個stackoverflow裏面的此類問題介紹
實驗
實驗環境:4C8G
1.工做任務設置成計算密集型
四個任務被均分到四個核上,順利運行
2.計算密集型+每一個進程小內存消耗
四個任務被均分到四個核上,順利運行
3.計算密集型+每一個進程大內存消耗
計算機卡死
---------------------
2018-12-18 今天好像找到問題了的緣由了:
問題1:
實例:
# -*- coding:utf-8 -*- from multiprocessing import Process import os import time nums = [11, 22] def work1(): """子進程要執行的代碼""" print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) for i in range(3): nums.append(i) time.sleep(1) print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) def work2(): """子進程要執行的代碼""" print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums)) if __name__ == '__main__': p1 = Process(target=work1) p1.start() p1.join() p2 = Process(target=work2) p2.start()
問題2:問題在於,多進程能夠啓動,可是,全部子進程都處於等待狀態
多是資源的問題。內存資源不夠,因此沒法同時運行,只能等待!這只是猜測了。
參考:https://blog.csdn.net/u013735511/article/details/80079373
https://blog.csdn.net/xlengji/article/details/81165370