기본 콘텐츠로 건너뛰기

Block device VS Character device

출처 - http://raphaell.egloos.com/1009300

[Block device]
* Serial 한 특성의 데이터를 다루기 위한 디바이스를 지칭하며, Terminal, Serial Port 등이 포함이 된다. 
 - 데이터 버퍼링이 불가능함
 - 데이터 전송단위를 byte를 기본으로 한다. 
 - ioctl() 시스템 콜을 이용한 핸들링을 기본으로 한다. 

[Character device]
* Random Access가 가능한 데이터를 다루기 위한 디바이스를 지칭하며, Disk, Tape 등이 포함이 된다.
 - 데이터 버퍼링이 가능
 - 정해진 단위(Block, Sector)로 데이터를 전송한다.
 - 마운트와 언 마운트가 가능한다.

cf. 하나의 물리적 장치는 동시에 character device이면서 block device일 수 있다. 이럴 경우 반드시 character device와 block device를 별도로 생성해야 한다. 



Block Device
Character Device
데이터 전송
System buffer 사용 (Block, Sector)
byte 단위로 전송
I/O 전송속도
전송속도가 높다
시스템의 I/O Buffer를 사용하지 않아 느릴 수도 있으나 버퍼처리를 응용프로그램이 제어하므로 응용 프로그램의 성능에 따라 다를 수 있다
대표적인 장치
하드 디스크
테이프 장치
플로피 디스크
광 자기 디스크
단말기
프린터
플로터 및 기억장치

운영체제는 물리적인 디스크를 블록단위로 나누고 각 블록에 주소를 부여하여 디스크를 관리하게 되는데, Block device의 Block은 File System에서의 Block을 의미한다고 할 수 있다.

Block Device와 Character Device의 가장 큰 차이점은 Application의 I/O 요구가 있을 시, 데이터를 File System에서 읽느냐? Character Device(Raw Device)에서 읽어오느냐의 차이인데 File System에서 읽어올 경우 운영체제의 File system Cache에 Buffering을 사용하고 Character Device에서 읽어 올 경우에는 파일 시스템이 없기 때문에 당연히 파일, 디렉토리, Access Control등을 어플리케이션에서 직접 관리해야 한다. 

Raw Device를 사용하는 대표적인 어플리케이션으로는 DBMS가 있고, 데이타 베이스는 자체적으로 블록과 익스텐트 등의 스토리지 관리 개념을 가지고 있기 때문에 이것을 Raw Device가 아닌 운영체제의 File System을 사용할 경우 DBMS와 운영체제에서 이중으로 Buffering을 하기 때문에 효율적이지 못하므로 Raw Device를 사용한다. 

Raw Device와 File System의 장단점을 말하자면 파일관리측면에선 파일 ㅅ시스템이, 성능면에서 Raw Device가 좋다고 할 수 있다. 앞에서 말한 바와 같이 DBMS가 자체 IO버퍼를 설정하기 때문에 OS의 파일시스템 캐시가 필요없게 되므로, 운영체제와 어플리케이션이 더블 버퍼링을 막음으로써 운영체제는 메모리 파일 시스템 캐싱을 위한 메모리 메니지먼트(메모리에 적재하여 Block이 꽉차면 Disk Write)가 필요없어지고, DBMS에서만 버퍼링을 하므로 메모리를 덜 소모하게 된다.

RAW의 장점은 KAIO(Kernel async IO)도 있다. Raw Deivce는 I/O 요구가 발생될 때 유저 라이브러리르 사용하지 않고 커널 레벨에서 I/O가 이루어 지므로 명령이 단순해져서 결과적으론 CPU를 덜 사용하게 된다. 
하지만 File System은 관리측면에서 OS에서 지원하는 여러가지 Tool을 사용하여 관리 할 수 있는 반면, Raw Device는 초기에 설치가 어렵고, File System이 없기 때문에 Backup 및 관리에서도 어려운 면이 적지 않다.

댓글

이 블로그의 인기 게시물

UNIX C errno 정리( 에러 번호 )

#define EPERM   1   /* Operation not permitted      */ #define ENOENT  2   /* No such file or directory        */ #define ESRCH   3   /* No such process          */ #define EINTR   4   /* interrupted system call      */ #define EIO 5   /* I/O error                */ #define ENXIO   6   /* No such device or address        */ #define E2BIG   7   /* Arg list too long            */ #define ENOEXEC 8   /* Exec format error            */ #define EBADF   9   /* Bad file descriptor          */ #define ECHILD  10  /* No child processes           */ #define EAGAIN  11  /* Resource temporarily unavailable */ #define ENOMEM  12  /* Not enough space         */ #define EACCES  13  /* Permission denied            */ #define EFAULT  14  /* Bad address              */ #define ENOTBLK 15  /* Block device required        */ #define EBUSY   16  /* Resource busy            */ #define EEXIST  17  /* File exists              */ #define EXDEV   18  /* Improper link            */ #define ENODEV  19  /* No such

