一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux到底是什么

Wildesbeast ? 來(lái)源:今日頭條 ? 作者:半畝良田v5 ? 2020-02-18 16:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

通過(guò)日常使用電腦,我們大概都知道一個(gè)機(jī)器大概的結(jié)構(gòu)由CPU、內(nèi)存、硬盤(pán)以及外設(shè)構(gòu)成,那么Linux服務(wù)器也一樣,從上一章內(nèi)容知道,我們平常關(guān)注的系統(tǒng)性能差不多就是這些地方,那么,我們的進(jìn)程是如何在Linux上運(yùn)行的呢?一、進(jìn)程運(yùn)行過(guò)程首先,我們的數(shù)據(jù)是存放于磁盤(pán)/NAS等存儲(chǔ)目錄當(dāng)中,當(dāng)需要使用這些數(shù)據(jù)的時(shí)候,則要將數(shù)據(jù)從磁盤(pán)中讀取出來(lái),經(jīng)過(guò)內(nèi)存再到三級(jí)緩存,然后進(jìn)入到CPU中。如下圖,數(shù)據(jù)從底部的存儲(chǔ)設(shè)備一步一步的被送進(jìn)入到CPU中。其用于傳輸數(shù)據(jù)的方式:遠(yuǎn)程存儲(chǔ)到本地二級(jí)存儲(chǔ)走的是網(wǎng)絡(luò)通信的方式,而本地存儲(chǔ)的數(shù)據(jù)進(jìn)入到內(nèi)存、CPU走的是BUS總線的方式。

進(jìn)程啟動(dòng)以后,其數(shù)據(jù)被從磁盤(pán)中讀取到內(nèi)存里緩存,當(dāng)CPU使用到它的時(shí)候,再被通過(guò)三級(jí)高速緩存送入到CPU中執(zhí)行。那么當(dāng)這個(gè)進(jìn)程被送入到CPU中運(yùn)行,是不是就可以一個(gè)人獨(dú)占CPU資源,直到跑完為止呢?不是的,現(xiàn)代系統(tǒng)設(shè)計(jì)出了上下文切換的模式,每個(gè)進(jìn)程運(yùn)行的時(shí)候都會(huì)分配到了一個(gè)時(shí)間片,當(dāng)這個(gè)時(shí)間片用完,那么當(dāng)前正在運(yùn)行的進(jìn)程就會(huì)保留當(dāng)前的狀態(tài)進(jìn)入到緩存當(dāng)中,當(dāng)再次輪到該進(jìn)程使用CPU的時(shí)候,才會(huì)從緩存當(dāng)中被讀取出來(lái)。通過(guò)這樣反復(fù)的切換,直到進(jìn)程運(yùn)行結(jié)束。但是我們?cè)谑褂眠M(jìn)程時(shí),為什么沒(méi)有進(jìn)程切換的感覺(jué)呢?那是因?yàn)镃PU的時(shí)間片以非常小的時(shí)間單位工作著,人們根本感受不到他的切換頻率。在Linux系統(tǒng)中存在著兩個(gè)空間,一個(gè)是用戶空間,另外一個(gè)就是內(nèi)核空間。用戶空間指的是用戶可以操作和訪問(wèn)的空間,這個(gè)空間通常存放我們用戶自己寫(xiě)的數(shù)據(jù)等,比如磁盤(pán)NAS就是屬于用戶空間。內(nèi)核空間就是系統(tǒng)內(nèi)核來(lái)操作的一塊空間,這塊空間里面存放系統(tǒng)內(nèi)核的函數(shù)、接口等,用戶是不能直接操作的。當(dāng)程序在用戶空間下運(yùn)行,我們把此時(shí)運(yùn)行的程序的這種狀態(tài)稱為用戶態(tài),而當(dāng)進(jìn)程執(zhí)行在內(nèi)核空間時(shí),這種狀態(tài)稱為內(nèi)核態(tài)。要想讓程序從用戶態(tài)切換到內(nèi)核態(tài),有3種方法:1.系統(tǒng)調(diào)用 (軟中斷)2.異常(硬中斷) 3.外圍設(shè)備的中斷(硬中斷)。二、進(jìn)程異常會(huì)遇到什么?進(jìn)程在運(yùn)行過(guò)程中不是一開(kāi)始就知道使用多少內(nèi)存的,在持續(xù)的運(yùn)行過(guò)程中,會(huì)不斷的向系統(tǒng)申請(qǐng)內(nèi)存。當(dāng)有應(yīng)用需要讀寫(xiě)磁盤(pán)數(shù)據(jù)時(shí),由系統(tǒng)把相關(guān)數(shù)據(jù)從磁盤(pán)讀取到內(nèi)存,如果物理內(nèi)存不夠,則把內(nèi)存中的部分?jǐn)?shù)據(jù)導(dǎo)入到磁盤(pán),從而把磁盤(pán)的部分空間當(dāng)做虛擬內(nèi)存使用,這部分被稱為swap。如果給所有應(yīng)用分配足夠內(nèi)存后,物理內(nèi)存還有剩余,Linux會(huì)盡量再利用這些空閑內(nèi)存,以提高整體I/O效率,方法是把這部分剩余內(nèi)存再劃分為cache和buffer加以利用。如果某個(gè)時(shí)刻,系統(tǒng)需要更多的內(nèi)存,則會(huì)把cache部分擦除,并把buffer中的內(nèi)容寫(xiě)入到磁盤(pán)中,然后把這兩部分的空間釋放給系統(tǒng)使用,但是再次讀取cache的內(nèi)容時(shí),就需要重新從磁盤(pán)讀取數(shù)據(jù)。下圖是系統(tǒng)中存在的緩存,當(dāng)系統(tǒng)需要內(nèi)存時(shí),就會(huì)被釋放空間,然后充當(dāng)內(nèi)存使用。

