system programming

    shared memory with semaphore

    앞서 'shared memory with mutex' 에서는 2개 이상의 프로세스에서 공유 메모리를 이용해 데이터를 공유할 때 Lock / Unlock을 위해 mutex를 사용하는 방법에 대해 살펴보았습니다. 이번 글에서는 공유메모리를 이용해 데이터를 공유할 때 여러 프로세스들이 semaphore을 이용해 Lock / Unlock 하는 방법에 대해 알아보겠습니다. 앞서 'shared memory with mutex'를 보신 분들이라면 쉽게 이해 하실 수 있는데요, 코드 중 mutex 관련된 코드 대신 semaphore 코드로 대체해 주는 것 밖에 없습니다. 저는 semaphore을 POSIX Spinlock API들을 사용하였습니다. semaphore는 커널에서 관리해주는 정수로서 0이하의 음수 값으로는..

    [파일입출력] 4. 동기식 입출력

    입출력을 동기화하는 것은 분명 중요합니다. 하지만, 그 문제를 너무 확대 해석하고 크게 신경 쓸 필요는 없습니다. 요즘의 운영체제들은 버퍼를 통한 지연된 쓰기 작업을 구현하고 있습니다. 그렇기에 앞에 write() 시스템 콜 이용 시 주의해야 될 사항들을 그렇게 신경쓰지 않으셔도 됩니다. 하지만, 개발을 하다보면 개발자가 직접 데이터가 디스크에 기록되는 시점을 제어하고 싶을 때가 있습니다. 이런 상황에 맞춘 몇몇의 시스템 콜을 확인해 보겠습니다. 1. fsync() 시스템 콜과 fdatasync() 시스템 콜 첫 번째는 fsync() 시스템 콜과 fdatasync() 시스템 콜입니다. 먼저, fsync() 시스템 콜에 대해 알아보겠습니다. #include int fsync (int fd) 입력인자 int..

    [파일입출력] 2. read()로 파일 읽기

    [파일입출력] 2. read()로 파일 읽기

    지난 번 파일을 열었다면, 이번엔 열려있는 파일을 읽어보겠습니다. 가장 대표적인 저수준 파일 입출력에서는 POSIX에 정의된 read() 시스템 콜을 사용하여 파일을 읽어 들이는데요, 파일 오픈 시 사용했던 파일 디스크립터 기억나시나요? fd가 참조하는 파일의 오프셋에서 len 바이트만큼 buf로 읽어 들이게 됩니다. 먼저, read() 시스템 콜의 원형과 인자를 확인해 봅시다. #include ssize_t read (int fd, void *buf, size_t len) 입력 인자 int fd open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호 void* buf 파일에서 읽은 데이터를 저장할 메모리 공간 len 읽을 데이터의 크기(Byte 단위) 반환값 ssize_t 파일 읽기 성공 : 0..