본문 바로가기
Linux/운영

[Linux] 캐싱(Caching)과 버퍼링(Buffering) 그리고 스풀링(Spooling)

by A6K 2023. 12. 8.

시스템 소프트웨어를 다루다보면 '캐싱(Caching)', '버퍼링(Buffering)', '스풀링(Spooling)'에 대한 언급이 자주 나온다. 이들은 각각 어떤 개념이고 어떤점에서 다른지 알아보자.

캐싱 (Caching)

캐싱이란 데이터를 좀 더 빠른 속도의 메모리 영역에 가져와서 접근하는 방식을 말한다. 우리가 사용하는 컴퓨터는 하드디스크, SSD, RAM, CPU 캐시 등의 메모리로 구성되어 있다.  하드디스크과 SSD는 데이터에 접근하기까지 시간이 오래걸리지만 저렴하다. CPU의 캐시는 굉장히 빠르지만 가격이 비싸다. 따라서 이들을 계층적으로 구성해서 필요하거나 필요할 것으로 예상되는 데이터를 미리 더 빠른 메모리로 올려놓고 처리하게 되는데, 이를 캐싱이라고 한다.

데이터는 지역성(Locality)이라는 특성을 갖는다. 지역성에는 공간 지역성과 시간 지역성이 존재한다. 공간 지역성이란 한번 읽힌 데이터의 주변에 있는 데이터가 다음번에 읽히게 될 가능성이 높음을 의미한다. 시간 지역성이란 한번 접근된 데이터가 짧은 시간안에 다시 접근될 가능성이 높음을 의미한다.

이런 특성을 이용해 데이터는 하드디스크 혹은 SSD에 있다가 메인 메모리(RAM)로 큰 덩어리로 캐싱되어 진다. 그리고 좀 더 작은 덩어리로 CPU 캐시에 캐싱되어 처리된다. 캐싱은 데이터 접근의 지역성을 이용해서 자주 접근될 데이터를 좀 더 빠른 메모리에 올려서 연산을 수행해 성능을 높이는 작업이다.

버퍼링 (Buffering)

버퍼링은 데이터를 버퍼(Buffer)라고 하는 곳에 모았다가 처리하는 방식을 의미한다. 버퍼를 사용하는 이유는 크게 3가지가 있다.

첫 번째, 생산자와 소비자 사이에 데이터 처리 속도차이가 있는 상황에서 오는 비효율을 극복하기 위함이다. 예를 들어 CPU를 통해 데이터를 다루다가 다시 디스크로 쓰기 연산을 하려고 할 때, 매번 디스크 드라이브로 데이터를 전달하고, 디스크가 데이터를 쓸 때까지 기다린다면 CPU의 효율이 매우 떨어지게 된다. 따라서 디스크에 쓰여질 데이터를 버퍼에 모았다가 한번에 디스크로 내리는 방식을 사용해 CPU 사용 효율을 높이게 된다.

두 번째, 서로 다른 자료 전송 사이즈가 다른 상황을 극복하기 위함이다. 4KB 단위로 처리하는 시스템과 64KB 단위로 데이터를 처리하는 시스템이 있다고 할 때, 4KB 단위로 넘어오는 데이터를 모아서 64KB 단위로 다시 전송하는 과정이 중간에 필요하다. 이 때, 버퍼를 구성해서 버퍼에 데이터를 모았다가 더 큰 단위의 데이터로 모아서 전송하게 된다.

세 번째, 데이터 입출력의 의미를 명확하게 하기 위해 사용한다. 예를 들어 Unix 프로세스가 write() 시스템 콜을 사용해 디스크 쓰기 요청을 했다고 생각해보자. write() 시스템 콜은 애플리케이션의 버퍼에 있는 데이터를 커널 영역의 버퍼로 복사해준다. 만약 커널에서 버퍼링을 하지 않는다면 커널은 유저 영역에 있는 버퍼의 내용을 디스크로 쓰려고 할 것이다. 커널이 버퍼의 내용을 쓰는 도중 유저 애플리케이션이 버퍼의 내용을 바꾼다면, 일관되지 않은 형태의 데이터가 디스크로 쓰여질 것이다.

스풀링 (Spooling)

스풀링은 디바이스를 독점적으로 사용해야하는 경우에 쓴다. 대표적으로 프린터를 생각해볼 수 있다. 프린터는 하나의 프로세스가 프린팅을 수행하는 동안 다른 요청은 처리하면 안된다. 이 경우 프린터에 대한 요청은 대기를 해야하는데, 추가로 프린팅해야하는 데이터를 디스크의 공간을 잡아서 저장해둔다. 이를 스풀링(Spooling)이라고 한다.

MS Word에서 프린터를 사용해서 10페이지 가량을 인쇄하고 있는 동안 MS PowerPoint에서 프린터 사용을 요청했을 때, 프린팅 요청은 디바이스 드라이버에서 스케줄링을 기다리며, 프린팅해야하는 데이터는 디스크에 저장하게 된다. 이 디스크 공간을 스풀이라고 한다. 이전에 수행중이던 MS Word의 프린팅 작업이 끝나면 스풀에 저장된 다음 작업인 MS PowerPoint의 프린팅 작업이 시작되며 프린팅할 데이터를 스풀에서 읽어 수행하게 된다.

댓글