1) Page cache主要用來(lái)作為文件系統(tǒng)上的文件數(shù)據(jù)緩存來(lái)用,尤其是對(duì)當(dāng)進(jìn)程對(duì)文件有read/write操作的時(shí)候。2) Buffer cache主要是用來(lái)在系統(tǒng)對(duì)塊設(shè)備進(jìn)行讀寫(xiě)的時(shí)候,對(duì)塊設(shè)備進(jìn)行數(shù)據(jù)緩存來(lái)使用。3) directory cacha的作用是作為目錄緩存,避免經(jīng)常訪問(wèn)目錄慢。4) iNode cache則能夠加速訪問(wèn)文件速度。同一系統(tǒng)內(nèi)的文件具有唯一識(shí)別碼,這個(gè)就是iNode號(hào)。查找文件的時(shí)候會(huì)先查詢?cè)撐募膇Node號(hào),再根據(jù)iNode號(hào)定位到文件位置。一般可以理解為buffer是為了作為數(shù)據(jù)寫(xiě)入磁盤(pán)時(shí)的一個(gè)緩沖地帶。把分散的寫(xiě)操作集中進(jìn)行,減少磁盤(pán)碎片和硬盤(pán)的反復(fù)尋道,從而提高系統(tǒng)性能。而cache經(jīng)常被用于磁盤(pán)的I/O請(qǐng)求上,如果多個(gè)進(jìn)程都有訪問(wèn)某個(gè)文件,于是該文件便被作為cache以方便下次被訪問(wèn),這樣可以提高系統(tǒng)性能。

三、當(dāng)運(yùn)行一個(gè)進(jìn)程時(shí)系統(tǒng)內(nèi)存不夠會(huì)怎么樣?

在工作中會(huì)遇到這樣的場(chǎng)景:假設(shè)我的服務(wù)器就只有32G內(nèi)存,當(dāng)前以及使用了28G,而現(xiàn)在需要再運(yùn)行一個(gè)需要10G內(nèi)存的進(jìn)程,那么會(huì)發(fā)生什么呢?

