進程皇忿、線程
進程带饱、線程是操作系統(tǒng)的基本概念
-
進程
- 進程是正在運行的程序的實例典蜕,是一個具有一定獨立功能的程序關于某個數(shù)據(jù)集合的一次運行活動稚伍,是系統(tǒng)進行資源分配和調度的基本單位轧叽,是操作系統(tǒng)結構的基礎
-
線程
- 是操作系統(tǒng)能夠進行運算調度的最小單位苗沧。它被包含在進程之中,是進程中的實際運作單位炭晒。一條線程指的是進程中一個單一順序的控制流待逞,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務
在單核計算機中网严,cup是無法被多個程序使用识樱,意味著同一時刻只能執(zhí)行一個程序,如果有兩個程序需要執(zhí)行震束,就需要分配運行程序怜庸,比如這一時刻運行A程序,下一時刻運行B程序驴一,也就表示A和B程序輪流獨享cpu休雌,這種分配程序的模塊叫做'調度器',它所做的就是把cpu分成一段段的'運行片'肝断,輪流分給不同的程序去執(zhí)行杈曲,從宏觀上講驰凛,由于分配切換的速度極快,因此造成了多個程序同時運行在cpu上的假象担扑。
在單核計算機中恰响,內存是可以被多個程序共享的,當程序A使用名為a的內存涌献,程序b也可以使用名為a的內存胚宦,那么這個時候就會導致同一內存被修改而引發(fā)程序崩潰,因此誕生了內存管理模塊燕垃、虛擬地址枢劝、物理地址等核心功能,而在程序中誕生了一個概念卜壕,叫做進程您旁,所有的進程對應同一個虛擬地址,由內存管理模塊等映射到物理地址上為其分配獨立內存空間轴捎。
一個程序中可以包含多個任務鹤盒,當不同的任務想要共享cpu,共享物理內存的時候侦副,就誕生了線程侦锯,它被包裹在進程里面,在調度器管理共享cpu秦驯、使用同一虛擬地址尺碰、同一物理地址,但是它們無法跨越包裹自己的進程訪問其他進程的物理地址汇竭。
不同的進程之間也可以共享物理地址葱蝗,符合posix規(guī)范的操作系統(tǒng)都提供了一個接口,叫mmap细燎,可以把一個物理地址空間映射到不同的進程中,由不同的進程來共享皂甘。
-
總結:
- 單核情況下玻驻,同一時刻只能運行一個程序,由調度器切換執(zhí)行程序偿枕,從而造成多程序同時運行在cpu的假象璧瞬,程序不能夠單獨運行,只有將程序加載到內存中渐夸,系統(tǒng)為其分配運行的空間才能夠運行嗤锉,這種執(zhí)行的程序稱之為進程,也就是說進程是系統(tǒng)進行資源分配和調度的一個單位墓塌,程序與進程的區(qū)別在于程序是一個指令或者說任務的集合瘟忱,是進程運行的靜態(tài)描述文件奥额,而進程是程序在系統(tǒng)上順序執(zhí)行的動態(tài)描述,而線程是包含于進程中访诱,是進程的一個實體垫挨,一個進程可以擁有多個線程,代表一個程序中的不同任務触菜,可以同時執(zhí)行九榔,它們共享內存空間和資源,系統(tǒng)并不會為線程分配資源涡相,因此線程不能獨立運行哲泊,只能依賴于進程,一個線程崩潰會導致一個進程崩潰催蝗,但是一個進程崩潰并不會影響其他進程切威,因為進程享有獨立內存空間
-
process對象
process對象用于處理與當前進程相關的事情,它是一個全局對象生逸,可以在任何地方直接訪問到它而無需引入額外模塊牢屋,這個對象代表我們的node.js代碼宿主的操作系統(tǒng)進程對象。使用process對象可以截獲進程的異常槽袄、退出等事件烙无,也可以獲取進程的當前目錄、環(huán)境變量遍尺、內存占用等信息截酷,還可以執(zhí)行進程退出、工作目錄切換等操作
-
os模塊
operating system簡寫
os模塊可提供操作系統(tǒng)的一些基本信息
-
常用方法
例:
var os = require("os"); var result = os.platform(); //查看操作系統(tǒng)平臺 //os.release(); 查看操作系統(tǒng)版本 //os.type(); 查看操作系統(tǒng)名稱 //os.arch(); 查看操作系統(tǒng)CPU架構 console.log(result);
-
cwd()
獲取當前應用程序路徑
例:
process.cwd() // /Users/shenjianbo/codes/practise/nodejs/process
-
argv
獲取命令行輸入的參數(shù)乾戏,得到一個數(shù)組
例:
process.argv; // [ '/Users/shenjianbo/.nvm/versions/node/v8.15.1/bin/node', '/Users/shenjianbo/codes/practise/nodejs/process/index' ]
-
env
獲取當前系統(tǒng)環(huán)境信息的對象迂苛,可以用來進一步獲取環(huán)境變量、用戶名等系統(tǒng)信息
例:
process.env;
-
version
暴露編譯時存儲版本信息的內置變量NODE_VERSION的屬性
例:
process.version; // v8.15.1
-
chdir()
改變當前工作進程的目錄
例:
console.log(process.cwd()); // /Users/shenjianbo/codes/practise/nodejs/process process.chdir('./dist'); console.log(process.cwd()); // /Users/shenjianbo/codes/practise/nodejs/process/dist
-
exit()
終止當前進程
例:
process.exit()
-
輸入輸出流
-
process.stdout
一個指向標準輸出流(stdout)的可寫的流
例:
process.stdout.write('這是一行數(shù)據(jù)\n這是第二行數(shù)據(jù)');
-
process.stderr
一個指向標準錯誤流(stderr)的 可寫的流
例
process.stderr.write('輸出一行標準錯誤流鼓择,效果跟stdout沒差別');
-
process.stdin
- 一個指向標準輸入流(stdin)的可讀流(Readable Stream)三幻。標準輸入流默認是暫停(pause)的,所以必須要調用process.stdin.resume()來恢復(resume)接收
-
-
nexTick()
process 對象最重要的一個方法了呐能,表示在事件循環(huán)(EventLoop)的下一次循環(huán)中調用 callback 回調函數(shù)
例:
console.log('開始'); process.nextTick(function() { console.log('nextTick 回調'); }); setTimeout(function(){ console.log('新的EventLoop!') }, 0); console.log('當前EventLoop'); // 開始 // 當前EventLoop // nextTick 回調 // 新的EventLoop!
-
事件
-
exit
當進程將要退出時觸發(fā)
例:
process.on('exit', function() { // 設置一個延遲執(zhí)行 setTimeout(function() { console.log('主事件循環(huán)已停止念搬,所以不會執(zhí)行'); }, 0); console.log('退出前執(zhí)行'); }); setTimeout(function() { console.log('1'); }, 500);
-
uncaughtException
捕獲沒有 try catch 的異常錯誤
例:
process.on('uncaughtException', function() { console.log('捕獲到一個異常'); }); var a = '123'; a.a(); //觸發(fā)異常事件 console.log('上面的代碼發(fā)生異常,這句話不會顯示出來');
-
data
讀取輸入內容摆出,并主動觸發(fā)process.stdin.resume()
例:
process.on('data', data => { // 設置輸入字符編碼 process.stdin.setEncoding('utf8'); console.log(data); })
-
process.stdin.resume();
- 輸入進入流模式默認關閉朗徊,需用resume開啟
-
process.stdin.pause();
- 停止輸入流
-
-
child_process模塊
- 子進程模塊,提供了衍生子進程的能力
- 主要包括4個異步進程函數(shù)(spawn,exec,execFile,fork)和3個同步進程函數(shù)(spawnSync,execFileSync,execSync)偎漫。以異步函數(shù)中spawn是最基本的創(chuàng)建子進程的函數(shù)爷恳,其他三個異步函數(shù)都是對spawn不同程度的封裝
- 方法
- spawn(command, [,args],[,options])
- command指將要運行的命令
- args 命令后跟的一個字符串的參數(shù)數(shù)組
- options配置對象
- 該方法返回一個childProcess對象
- exec(command, [,options], callback)
- command指將要運行的命令,參數(shù)使用空格隔開
- options配置對象
- callback回調函數(shù),接受三個參數(shù)象踊,err, stderr, stdout
- 該方法返回一個childProcess對象
- 區(qū)別
- spawn
- 沒有限制子進程返回給node的數(shù)據(jù)大小温亲,在子進程開始運行時棚壁,就不斷的以流的形式把數(shù)據(jù)返回給主進程
- 沒有回調函數(shù)
- 適合處理如圖像處理,文件讀取
- exec
- 傳輸?shù)臄?shù)據(jù)有大小限制铸豁,默認大小為200kb灌曙,設置options的maxBuffer可以擴大容量,子進程運行過程中會將數(shù)據(jù)存儲在buffer中节芥,等程序執(zhí)行完畢后在刺,再一次返回給主進程
- 是對spawn的一種封裝,在處理復雜的命令時头镊,更為方便
- 適合處理微任務蚣驼,如返回一個狀態(tài)
- spawn
- spawn(command, [,args],[,options])
-
util模塊
util 模塊主要用于支持 Node.js 內部 API 的需求
-
format方法
util.format() 方法返回一個格式化后的字符串
例:
util.format('%s:%s', 'foo', 'bar', 'baz'); // 'foo:bar baz'
-
cluster模塊
- 多進程模塊
- fork()
- 創(chuàng)建一個子進程