시리얼(Serial) 이란?

출처 - http://www.ni.com/white-paper/2895/ko/#toc4 시리얼은 거의 모든 PC에서 표준으로 사용되는 디바이스 통신 프로토콜입니다. 시리얼의 개념을 USB의 개념과 잘 구분하십시오. 대부분의 컴퓨터에는 2개의 RS232 기반 시리얼 포트가 있습니다. 시리얼은 또한 여러가지 디바이스에서 계측을 위한 일반 통신 프로토콜이며, 여러 GPIB 호환 디바이스에는 RS232 포트가 장착되어 있습니다. 뿐만 아니라, 원격 샘플링 디바이스로 데이터 수집을 하는 경우에도 시리얼 통신을 사용할 수 있습니다. 시리얼 통신의 개념은 간단합니다. 시리얼 포트는 정보의 바이트를 한번에 한 비트씩 순차적으로 송수신합니다. 한번에 전체 바이트를 동시에 전달하는 병렬 통신과 비교하면 시리얼 통신은 속도가 느리지만 훨씬 간단하며 장거리에도 사용할 수 있습니다. 예를 들어, 병렬 통신용 IEEE 488 스펙을 보면 기기간 케이블링은 총 20 m 미만이어야 하며, 두 개의 디바이스간은 2 m 미만이어야 합니다. 반면 시리얼 통신은 최대 1.2 Km의 통신거리를 보장합니다. 통상 엔지니어들은 ASCII 데이터를 전송할 때 시리얼 통신을 사용합니다. 이 때 송신용 (Tx), 수신용 (Rx), 그라운드용 (GND)의 세 가지의 전송 라인을 사용하여 통신합니다. 시리얼은 비동기식이므로 포트는 한 라인에서 데이터를 전송하고 다른 라인에서 데이터를 수신합니다. 핸드쉐이킹용 라인도 사용 가능하지만 필수 요구사항은 아닙니다. 시리얼 통신의 가장 중요한 특징에는 보드 속도 (baud rate), 데이터 비트, 정지 비트, 패리티가 있습니다. 두 개의 포트가 통신하기 위해서는 이러한 파라미터가 반드시 적절하게 맞춰져야 합니다. 보드 속도는 통신의 속도를 측정하는 수치이며 초당 비트 전송 숫자로 표시됩니다. 예를 들어 300 보드 속도는 초당 300 비트를 의미합니다. 엔지니어들이 흔히 말하는 클럭 주기는 보드 속도를 의미합니다. 따라서 프로토콜에 4800

[C언어] epoll 설명

출처 -  http://biscuit.cafe24.com/moniwiki/wiki.php/epoll 1  준비 2  socket 프로그래밍 기본 3  비동기 입출력 (Asyncronous I/O) & 입출력 다중화 (I/O Multiplexing) 4  select 5  select 와  poll  그리고 epoll. 그 차이 6  epoll 프로그래밍 흐름 7  epoll 함수들 8  epoll References 빈폴도 아니고, 이폴이란 대체 무엇일까? 당신은 서버한대로 몇 명의 동시접속자를 수용할 수 있습니까? 최근에 인터넷에 떠돌아다니는  c10k_problem 은 대당 10K, 즉 1만명의 동시접속(concurrent users)을 받아보자는 문제다. 서버 프로그래밍을 해 본 사람이라면 이게 그리 만만한 문제가 아니라는 것을 직감할 듯 --; 요즘의 Massive 온라인게임은 '분산처리'가 기본이라 한 대에서 많은 이용자를 커버하기보다는 여러대가 하나의 세트로써 구성하는 것이 인기가 있고 다수의 커넥션보다는 소수 커넥션에서의 대용량 전송이 더 중요한 요소이기도 하다. c10k problem에 나또한 관심을 가지게 되었고, epoll 이 최근 급부상하는 솔루션으로 인기가 있다기에 한 번 파보자 하고 결심하고 이 글을 시작했다. 마침 wiki에도 관심이 있던 차라, wiki 공부도 할 겸해서 epoll 을 연구하는 과정을 이 wiki에 담아 보고자 한다. 1  준비  # * 누구를 위한 epoll 인가? epoll은 '한 대의 서버에서 아주많은 동시접속자를 처리하기 위한 수단'이다. 이미 당신이 그 수단을 알고 있다면 - epoll 이건 아니건 - 이 글은 별로 도움이 안될듯하다. 동시접속자가 천명을 넘지않는다면 구닥다리 방법을 이용하는 것과 큰 차이가 없으리라 본다. 또한, epoll은  Linux 프로그래머의 도구 이다. M$ wind