如果這個(gè)進(jìn)程沒(méi)有做什么優(yōu)先級(jí)設(shè)定,那么這個(gè)進(jìn)程會(huì)觸發(fā)OOM,然后被系統(tǒng)kill掉。

什么是OOM?

OOM的全稱是Out of memory Killer,叫內(nèi)存終結(jié)者。在內(nèi)存過(guò)低的情況下,OS(系統(tǒng))會(huì)殺掉你的進(jìn)程。當(dāng)探測(cè)到內(nèi)存使用不足的時(shí)候,OOM會(huì)被激活,然后挑選一個(gè)進(jìn)程去終結(jié)掉。選擇的目標(biāo)進(jìn)程使用的是一套算法,后面會(huì)說(shuō)。

進(jìn)程在運(yùn)行過(guò)程中是怎么使用內(nèi)存的呢?Linux允許程序申請(qǐng)比系統(tǒng)可用內(nèi)存更多的內(nèi)存,這個(gè)機(jī)制叫做Overcommit。這樣做是處于優(yōu)化系統(tǒng)考慮,因?yàn)椴皇撬械某绦蛏暾?qǐng)了內(nèi)存就立刻使用的,當(dāng)開(kāi)始使用的時(shí)候,可能系統(tǒng)已經(jīng)回收了一些資源,但是當(dāng)使用overcommit給的內(nèi)存時(shí),系統(tǒng)還沒(méi)有資源的話,這個(gè)時(shí)候就會(huì)觸發(fā)OOM,然后干掉進(jìn)程。

有的時(shí)候在系統(tǒng)內(nèi)存不是很充足的情況下需要運(yùn)行一個(gè)重要的程序,那么該如何避免此程序被OOM干掉呢?

調(diào)整進(jìn)程的oom_adj值:Linux下每個(gè)進(jìn)程都有個(gè)OOM權(quán)重,在/proc/$pid/oom_adj里面,取值-17~+15,取值越高,越容易被干掉。

OOM Killer最終是通過(guò)/proc/$pid/oom_score這個(gè)值來(lái)決定哪個(gè)進(jìn)程被干掉。這個(gè)值是系統(tǒng)綜合進(jìn)程的內(nèi)存消耗量、CPU時(shí)間、存活時(shí)間和oom_adj計(jì)算出來(lái)的。消耗內(nèi)存越多分越高,存活時(shí)間越長(zhǎng)分越低。總之。總的策略就是:損失最少的工作,釋放最大的內(nèi)存同時(shí)不傷及無(wú)辜的用來(lái)很大內(nèi)存的進(jìn)程,并且殺掉的進(jìn)程數(shù)盡量少。另外,Linux在計(jì)算進(jìn)程的內(nèi)存消耗的時(shí)候,會(huì)將子進(jìn)程所耗內(nèi)存的一半同時(shí)計(jì)算到父進(jìn)程中,這樣子進(jìn)程較多的進(jìn)程就越容易被殺掉。

在Linux中如何查看是否有進(jìn)程被OOM干掉了呢?

