System
5. 직접 입출력
직접 입출력 다른 운영체제들과 마찬가지로 리눅스 커널은 디바이스와 응용 프로그램 사이에 캐시, 버퍼링, 입출력 관리 등과 같은 복잡한 계층을 구현하고 있다. 성능이 중요한 응용 프로그램에서는 이런 복잡한 계층을 우회해서 직접 입출력을 관리하고 싶을 수도 있다. 독자적으로 입출력 시스템을 운영하는 것은 확실히 ... 매력적이다! 전반적인 파일 시스템 구조를 뜯어보면서 지식을 더 쌓아나가고, 더 나아가 결과물까지 구현이 된다면 좋은 포트폴리오로 남을 수 있을 것이다. 하지만 보통 들인 노력에 비해 효과가 미미하며, 사실 운영체제 수준에서 제공하는 도구는 애플리케이션에서 가능한 방법보다 훨씬 뛰어난 성능을 낸다. 물론 데이터베이스 시스템은 독자적인 캐시를 선호한다. 또한 운영체제의 개입을 가능한 최소한으로 줄..
4. 동기식 입출력 - fsync(), fdatasync()
개요 쓰기 작업이 지연되고 있어! 어떡하지??? 이는 큰 문제는 아니다. 쓰기 버퍼링은 오히려 에러가 아니라 성능을 향상시키는 과정이라고 할 수 있다. 흔히 '최신' 운영체제라고 하면 버퍼를 통해 지연된 쓰기 작업을 구현하고 있기 때문에 안심해도 된다. 하지만 프로그램에서 데이터가 기록되는 시점을 직접 컨트롤할 수 있다면? 이럴 때를 대비해 리눅스 커널에서는 입출력을 동기화하는 시스템 콜을 제공하고 있다. 물론 성능은 ... 비교적 희생해야 하는 면이 없지 않아 있다. fsync()와 fdatasync() POSIX에 정의된 데이터가 디스크에 기록되도록 확인할 수 있는 가장 단순한 방법은 fsync() 시스템 콜을 사용하는 것이다. 123#include int fsync(int fd);cs 인자로는 파일..
3. 파일 쓰기 - write()
write()로 쓰기 파일을 열고, 읽는 것까지 했다. 이번 포스팅에서는 write() 시스템 콜을 이용하여 파일에 사용자가 넣고 싶어하는 내용을 써보자. write() 시스템 콜은 파일에 데이터를 기록하기 위해 가장 기본적인 시스템 콜로, read()와 반대 개념이며 똑같이 POSIX.1에 정의되어 있다. read()의 기본 형태는 다음과 같다. 123#include ssize_t write(int fd, const void *buf, size_t count);cs 코드를 보면 알 수 있듯이 반환값은 ssize_t 형이다. (이에 대해서는 이전 포스팅에서 이미 설명을 했었다.) write() 호출은 count 바이트만큼 파일 디스크립터(fd)가 참조하는 파일의 현재 파일 위치에 시작 지점이 buf인 내..
2. 파일 읽기 - read()
개요 저번 포스팅에서는 open(), creat() 시스템 콜을 이용해 파일을 열어보는 것 까지 했다. 파일을 열었으니 이제 읽는 방법에 대해 알아볼 차례이다. 파일 읽기 read() 시스템 콜 가장 잘 알려진 파일 읽는 방법은 read() 시스템 콜을 사용하는 것이다. 이는 POSIX.1에 정의되어 있는 메커니즘이기도 하다. read()의 기본적인 형태는 다음과 같다. 123#include ssize_t read(int fd, void *buf, size_t len);cs read()는 해당 함수가 호출될 때마다 파일 디스크립터(이하 fd)가 참조하는 파일의 현재 file offset에서 len 바이트만큼 buf로 읽어들인다. 읽어들이는 작업에 성공하면 buf에 쓴 바이트 숫자를 반환하고, 실패하면 이..
1. 파일 열기 - open(), creat()
개요 유닉스 기반 시스템에서는 거의 모든 것을 파일로 표현하다. 그러므로 파일을 읽고, 쓰고, 삭제하고, 생성하고... 하는 모든 파일 다루기는 아주 중요하다. [Linux System Programming] 시리즈의 포스팅의 첫 번째는 파일 입출력에 대해서 써보려 한다. 파일은 읽거나 쓰기 전이 반드시 열어야 한다. 이 열린 파일들은 파일 테이블이라는 목록이 있는데, 이곳에 프로세스별로 열린 파일들을 기록한다. 파일 테이블은 커널에 의해 관리된다. 파일 테이블은 파일 디스크립터(File Descripter, fd)라는 정수 값으로 인덱싱된다. 파일 테이블의 각 항목은 열린 파일에 대한 정보를 담고 있으며, 여기에는 메모리에 복사된 inode를 가리키는 포인터, 파일 위치와 접근 모드 등과 같은 각종 메..
[2. 리눅스 운영 및 관리] 02 셸(Shell) (1) 개념 및 종류
개념 시스템을 공부하는 사람이라면 누구나 셸(Shell)이라는 단어는 한 번쯤 들어본 적이 있을 것이다. 셸은 쉽게 말하면 사용자가 입력한 명령어를 해석하여 커널에 전달하는 역할을 수행하는 명령어 해석기(Command Interpreter)라고 정의할 수 있다. DOS의 Command.com과 동일한 기능을 수행하는 프로그램이다. 커널에 해석한 명령어를 전달할 때 셸은 커널과 사용자 간의 대화식 인터페이스를 제공하여 접근을 더 쉽게 도울 수 있다. 또한 셸 자체가 프로그래밍 기능을 가지고 있기 때문에 강력한 스크립트 언어이기도 하다. 더 부가적인 기능으로는 입출력 방향 재지정(redirection)과 파이프(pipe) 기능 제공과 포그라운드 / 백그라운드 프로세스 실행이 가능한 것이 있다. 종류 셸은 그..