進程與線程

進程皇忿、線程

  • 進程带饱、線程是操作系統(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)
    • util模塊

      • util 模塊主要用于支持 Node.js 內部 API 的需求

      • format方法

        • util.format() 方法返回一個格式化后的字符串

        • 例:

        • util.format('%s:%s', 'foo', 'bar', 'baz'); // 'foo:bar baz'
          
    • cluster模塊

      • 多進程模塊
      • fork()
        • 創(chuàng)建一個子進程
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市相艇,隨后出現(xiàn)的幾起案子颖杏,更是在濱河造成了極大的恐慌,老刑警劉巖坛芽,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留储,死亡現(xiàn)場離奇詭異,居然都是意外死亡咙轩,警方通過查閱死者的電腦和手機获讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來活喊,“玉大人丐膝,你說我怎么就攤上這事〖鼐眨” “怎么了帅矗?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煞烫。 經常有香客問我浑此,道長,這世上最難降的妖魔是什么滞详? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任尤勋,我火速辦了婚禮,結果婚禮上茵宪,老公的妹妹穿的比我還像新娘。我一直安慰自己瘦棋,他們只是感情好稀火,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赌朋,像睡著了一般凰狞。 火紅的嫁衣襯著肌膚如雪篇裁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天赡若,我揣著相機與錄音达布,去河邊找鬼。 笑死逾冬,一個胖子當著我的面吹牛黍聂,可吹牛的內容都是我干的。 我是一名探鬼主播身腻,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼产还,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘀趟?” 一聲冷哼從身側響起脐区,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎她按,沒想到半個月后牛隅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡酌泰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年媒佣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫莱。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈攒,死狀恐怖,靈堂內的尸體忽然破棺而出授霸,到底是詐尸還是另有隱情巡验,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布碘耳,位于F島的核電站显设,受9級特大地震影響,放射性物質發(fā)生泄漏辛辨。R本人自食惡果不足惜捕捂,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斗搞。 院中可真熱鬧指攒,春花似錦、人聲如沸僻焚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虑啤。三九已至隙弛,卻和暖如春架馋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背全闷。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工叉寂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人总珠。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓屏鳍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姚淆。 傳聞我的和親對象是個殘疾皇子孕蝉,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353