運(yùn)行dmesg即可查詢到,或者到/var/log/messages中查看。從網(wǎng)上找了個(gè)OOM的圖:

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11074

    瀏覽量

    216922
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11508

    瀏覽量

    213645
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9784

    瀏覽量

    87878
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)編譯純r(jià)tos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?

    編譯純r(jià)tos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?
    發(fā)表于 07-11 07:22

    PLC到底是什么呢?

    PLC到底是什么呢?
    發(fā)表于 10-10 09:30

    這是到底是什么元件?

    開(kāi)關(guān)電源一個(gè)小貼片,在k2717前端。絲印MY還有133字樣。這到底是什么元件?什么原理?
    發(fā)表于 05-26 15:06

    如何評(píng)價(jià)《Linux就該這么學(xué)》這本書(shū)?

    的第一篇就是搭建環(huán)境,但是小白真的可能會(huì)問(wèn)虛擬機(jī)是個(gè)啥?Linux到底是個(gè)啥?甚至有些小白同學(xué)還不會(huì)裝Windows系統(tǒng),或者還沒(méi)搞明白計(jì)算機(jī)這塊“鐵疙瘩”到底是怎么運(yùn)行起來(lái)的,如果你也是連這些問(wèn)題都沒(méi)
    發(fā)表于 10-21 13:01

    請(qǐng)問(wèn)CKFA到底是什么

    在其他網(wǎng)站看到CKFA,這個(gè)到底是什么?。烤唧w怎么用?。肯M苡斜容^詳細(xì)的解釋,謝謝!
    發(fā)表于 08-20 07:18

    這個(gè)到底是什么電路

    這個(gè)到底是積分電路還是濾波電路還是RC延時(shí)電路,我已經(jīng)頭暈了
    發(fā)表于 01-20 21:56

    QPainter到底是什么?

    QPainter到底是什么?
    發(fā)表于 09-28 06:30

    STM32固件庫(kù)到底是什么?

    STM32固件庫(kù)到底是什么?
    發(fā)表于 11-30 07:34

    3516 L1 Linux版本成功啟動(dòng)!可以愉快地玩耍了~

    set 編譯的是L0 和 L1, ipcamera_hispark_taurus 是L1 liteOS-A內(nèi)核的,那這個(gè)是 ipcamera_hispark_taurus_linux 到底是干嘛用
    發(fā)表于 01-06 10:39

    到底是學(xué)STM32還是學(xué)嵌入式linux

    01話 題經(jīng)常有大學(xué)生同學(xué)糾結(jié):我到底是學(xué)STM32還是學(xué)嵌入式linux。這個(gè)問(wèn)題很多人都會(huì)有自己的看法,今天我試著從多個(gè)角度,把我了解到的事實(shí)講一下,希望對(duì)大家有所啟發(fā)。STM3202STM32
    發(fā)表于 02-07 07:06

    RGB屏到底是什么?

    RGB屏到底是什么?
    發(fā)表于 02-14 07:18

    什么是嵌入式Linux?

    Linux到底是什么呢? 嵌入式linux 是將日益流行的Linux操作系統(tǒng)進(jìn)行裁剪修改,使之能在嵌入式計(jì)算機(jī)系統(tǒng)上運(yùn)行的一種操作系統(tǒng)。簡(jiǎn)單來(lái)說(shuō),是除了電腦之外可以運(yùn)行程序的設(shè)備,將C
    發(fā)表于 10-11 13:47

    Linux到底是怎么樣來(lái)的?發(fā)展過(guò)程是如何的

    Linux 內(nèi)核非常龐大,我說(shuō)的非常大并不是為了嚇唬大家,確實(shí)是非常多的代碼,超過(guò) 600 萬(wàn)行的代碼,所以我寫(xiě)文章介紹 Linux 內(nèi)核,也不可能每一行代碼去分析,但是我會(huì)提煉其中的重點(diǎn)出來(lái),告訴
    的頭像 發(fā)表于 08-11 11:00 ?4086次閱讀

    Linux內(nèi)核到底是什么應(yīng)該如何學(xué)習(xí)

    Linux可以說(shuō)是近期非常火的了,有的人想學(xué)習(xí)linux內(nèi)核,那他到底是什么呢?
    發(fā)表于 10-06 18:02 ?2098次閱讀

    Linux到底是如何收發(fā)網(wǎng)絡(luò)包的

    為了使得多種設(shè)備能通過(guò)網(wǎng)絡(luò)相互通信,和為了解決各種不同設(shè)備在網(wǎng)絡(luò)互聯(lián)中的兼容性問(wèn)題,國(guó)際標(biāo)標(biāo)準(zhǔn)化組織制定了開(kāi)放式系統(tǒng)互聯(lián)通信參考模型(pen System Interconnection Reference Model),也就是 OSI 網(wǎng)絡(luò)模型,該模型主要有 7 層,分別是應(yīng)用層、表示層、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層以及物理層。
    發(fā)表于 01-03 17:49 ?857次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>到底是</b>如何收發(fā)網(wǎng)絡(luò)包的