~에서https://unix.stackexchange.com/a/472920/674
"문자 장치"와 "블록 장치"는 Unix 스타일 시스템에서 다양한 장치를 분류하기 위해 일반적으로 사용되는 추상적인 개념입니다.
장치가 하드웨어(장치 또는 장치 컨트롤러), 장치 드라이버, 파일 시스템, 운영 체제 커널 I/O 하위 시스템 및/또는 기타 사항에 의해 결정되는 블록 장치 또는 문자 장치입니까?
나는 이를 장치 드라이버, 파일 시스템 및 운영 체제 커널 I/O 하위 시스템과 무관한 순수한 하드웨어(장치 또는 장치 컨트롤러) 개념으로 생각합니다.
~에서블록/문자 장치와 무작위/순차 액세스 사이에 영향이 있나요?
눈에 보이는 유일한 차이점은 블록 장치는 버퍼 캐시를 사용하고 문자 장치는 사용하지 않는다는 것입니다. (일부 블록 장치 드라이버는 파일별로 버퍼 캐시를 우회하는 옵션을 제공할 수 있습니다.)
버퍼 캐시는 장치 드라이버, 파일 시스템 또는 하드웨어(장치 또는 장치 컨트롤러)에서 제공하는 블록 장치에서 사용됩니까? 하드웨어에 의해 결정된다면, 그 장치가 블록 장치인지, 캐릭터 장치인지는 전적으로 하드웨어(장치 또는 장치 컨트롤러)에 의해 결정된다는 뜻인가요?
감사해요.
답변1
아니요, 이는 운영 체제에 의해 결정됩니다.
FreeBSD 아키텍처 매뉴얼날짜는 2018년 9월 23일 11시 38분 04초입니다.
9.4 블록 장치(사라짐)
다른 UNIX® 시스템은 블록 장치라고 하는 두 번째 유형의 디스크 장치를 지원할 수 있습니다. 블록 장치는 커널이 캐시를 제공하는 디스크 장치입니다. 디스크 I/O 인프라 현대화의 일환으로 FreeBSD는 캐시된 디스크 장치에 대한 지원을 중단했습니다.
FreeBSD에는 여전히 디스크 블록을 읽고 쓸 수 있는 문자 장치인 "원시" 장치가 있습니다.
이름 때문에 혼동하지 마세요. 블록 장치는 버퍼링을 제공하므로 바이트 단위로 읽고 쓸 수 있습니다. 원시 장치는 문자 장치이지만 블록 단위로 읽고 써야 합니다. 블록 크기는 특정 디스크 하드웨어에 따라 다릅니다.
"문자 장치"는 원래 이름이 지정되었을 것입니다.텔레타이프라이터실제로 한 번에 한 문자씩 동작하는 터미널. 블록 장치는 장치 드라이버와 직접 상호 작용하는 것이 아니라 버퍼 캐시와 read()
상호 작용하는 특별한 경우 입니다. write()
문자 장치는 일반적인 경우가 되며 다른 모든 장치 파일에 사용됩니다. 인터페이스 는 장치별 read()
및 .write()
ioctl()
https://en.wikipedia.org/wiki/Device_file#Block_devices
대부분의 시스템은 하드디스크와 같은 하드웨어를 나타내기 위해 블록 장치와 문자 장치를 생성합니다. FreeBSD와 Linux는 분명히 이 작업을 수행하지 않습니다. 전자는 블록 장치에 대한 지원을 제거하는 반면[6] 후자는 블록 장치만 생성합니다.Linux에서는 디스크의 문자 장치를 얻으려면 "원시" 드라이버를 사용해야 합니다. 하지만 Linux 관련 플래그를 사용하여 블록 장치를 열면 문자 장치를 여는 것과 동일한 효과를 얻을 수 있습니다
O_DIRECT
.특수 파일 차단또는블록 장치하드웨어 장치에 대한 버퍼링된 액세스와 해당 세부 정보의 일부 추상화를 제공합니다. [5] 문자 장치와 달리 블록 장치를 사용하면 프로그래머는 항상 모든 크기(단일 문자/바이트 포함) 및 모든 정렬의 블록을 읽거나 쓸 수 있습니다. 단점은 블록 장치가 버퍼링되기 때문에 프로그래머는 기록된 데이터가 커널 버퍼에서 실제 장치로 전달되는 데 시간이 얼마나 걸릴지, 실제로 두 개의 개별 쓰기가 물리적 장치에 어떤 순서로 도착할지 알 수 없다는 것입니다. 장치. 또한 동일한 하드웨어가 문자 장치와 블록 장치를 모두 노출하는 경우 문자 장치를 사용하는 클라이언트는 블록 장치 버퍼의 변경 사항을 인식하지 못하기 때문에 데이터 손상 위험이 있습니다.