차근차근/C

flush

예쁜꽃이피었으면 2014. 8. 5. 13:16

http://www.winapi.co.kr/ApiBoard/content.php?table=tblcppqa&pk=86


cout << "hello" << flush;


flush 란게 buffer를 clear 한다던데요.

================================================================================================

1.

cout은 버퍼링을 합니다. 즉, cout<<"hello";을 한다고 해서

곧바고 찍는 것이 아니고 버퍼에 저장을 해뒀다가

적당한 때에 버퍼를 비우면서 화면에 찍습니다.

하나하나 찍으면 속도가 느려지기 때문이죠..

그때 버퍼를 비우며 찍는 것을 보통 flush한다고 합니다.(맞는지 모르겠군

요..)


flush는 그걸 하라는겁니다.


직접 flush를 하라고 하지 않아도..

적당한 때에 알아서 flush를 하기 때문에 보통 flush를 쓰지 않아도

잘 찍힙니다.








2.

C++ 내부에는 효율을 높이기 위해서 여러가지

알고리즘을 사용하고 있습니다.


예를들어 화면에 출력하는 루틴을 작성한다면,


cout << "a";

cout << "b";

cout << "c";

cout << "d";

..

..

..


이렇게 하였을때 a 출력하고 b 출력하고 c 출력하고,...

이러는 것은 매우 비 효율적입니다.


대신 출력하기 전에 출력할 내용을 내부 버퍼에 담아 두었다가

버퍼가 꽉차거나 어느정도 데이터가 모였을때 한꺼번에 출력

하는것이 효율적입니다.


이것은 파일에 데이터를 저장할때도 마찬가지 입니다.

특정 파일에 1 Byte 씩 계속 저장을 해댄다면, 그 디스크는

얼마 못가서 수명이 다 되어 버릴것입니다.


대신 예를들어 저장해야할 데이터를 버퍼에 모아두다가

1024 Bytes 가 되면 그 때 한꺼번에 디스크에 쓴다고 하면

효율이 좋아지겠지요.


flush 는 이러한 데이터 버퍼링을 그만하고 현재 버퍼링 되어

있는 데이터를 당장 화면에 표시하거나 파일에 쓰라는 이야기입니다.


cout << "hello" << flush;


에서 flush 를 사용한 이유는 아마도 "hello" 라는 문자열은

표준출력으로 어떠한 지체도 없이 (또 다른 출력할 문자열이 없나

기다리는것) 화면에 출력하라는 것입니다.


flush 의 효과가 잘 안보이는 것은, 내부적으로 특정 시점이 되면

자동으로 해주기 때문입니다.


프로그램이 끝나는 시점에는 flush 가 수행될것이고, 파일에

데이터를 쓰는 경우에는 파일을 close 하는 시점에 flush 가

자동으로 수행될 것이기 때문입니다.











3.

cout 과 같은 Console In/out 에서의 flush 는

커다란 의미부여가 힘드실 겁니다.


flush 가 중요하게 쓰이는 부분이 바로

file 의 out(write) 입니다.


대량의 화일을 Write 하게 되면

Multi-task OS 에서는 일정 부분의 작업(Writting) 만을

한 뒤, 다음 Processing 단계로 넘어갑니다.


즉, 화일 Writting 의 종료가 완벽하게 되었는지

보장해 주지 않는것입니다.

그후, CPU 의 Load 가 적어지면, OS 에서 Writting 을

하게 되는데, 중요한 Data 의 경우, 프로그램 종료 후

또는 다른 프로그램과 같이 쓰이는 Shared File 일 경우

동기화에 문제가 생기고, 자료의 무결성에 치명적인

손상을 입힐 수 있습니다.


CISAM, 또는 기타의 database 관련 프로그램들은

내부적으로 flush 를 꼭! 사용해야 하는데,

Write 구문시 data 전체를 화일에 Write 했다는

보장을 받기 위한 것입니다.


분명, 프로그램에는 이상이 없는데,

어제 작업한 화일(writting file)에 자료가 모자란다면

얼마나 당황스럽겠나요 ?


도움이 되시길...

반응형

'차근차근 > C' 카테고리의 다른 글

cout  (0) 2014.08.06
C 언어 레퍼런스 - atol 함수  (0) 2014.08.06
[C++] 하위 폴더 검색 최간편 소스  (0) 2014.08.04
MSB3073 에러  (0) 2014.08.01
비쥬얼 스튜디오 디버깅 팁 ( Visual Studio Debugging Tips )  (0) 2014.07.30