블록 (컴퓨팅)

컴퓨팅(특히 데이터 전송 및 데이터 저장)에서 블록(block) 또는 물리적 레코드는 일반적으로 특정 정수 개의 레코드를 포함하는 고정된 길이의 바이트 또는 비트 (단위) 시퀀스인 블록 크기를 가진다. 이와 같이 구조화된 데이터는 블록화되었다고 말한다. 데이터를 블록에 넣는 과정을 블록화라고 하며, 블록에서 데이터를 추출하는 과정을 디블록화라고 한다. 블록화된 데이터는 일반적으로 데이터 버퍼에 저장되며, 한 번에 전체 블록 단위로 읽거나 쓰여진다. 블록화는 오버헤드를 줄이고 데이터 스트림의 처리를 가속화한다. 자기 테이프 및 CKD 디스크 장치와 같은 일부 장치의 경우, 블록화는 데이터에 필요한 외부 저장 공간의 양을 줄인다. 블록화는 9-트랙 자기 테이프, NAND 플래시 메모리 및 플로피 디스크, 하드 디스크, 광 디스크와 같은 회전 미디어에 데이터를 저장할 때 거의 보편적으로 사용된다.

대부분의 파일 시스템은 블록 장치를 기반으로 하는데, 이는 지정된 데이터 블록을 저장하고 검색하는 하드웨어에 대한 추상화 수준이지만, 파일 시스템의 블록 크기는 물리적 블록 크기의 배수일 수 있다. 이는 파일 길이가 블록 크기의 정수 배수가 아닌 경우가 많아 파일의 마지막 블록이 부분적으로 비어 있을 수 있기 때문에 내부 단편화로 인해 공간 비효율성을 초래한다. 이는 슬랙 공간을 생성한다. Btrfs 및 FreeBSD UFS2와 같은 일부 최신 파일 시스템은 블록 서브할당 및 테일 병합이라는 기술을 통해 이 문제를 해결하려고 시도한다. ZFS와 같은 다른 파일 시스템은 가변 블록 크기를 지원한다.

블록 스토리지는 일반적으로 응용 프로그램 및 최종 사용자가 사용하기 위해 파일 시스템 또는 데이터베이스 관리 시스템 (DBMS)에 의해 추상화된다. 블록 I/O를 통해 접근되는 물리적 또는 논리적 볼륨은 서버 내부에 있는 장치일 수 있으며, SCSI 또는 파이버 채널을 통해 직접 연결되거나, iSCSI 또는 AoE와 같은 프로토콜을 사용하여 스토리지 에어리어 네트워크 (SAN)를 통해 접근되는 원격 장치일 수 있다. DBMS는 파일 시스템 위에 DBMS를 계층화하는 것과 비교하여 향상된 성능과 복구 가능성을 위해 자체 블록 I/O를 사용하는 경우가 많다.

리눅스에서 대부분의 파일 시스템의 기본 블록 크기는 4096바이트이다. GNU 코어 유틸리티의  명령을 사용하여 블록 크기를 확인할 수 있다.

러스트에서 블록은  메서드를 사용하여 읽을 수 있다.
const BLOCK_SIZE: usize = 4096;

if let Ok(mut file) = File::open("example.bin")
{
    let mut buf = [0u8; BLOCK_SIZE];
    file.read_exact(&mut buf);
}

파이썬에서 블록은  메서드를 사용하여 읽을 수 있다.
BLOCK_SIZE = 4096

with open("example.bin", "rb") as file:
    block = file.read(BLOCK_SIZE)

C 샤프에서 블록은  클래스를 사용하여 읽을 수 있다.
const int BLOCK_SIZE = 4096;

using FileStream stream = File.Open("example.bin", FileMode.Open);
var block = new byte[BLOCK_SIZE];
await stream.ReadAsync(block, 0, BLOCK_SIZE);

 각주 

분류:기억 장치
분류:데이터 전송