책소개:
350쪽 | 257*188mm (B5) | 610g | ISBN : 978-89-97750-09-2
리눅스 시스템 프로그래밍2
Second Edition
정재준(rgbi3307@nate.com) 커널연구회(www.kernel.bz)
커널연구회는 리눅스 커널과 자료구조 알고리즘을 연구하고 리눅스 시스템 프로그래밍 및 디바이스드라이버 개발을 통하여 창의적인 프로젝트를 수행하여 IoT 관련 제품들을 만들어 일상 생활을 풍요롭고 편리하게 하는데 가치를 두고 있다. 아울러 관련 기술들을 교육하여 여러사람들과 공유할 수 있도록 노력하고 있다.
리눅스 시스템 프로그래밍 개요
리눅스 시스템 프로그래밍은 낮은 단계(low-level)의 시스템과 소통하도록 리눅스 커널 및 핵심 라이브러리 함수들을 호출하는 것이다. 시스템 프로그래밍은 크게 입출력(I/O), 프로세스, 파일관리, 메모리, 신호(Signals), 시간(Time) 등의 분야로 나눌 수 있다. 먼저 시스템 프로그래밍의 개념에 대해서 기술하고 입출력(I/O)부터 설명을 시작한다. 그리고, 좀더 진보된 입출력에 대해서 알아보고 프로세스, 메모리, 신호와 시간에 대해서 시스템 프로그래밍 하는 것을 각각 기술한다.
입출력 시스템 호출
입출력(I/O)은 CPU와 주변장치간의 데이터 교환이며, 리눅스에서는 파일을 매개로 하여 소통한다. 입출력(I/O)을 위한 시스템 함수들을 나열하면 다음과 같다. open(), read(), write(), sync(), close(), lssek(), truncate(), select(), poll(). 이 함수들의 사용법에 대해서 자세히 알아 본다.
버퍼 입출력
스트림 파일 포인터를 사용하는 버퍼 입출력(Buffer I/O)에 대해서 기술한다. 버퍼 입출력은 그동안 표준화 되었고 스트림 파일 포인터(File Pointers)를 사용한다. 따라서, 스트림 파일 열기(open), 스트림 파일 읽기(read), 스트림에 쓰기(write), 스트림 탐색(seek)에 대해서 자세히 알아보고 간단한 예제코드를 사용하여 실습한다.
프로세스 관리
프로세스(process)는 실행되는 프로그램을 일컫는 말이며 태스크(task)라고도 한다. 대부분의 컴퓨터는 동시에 여러가지 일들을 할 수 있다. 사용자 프로그램을 실행함과 동시에 디스크에서 데이터를 읽을 수 있고 화면이나 프린터로 문자를 출력할 수도 있다. 컴퓨터는 이러한 여러가지 프로그램들을 다중적인 프로세스로 관리한다. 프로세스는 fork와 exec 시스템 호출로 생성 및 실행되고 exit에 의해서 소멸된다. 아울러 좀더 작은 태스크 단위인 쓰레드에 대해서 상세하게 설명하고 프로세스간에 주고 받는 신호에 대해서도 설명한다.
시간에 대해서
현대의 운영체제(OS)는 시간을 다양하게 제공하고 있고, 많은 프로그램들은 이러한 시간을 잘 활용해야 한다. 커널은 여러가지 방식으로 시간의 흐름을 측정한다. 실제 시간(Wall time)은 우리가 벽에 걸려 있는 시계에서 시간을 확인하듯이, 실생활속에서 사용하는 실제의 날짜와 시간이다. 프로세스들은 사용자와 소통하거나 사건 발생시점을 표현할때 이러한 실제 시간(wall time)을 사용한다. 프로세스 시간(Process time)은 프로세스가 소비하는 시간이며, 시간 소비는 직접적으로는 사용자 코드 공간에서, 간접적으로는 커널이 작업하는 곳에서 소비된다. 프로세스들은 주어진 동작들이 얼마나 오래 걸리는지 시간을 측정한다. 그런데, 실제시간(wall time)으로는 프로세스의 동작시간을 잘못 측정하는 경우가 있다. 왜냐하면, 리눅스의 멀티태스킹 처리 특성으로 인해서 주어진 동작처리 동안의 프로세스 시간이 실제시간(wall time)보다 더 적게 측정될 수 있다. 또한, 프로세스는 입출력(I/O)을 위해 많은 사이클동안 대기하며 시간을 보낼 수도 있다. 단순 시간(Monotonic time)은 엄격히 말하자면 선형적으로 증가한다. 리눅스를 포함한 대부분의 운영체제(OS)는 시스템 uptime(부트이후 시간)을 사용한다. 실제시간(wall time)은 변화될 수 있다. 왜냐하면, 사용자들이 조절할 수 있고, 시스템이 지속적으로 조금씩 어긋난 시간을 조정하기 때문이다. 또한 비정확한 시간이 나타날 수 있는데, 말하자면, 초가 껑충 뛰어 오르는 경우이다. 한편, 시스템 uptime은 결정론적이며 변화지 않는 시간이다. 단순 시간(monotonic time)의 중요한 개념은, 현재 값은 아니지만 시간이 엄격하게 선형적으로 증가함을 보장해 준다는 것과, 두개의 대상 사이에서 발생하는 시간차를 정확히 계산할때 유용하다는 것이다. 그러므로, 단순시간(monotonic time)은 상대적인 시간을 계산하는데 적절한 반면에 실제시간(absolute time)은 절대적인 시간을 측정하는데 적합하다.
메모리에 대해서
메모리는 가장 기본적이면서도 핵심적인 부분으로 프로세스가 사용하는 자원이다. 이러한 메모리자원을 할당하고 사용 및 해제하는 방법에 대해서 설명한다. 많은 사용자들은 더 많은 메모리를 선호하는 경향이 있으나, 중요한 것은 메모리를 효율적으로 활용하는 방법이다.
부록
필자가 작성한 영어학습기 소스를 분석한다. 영어 학습에 대한 견해와 함께 임베디드 기기에 영어 학습기를 구현하는 방법에 대해서 기술한다. 그리고 커널연구회에서 진행하고 있는 똑똑한왕자(SmartPrince) 프로젝트에 대해서 소개하고 이것이 동작되는 과정을 설명한다.
목차:
내용 저작권 1
저자 소개 2
커널연구회 로드맵 3
책내용 전체 요약 4
목차 6
제1장 리눅스 시스템 프로그래밍 개요 10
1.1 시스템 프로그래밍 라이브러리 12
1.2 통합개발환경(CODEBLOCKS) 17
1.3 시스템 호출(SYSTEM CALL) 19
제2장 입출력(I/O) 시스템 호출 22
2.1 OPEN() 22
2.2 WRITE() 26
2.3 READ() 28
2.4 SYNC() 31
2.5 CLOSE() 35
2.6 LSEEK() 35
2.7 SELECT() 38
2.8 POLL() 42
2.9 시리얼 통신 예제 44
제3장 버퍼 입출력(BUFFER I/O) 53
3.1 표준 입출력(STANDARD I/O) 54
3.2 파일 포인터(FILE POINTERS) 54
3.3 스트림 파일 열기(OPEN) 54
3.4 스트림 파일 읽기(READ) 56
3.5 스트림에 쓰기(WRITE) 59
3.6 스트림 탐색(SEEK) 64
3.7 버퍼링 제어 68
3.8 SCATTER/GATHER 72
3.9 EPOLL() 75
3.10 MMAP() 80
제4장 프로세스 관리 85
4.1 PROCESS ID 85
4.2 새로운 프로세스 실행 86
4.3 프로세스 종료 91
4.4 프로세스 대기 92
4.5 데몬(DAEMONS) 96
4.6 신호(SIGNALS) 99
4.7 쓰레드(THREADS) 104
4.7.1 쓰레드 생성 104
4.7.2 쓰레드 종료 106
4.7.3 쓰레드 동기화 113
제5장 시간에 대해서 117
5.1 시간 데이터 구조체들 120
5.2 POSIX CLOCKS 122
5.3 현재 날짜의 시간 가져오기 123
5.4 현재 날짜의 시간 설정하기 126
5.5 시간 형태 변환 128
5.6 시스템 CLOCK 맞추기(TUNING) 130
5.7 수면(SLEEPING)과 기다림(WAITING). 132
5.8 타이머(TIMERS) 136
제6장 메모리에 대해서 146
6.1 프로세스 주소 영역 146
6.2 동적 메모리 할당 151
6.3 익명(ANONYMOUS)의 메모리 매핑들 158
6.4 진보된 메모리 할당 164
6.5 스택 기반 할당 169
제7장 분석예제(영어학습기) 소개 176
7.1 언어학습에 대한 필자의 견해 177
7.2 영어의 정보연결 구조에 대한 이해 179
7.3 영어의 정보연결 장치들 181
7.4 영어학습기 시나리오 187
7.5 영어학습 시나리오(메뉴) 읽기 189
7.6 영어학습 진행 193
7.7 요약 200
제8장 분석예제(영어학습기) 전체 소스 201
8.1 영어학습기 소스코드 경로 201
8.2 /INCLUDE/DS/LIST.H 202
8.3 /INCLUDE/DS/QUEUE.H 203
8.4 /INCLUDE/DS/STACK.H 204
8.5 /INCLUDE/EBOOK/BOOK_QUEUE.H 205
8.6 /INCLUDE/EBOOK/DISPLAY.H 205
8.7 /INCLUDE/EBOOK/WORD_PAGE.H 207
8.8 /INCLUDE/FILEIO/SOUND.H 207
8.9 /LIB/DEVIO/EX.C 209
8.10 /LIB/DEVIO/GX.C 214
8.11 /LIB/DEVIO/IX.C 239
8.12 /LIB/DS/LIST.C 276
8.13 /LIB/DS/QUEUE.C 279
8.14 /LIB/DS/STACK.C 282
8.15 /LIB/FILEIO/SOUND.C 284
8.16 /EMAIN/EBOOK/BOOK_QUEUE.C 290
8.17 /EMAIN/EBOOK/DISPLAY.C 291
8.18 /EMAIN/EBOOK/EBOOK.C 293
8.19 /EMAIN/EBOOK/WORD_PAGE.C 307
부록A. 커널연구회 똑똑한왕자 소개 314
부록B. 커널연구회 교육과정 상세안내 325
B.1 커널연구회 교육과정 로드맵 325
B.2 C언어와 자료구조 알고리즘 326
B.3 리눅스 시스템 프로그래밍 330
B.4 ARM 아키텍쳐, STM32 프로그래밍 334
B.5 리눅스 커널 자료구조 알고리즘 실습 337
B.6 리눅스 커널 소스 디버깅 실습 341
B.7 리눅스 커널 DEVICE TREE 실습 345
B.8 교육 내용 테이블 349
리눅스 시스템 프로그래밍2