GNU/Linux >> Znalost Linux >  >> Linux

Bude vyrovnávací paměť automaticky vyprázdněna na disk při ukončení procesu?

Pokud aplikace nemá žádné vnitřní mezipaměti, změny se okamžitě zapíší do souboru. Totéž pro váš příklad. Soubor je logická entita v paměti, která bude okamžitě aktualizována. Jakékoli následné operace se souborem uvidí změny provedené programem.

Nicméně , neznamená to, že změna byla zapsána na fyzický disk. Změny mohou přetrvávat v mezipaměti systému souborů OS nebo mezipaměti hardwaru. Chcete-li vyprázdnit vyrovnávací paměti souborového systému, použijte sync příkaz.

Chci si soubor přečíst hned po ukončení příkazu, ale nechci číst prázdný soubor.

Zde byste neměli narazit na žádné praktické problémy.


Je zapojeno několik vrstev vyrovnávacích pamětí/mezipaměti.

  1. Mezipaměť CPU.

    Data se skládají bajt po bajtu a ukládají se do mezipaměti CPU. Pokud je mezipaměť CPU plná a k datům se nějakou dobu nepřistupuje, blok obsahující naše data se může zapsat do hlavní paměti. Ty jsou z větší části skryty před programátory aplikací.

  2. Průběžné vyrovnávací paměti.

    V procesu, kde se shromažďují data, je vyčleněna určitá paměť, takže musíme do operačního systému zadávat co nejméně požadavků, protože to je poměrně drahé. Proces kopíruje data do těchto vyrovnávacích pamětí, které mohou být opět zálohovány mezipamětí CPU, takže není zaručeno, že se data zkopírují do hlavní paměti. Aplikace musí tyto vyrovnávací paměti explicitně vyprázdnit, například pomocí fclose(3) nebo fsync(3). Funkce exit(3) to také dělá před ukončením procesu, zatímco funkce _exit(2) ne , což je důvod, proč je na manuálové stránce velké varování, že tato funkce ji volá pouze v případě, že víte, co děláte.

  3. Vyrovnávací paměti jádra

    OS si pak uchovává svou vlastní mezipaměť, aby se minimalizoval počet požadavků, které potřebuje odeslat na disky. Tato mezipaměť nepatří žádnému konkrétnímu procesu, takže data v ní mohou patřit procesům, které již skončily, a protože všechny přístupy procházejí tudy, příští program data uvidí, pokud se sem dostal. Jádro zapíše tato data na disky, když na to bude mít čas nebo když bude výslovně požádáno.

  4. Mezipaměť disku

    Samotné diskové jednotky také uchovávají mezipaměť pro urychlení přístupů. Ty se zapisují poměrně rychle a existuje příkaz k zápisu zbývajících dat do mezipaměti a hlášení, když je to dokončeno, což operační systém používá při vypnutí, aby se ujistil, že před vypnutím nezůstanou žádná data nezapsaná.

Pro vaši aplikaci stačí, aby byla data zaregistrována ve vyrovnávací paměti jádra (skutečná data mohou v tomto okamžiku stále žít v mezipaměti CPU a nemusí být zapsána do hlavní paměti):proces "echo" se ukončí, což znamená, že všechny vyrovnávací paměti v průběhu procesu musely být vyprázdněny a data předána OS, a když pak spustíte nový proces, je zaručeno, že OS na požádání vrátí stejná data.


Bude vyrovnávací paměť automaticky vyprázdněna na disk při ukončení procesu?

Obecně je odpověď ne .

Záleží na příkazu. Jak zmiňují ostatní odpovědi, pokud příkaz interně neukládá data do vyrovnávací paměti, všechna data budou dostupná po ukončení příkazu.

Ale většina, ne-li všechny, standardní I/O knihovny dělá buffer stdout standardně (do určité míry) a poskytují různé záruky o automatickém vyprázdnění bufferů při ukončení aplikace.

C zaručuje, že normální výstup vyprázdní vyrovnávací paměti. „Normální ukončení“ znamená, že exit je voláno — buď explicitně, nebo návratem z main . Neobvyklé ukončení však může toto volání obejít (a tedy zanechat nevyprázdněné buffery).

Zde je jednoduchý příklad:

#include <signal.h>
#include <stdio.h>

int main() {
    printf("test");
    raise(SIGABRT);
}

Pokud to zkompilujete a spustíte, test nebude musí být nutně zapsáno do stdout.

Jiné programovací jazyky poskytují ještě méně záruk:Java například ne automatické spláchnutí po ukončení programu. Pokud výstupní vyrovnávací paměť obsahuje neukončený řádek, může být ztracen, pokud není System.out.flush() byl volán explicitně.

To znamená, že vaše tělo otázky se ptá na něco trochu jiného:pokud data do souboru vůbec dorazí , mělo by tak učinit ihned po ukončení příkazu (s výhradou upozornění popsaných v ostatních odpovědích).


Linux
  1. 3 nejlepší bezplatný software pro zobrazování obrázků na pevném disku

  2. Linux – Kdy nemám zabít -9 A proces?

  3. Nový rodičovský proces, když rodičovský proces zemře?

  1. Časté dotazy k systémovému disku a datovému disku

  2. Jak zjistit, který proces zapisuje na disk v Linuxu

  3. Jaký proces používá celý můj disk IO

  1. Jak mohu forkovat proces, který nezemře, když shell opustí?

  2. Co dělat, když Ctrl + C nemůže zabít proces?

  3. Kdy bych neměl zabít -9 proces?