System Programming 리눅스시스템 프로그래밍 김정국지음 System Programming
머리말 오늘날리눅스운영체제는클라우드, 서버, 데스크탑, 임베디드시스템및모바일기기등에서광범위하게사용되고있다. 본교재는컴퓨터공학관련학과에서 운영체제 를이수하기위한선수과목인 시스템프로그래밍 의교재로서리눅스운영체제 API의활용을주로다루며, 그외에운영체제의개념을포함한다음내용을다룬다. - 리눅스운영체제의역사와간략한특징소개 - 병행프로세스 / 스레드의개념및커널과의관계 - 시스템호출과인터럽트및 context switching의관계 - 프로세스스케줄링 - 주요시스템호출과디스크및타이머인터럽트핸들러의내부소개 - 프로세스기반병행프로그래밍및관련리눅스 API의활용 - 리눅스파일시스템과관련 API의활용 - 메모리관리및관련 API의활용 - 프로세스간통신과관련 API의활용 - 임계구역과상호배제및세마포어 - 데드락과처리 - 시간관리와관련 API의활용 - 소켓기반네트워크프로그래밍 - Pthread를활용한병행스레드프로그래밍위와같은내용이심도있는리눅스커널의이해및활용의기초도서로참고되기를바란다. 2014 년 2 월 저자김정국 머리말 3
목차 머리말 3 제제제제 Linux Overview 9 1.1 Linux 운영체제의역사 9 1.2 리눅스운영체제의특징 11 제제제제리눅스활용을위한기본지식 16 2.1 리눅스의사용자계정 16 2.2 리눅스의부팅과정 17 2.3 GNU gcc 컴파일러 18 2.4 쉘 22 2.5 환경설정 23 2.6 계층구조적파일시스템 24 제제제제프로세스(Process) 와스레드 (Thread) 27 3.1 프로세스의상태 28 3.1.1 프로세스의상태전이 29 3.1.2 리눅스프로세스의상태 30 3.2 프로세스의문맥교환 (context switch) 34 3.2.1 프로세스의문맥 (context) 과태스크구조체 34 3.2.2 프로세스간의문맥교환 (context switch) 36 3.3 시스템호출과프로세스의상태전이 38 4 리눅스시스템프로그래밍
3.4 프로세스의생성과소멸 49 3.4.1 프로세스의종료와 child 프로세스종료대기 52 3.4.2 child 프로세스의상속 54 3.5 프로세스의프로그램교체 ( 로딩 ) 를위한시스템호출 exec 그룹 56 제제제제리눅스스케줄링 61 4.1 성능향상을위한선점스케줄링의고려사항 62 4.2 리눅스스케줄링 63 4.2.1 스케줄링관련시스템호출 65 제제제제파일시스템 70 5.1 개요 70 5.2 파일시스템 inode 71 5.3 파일시스템과마운트 (mount) 72 5.4 파일시스템 ( 파티션 ) 구조 73 5.4.1 inode 내의파일데이터블록정보 74 5.5 디렉토리파일과파일접근 75 5.6 파일입출력 77 5.6.1 파일입출력함수 79 5.7 파일에의임의접근 (Random Access) 83 5.8 파일의제어 87 제제제제메모리관리 91 6.1 프로세스의가상주소공간 92 6.2 동적메모리할당 96 제제제제메모리사상파일(Memory Mapped file) 101 7.1 개요 101 7.2 기타함수들 108 목차 5
제제제제 Pipe: IPC(Inter-Process Communication) I 111 8.1 Pipe 에의한 IPC 112 8.1.1 pipe 에의한파일복사 114 8.1.2 pipe 의크기 115 8.1.3 Non-blocking pipe 입출력 116 8.1.4 pipe 와 shell 118 8.2 Named pipe 와 FIFO 파일 121 제제제제시그널 : IPC II 127 9.1 사용자정의시그널처리기 131 9.2 시그널과시스템호출 133 9.3 시그널에의한동기화 138 제제제제제병행프로세스간의임계구역및상호배제 : IPC III 146 10.1 임계구역과상호배제 146 10.2 fcntl 함수에의한 Readers lock 과 Writer s lock 148 10.2.1 lockf 함수에의한파일 / 레코드 locking 154 10.3 교착상태 (Deadlock) 155 10.3.1 Lock 획득요청의순서정렬에의한방법 157 10.4 세마포어 (Semaphore) 158 10.4.1 세마포어와상호배제 159 10.4.2 세마포어에의한동기화 160 10.4.3 바이너리세마포어와카운팅세마포어 161 10.4.4 리눅스계열의세마포어 161 제제제제제프로세스간고급통신도구 : IPC IV 169 11.1 메시지큐 (Message Queue) 170 11.2 공유메모리 (Shared memory) 177 11.2.1 병행프로세스에의한 double buffering 의예 180 11.2.2 IPC 관리를위한쉘명령어들 185 6 리눅스시스템프로그래밍
제제제제제시간관리 187 12.1 시간표시를위한구조체 187 12.1.1 달력시간 187 12.1.2 struct tm 188 12.1.3 시간처리함수들 188 12.2 인터벌타이머 (Interval Timer) 193 제제제제제 Network Programming 197 13.1 개요 197 13.2 Connection-oriented( 연결형 ) 통신과 Connectionless( 비연결형 ) 통신 200 13.3 소켓의사용에의한통신기법 201 13.3.1 클라이언트 - 서버모델 201 13.3.2 포트 203 13.3.3 소켓과프로토콜 204 13.3.4 소켓주소구조체 206 13.3.5 소켓의바인딩 (binding) 207 13.4 연결형통신을위한함수들과예제프로그램 208 13.4.1 통신접속을위한함수들 208 13.5 메시지송수신을위한함수들 211 13.5.1 바이트순서및연산 (Byte Ordering) 213 13.5.2 네트워크정보 214 13.5.3 주소변환함수 216 13.5.4 연결형통신절차및예제 216 13.6 비연결형통신을위한함수들과예제프로그램 221 13.6.1 관련함수들 222 13.6.2 비연결형통신과예제프로그램 224 제제제제제스레드프로그래밍 229 14.1 스레드 (thread) 개요 229 14.2 프로세스와스레드의관계 230 목차 7
14.2.1 스레드간에공유하는자원들 231 14.2.2 스레드간에공유하지않는자원들 231 14.3 POSIX Thread(Pthread) 232 14.3.1 Pthread의생성과종료 233 14.3.2 Pthread 식별자 (identifiers) 237 14.3.3 스레드의조인 (Joining threads) 238 14.3.4 스레드의분리와조인 (Detaching/Joining) 239 14.4 다중스레드 (Multi-threaded) 프로그래밍 244 14.4.1 Boss/Worker 모델 244 14.4.2 Peer 모델 249 14.4.3 파이프라인 (Pipeline) 모델 250 14.5 스레드의임계구역 (Critical Section) 과상호배제 (mutual Exclusion) 252 14.5.1 스레드를이용한생산자 / 소비자문제 254 14.5.2 스레드의상호배제 (Mutual Exclusion) 257 14.5.3 mutex 사용함수들 (pthread_mutex(3)) 259 14.6 스레드의동기화와컨디션 (Condition) 변수 263 14.6.1 컨디션변수의생성과제거함수들 263 14.6.2 컨디션변수에대한 waiting 및 signaling 264 14.7 Pthead의세마포어에의한동기화 272 14.8 Pthread 스케줄링 276 8 리눅스시스템프로그래밍
제 1 장 Linux Overview 1.1 Linux 운영체제의역사 오픈소스기반의운영체제로서여러분야에서각광받기시작한리눅스는 GNU의 GPL(General Public License) 기반의무료소프트웨어개념을지원하는운영체제이다. 여러리눅스공동체의활성화와특히 FSF(Free Software Foundation) 의 GNU 프로젝트및각산업체컨소시움또는국가에서지원하는수많은공개소프트웨어프로젝트들을통해많은무료소프트웨어의지원과다양한하드웨어지원의특징을가지고있는리눅스는서버및임베디드시스템분야에서의약진을발판으로데스크톱영역에의진출까지도모하고있다. 리눅스는오픈소스의특징에의한소프트웨어및지원하드웨어의다양성, 심도있는교육에의장점이외에강력한보안성에도잠재력을가지고있다. 오늘날리눅스는소형임베디드시스템에서부터데스크톱및대형서버에이르기까지널리사용되고있으며, 여러공동체와관련산업체의노력으로지속적인버전업그레이드가이루어지고있다. 리눅스운영체제가나오기까지의배경과발전과정은다음과같다. 1971 년, 첫번째 Unix 서버운영체제가벨연구소에서발표됨 1985년, Richard Stallman이 GNU Manifesto 를발표, 오픈소스혁명 제 1 장 _ Linux Overview 9
1987년, Andrew S. Tanenbaum이 Unix의일종인오픈소스운영체제 Minix를개발, 1991년, Linus Torvalds에의해인텔 PC 계열을 UNIX 계열운영체제인 Linux 탄생 Linux first version : 1991. 10(Linus Torvalds) POSIX 1003.1 standard compliance System V 및 BSD 4.3 운영체제대부분의기능추가 GNU GPL 정책도입 대부분의 CPU chips와 devices 지원 리눅스 ver. 2.0 대부터 SMP(Symmetric Multi-Processor) 구조의다중 CPU 시스템지원 Linux 2.4.x 버전계열이 2001년출시되어광범위하게사용됨 Linux 2.6.x, 3.0.x 버전계열이실시간시스템을위한선점형 (preemptible) kernel로개발 2004년부터출시되었음. 반면여러공동체및공개프로젝트에서의리눅스커널및관련소프트웨어개 발의다양성에따른호환성의문제때문에여러관련표준도제정되었다. 리눅스 관련대표적표준이나규격은다음과같다. LSB(Linux Standard Base) 1.2 표준은리눅스커널 API 표준을제공한다. (http://www.linuxbase.org/spec/) ELCPS(Embedded Linux Consortium Platform Specification) v1.0은임베디드리눅스구현자와응용개발자를위한 3가지크기의플랫폼에대한표준을제공한다. CELF(Consumer Electronics Linux Forum) 는 50여개이상의가전 / 컴퓨터기업들이결성한 CE 장치용임베디드리눅스의여러권장규격을제정하고있다. LIMO(Linux Mobole) 는모바일기기용리눅스개발을위한컨소시움 그이외에도 IEEE POSIX 1003.1-2001 표준및 Single UNIX Specification v3 의 대부분명세에대한호환성을제공한다. 10 리눅스시스템프로그래밍
1.2 리눅스운영체제의특징 오늘날, 리눅스운영체제는데스크톱및서버용과정보가전이나제어기기, 통신기기등의임베디드시스템을위한임베디드리눅스운영체제등, 여러가지가제공되고있거나개발되고있다. 이중, 다중사용자를위한범용운영체제로서의리눅스운영체제의주요특징은다음과같다. 1) 다중사용자시스템서버및데스크톱환경에서다중사용자의다중응용프로그램의수행환경을제공한다. 사용자들의응용은보호 (protection) 모드가동작하는사용자모드에서실행되어커널과사용자프로그램상호간의침범에의한오동작이방지된다. 다중사용자는로그인의과정을거쳐시스템에접근할수있으며, 일반사용자의응용프로그램의수행에대한권한은보호시스템에의해제한된다. 2) 프로세스및스레드기반의다중태스킹 (multi-tasking) 프로세스 (process) 와스레드 (thread) 수준의선점형다중태스킹 (multi-tasking) 을제공한다. 프로세스는 fork 시스템호출로생성되는전통적유닉스의중량급프로세스 (heavy weight process) 이고스레드는텍스트및자료영역을공유하는경량급프로세스 (light weight process) 로서시스템의측면및응용프로그램의측면에서다중프로세스또는다중스레드프로그램이가능하다. 스레드프로그래밍을위해서는 LSB 표준의 Pthread(POSIX Thread와거의동일 ) 실행을위한 Pthread 라이브러리가주로사용된다. 3) 선점및비선점스케줄링실행되는일반다중프로세스나스레드들에대해서는 CPU 독점방지와형평성을위해선점 (preemptive) 스케줄링 SCHED_OTHERS가제공된다. 실시간프로세스및스레드를위해서는선점스케줄링인 SCHED_RR 와비선점스케줄링인 SCHED_ 제 1 장 _ Linux Overview 11
FIFO 정책들이제공된다. 즉, SCHED_OTHRES와 SCHED_RR 은타임슬라이스 (time slice) 가적용되는시분할스케줄링이다. SCHED_OTHERS가적용되는일반태스크에는시스템의효율적운용을위해동적우선순위가적용되고실시간태스크에는고정우선순위기법이적용된다. 또한, Linux 2.6 대의버전이후부터는실시간스케줄링의정확도향상을위한커널선점 (preemptive kernel) 방식이제공되고있다. 4) 다중 CPU 환경의제공 (SMP와 NUMA) 다중프로세스나스레드환경의효율성을높이기위해대칭형다중처리 (SMP: Symmetric Multi Processor) 형태와, NUMA(Non-uniform Memory Access) 형태의다중 CPU 시스템을지원한다. 또한, CPU 1개당 2개 CPU의효과를발휘하는 hyperthreading도지원한다. 5) 하드웨어에대한높은이식성리눅스커널의코드중, 하드웨어에종속적인부분이매우작고, 이러한부분들도하드웨어에독립적인부분과잘분리되어있어이종하드웨어에의이식이쉽다. 또한, 넓은개발층을바탕으로다양한하드웨어 (CPU 및구동장치들 ) 를지원한다. 6) 가상메모리 (Virtual Memory) 시스템지원실제의물리적메모리공간보다매우큰프로그램을실행시킬수있는가상메모리환경을제공한다. demand paging, page-caching, swap-caching, copy-onwrite, pre-loading(omagic) 등의가상메모리관리기법을사용하여효율적인메모리환경을제공한다. 7) 가상파일시스템한시스템에서여러가지운영체제의파일시스템을사용할수있는가상파일시스템을제공한다.(Ext2, 상용유닉스파일시스템, VFAT, FAT, ISO, NFS, 등 ) 이러한파일시스템에는보호시스템이적용되어파일의접근권한, 실행권한등이통제된다. 또 12 리눅스시스템프로그래밍
한, 파일을메모리로사상하여편리하게사용할수있는메모리사상파일시스템 도제공된다. 리눅스의파일시스템은자기디스크뿐만아니라, 다양한저장매체 (RAM, Flash 메모리 ) 에대해서도같은인터페이스의파일시스템을제공한다. 8) Dynamic cache buffer cache, page cache 등의소프트웨어적캐시기법을사용하여파일입출력, 가상메모리의요구페이징 (demand paging) 이나스와핑 (swapping) 에서발생하는디스크입출력을최소화한다. 9) Shared libraries(elf) 메모리활용을극대화하기위해여러프로세스가사용하는같은라이브러리함수들을메모리에한카피 (copy) 만적재하고공유할수있는공유라이브러리기능을제공한다. 10) 네트워킹 TCP/IP, UDP/IP, SLIP, PPP 등다양한통신프로토콜과다양한통신장치를위한하위드라이버 (gigabit ether, ATM, FDDI 등 ) 들을제공한다. 또한, 웹서버, ftp 서버, NFS 서버, 프린터서버, 팩스서버, 디렉토리서버, 뉴스서버등, 네트워크환경에서다양한서비스를제공한다. 또한, VPN(Virtual Private Network) 장치, 라우터 (router) 등의통신장치로사용하기위한기본기능들을제공한다. 11) 기반언어 GNU C 리눅스자체는 GNU C를기반으로작성되어있다. 사용자는기본적으로 GNU C 컴파일러와 C++ 컴파일러인 gcc, g++ 등을사용할수있다. 그외에도대부분의프로그래밍언어에대한컴파일러가제공되거나관련사이트에서확보가가능하다. 제 1 장 _ Linux Overview 13
12) Part of POSIX 1003.1-2001, BSD, SysV 국제적표준인 POSIX 1003.1-2001 및 BSD, SysV 표준에정의된대부분의기능 을제공한다. 13) 다양한실행파일포맷을제공한다. ELF, a.out 포맷등다양한형태의실행파일포맷을제공한다. 14) 국제적키보드와폰트를제공한다. 국제적키보드와폰트를제공하여한글사용에도문제가없다. 다만한글의경우다양한무료폰트 (font) 를지원하지못하고있으나이러한문제는조만간해결될것으로전망된다. 15) 풍부한응용프로그램오늘날, 리눅스는많은공개프로젝트와공동체의기여로서버에서테스크탑및임베디드환경에이르기까지풍부한응용프로그램을갖추게되었다. 아파치웹서버와관련프로그램, Java 관련패키지및프레임워크들, GUI 데스크톱환경및오피스환경을위한프로그램들, 공개소스의데이터베이스및디렉토리서비스, 멀티미디어관련프로그램들등, 수많은시스템및응용프로그램들이활용가능한상태이다. 단오피스도구나멀티미디어등과관련해서아직마이크로소프트관련응용프로그램들의실질적표준화로활용이부진한부분이있는것도사실이다. 16) 다양한배포판리눅스공동체의코어커널을기반으로사용자들이쉽게사용할수있는기능들을추가한다양한배포판이제공된다. 레드햇 (RedHat), 수세 (SuSe), 데비안 (Debian), 슬랙웨어 (Slackware), 우분투 (Ubuntu) 등의배포판이있다. 14 리눅스시스템프로그래밍
17) 오픈소스소프트웨어리눅스운영체제및이와관련된대부분의소프트웨어는오픈소스소프트웨어 (Open Source Software, OSS) 이다. 오픈소스소프트웨어는라이선스요금이무료이면서소스코드를공개한소프트웨어로서누구나자유롭게사용, 활용, 개선하고배포할수있는소프트웨어로일반적으로정의된다. 제 1 장 _ Linux Overview 15
제 2 장 리눅스활용을위한기본지식 본교재의목적은리눅스운영체제에서제공되는기본적커널 API(Application Programmer s Interface) 를활용하는기법을학습하는것이다. 이러한내용을학습하기이전에독자들이숙지하여야할리눅스의기본적활용방법에대해알아본다. 즉, C나 C++ 프로그램을컴파일하고실행하는방법과리눅스와대화하기위한쉘 (shell) 의요약된사용방법, 리눅스의부팅방법등에대해간략히알아본다. 2.1 리눅스의사용자계정 리눅스는전술한바와같이다중사용자를위한운영체제이다. 여러사용자가사용하는시스템은비적절한접근으로부터시스템을보호하여야한다. 따라서사용자는사용자식별자 (username 또는 id) 와접속키 (password) 입력에의한접근허가를받아야한다. 이러한과정을로그인 (login) 절차라한다. 사용자의이름과접속키는 /etc/passwd 파일에수록된다. 접속키의경우는물론암호화되어저장된다. 접속한사용자의 id는사용자가실행시키는여러프로그램 ( 프로세스 ) 들에대해시스템의자원사용때의권한을결정하는요소가된다. 일반사용자이외에시스템의관리를위해시스템자원에모두접근할수있는특수사용자 (super user) 가있는데 16 리눅스시스템프로그래밍
이는 root라는지정된이름으로로그인하게된다. 사용자들은어떤자원에대해같은권한을 ( 파일공유등 ) 갖게하려고그룹에소속될수있다. 따라서사용자는로그인후그룹식별자 (id) 도갖게되는데사용자의그룹 id는 /etc/group 에지정된다. 사용자의식별자나그룹식별자로보호시스템에의해주어지는접근권한의대표적인예는파일에대한접근권한을들수있는데이는파일시스템에서설명한다. 2.2 리눅스의부팅과정 일반적으로운영체제는항상메모리에상주하는핵심부분인커널과필요시에만메모리로로딩되는여러가지형태의모듈, 커널프로세스및기본적응용서비스프로그램들로구성된다. 부팅은운영체제의핵심인커널을메모리로로딩하는과정을말한다. 하드웨어시스템의종류에따라부팅방법은여러가지이다. 그중에서가장많이사용되는 x86 계열 CPU의예를들면그부팅 (booting) 과정은다음과같다. 시스템의전원이켜지면 ROM에저장된 BIOS(Basic Input/Output Service) 프로그램이실행되어시스템의메모리나입출력장치등에대한기본적인테스트와초기화가이루어진다. 그이후 BIOS 는지정된부팅매체 ( 하드디스크, CD, 또는플래시메모리등 ) 의정해진장소 (MASTER 부트레코드로디스크의경우첫번째트랙 / 섹터 ) 에서커널을메모리로적재하는일을하는부스트랩 (bootstrap) 로더 ( 또는부트로더 ) 프로그램을메모리로읽어들인다. 이러한부트로더는대표적인것들로 LILO(Linux Loader), GRUB(GNU GRand Unified Bootloader), RedBoot 등여러가지가있다. 부트로더가실행되면사용자와의대화를통해원하는커널을적재할수있으나일반적으로는 /boot 디렉토리의 vmlinuz 커널이미지파일이로드된다. vmlinuz는리눅스커널의압축이미지이다. 사용자가새로구성한커널이있을때는대화식으로그파일이름을주게된다. 커널이미지가메모리로적재되면다음과같은초기화과정을거쳐시스 제 2 장 _ 리눅스활용을위한기본지식 17
리눅스시스템프로그래밍 초판인쇄 2014 년 2 월 10 일초판발행 2014 년 2 월 20 일 지은이김정국발행인박철발행처한국외국어대학교출판부 130-791 서울특별시동대문구이문로 107 전화 02)2173-2495~7 팩스 02)2173-3363 홈페이지 http://press.hufs.ac.kr 전자우편 press@hufs.ac.kr 출판등록제 6-6 호 (1969. 4. 30) 디자인 편집디자인퍼브 02)2254-4308 인쇄 제본네오프린텍 ( 주 ) 02)718-3111 ISBN 978-89-7464-901-2 13560 정가 15,000 원 * 잘못된책은교환하여드립니다. 불법복사는지적재산을훔치는범죄행위입니다. 저작권법제136조 ( 권리의침해죄 ) 에따라위반자는 5년이하의징역또는 5천만원이하의벌금에처하거나이를병과할수있습니다. 은한국외국어대학교출판부의어학및사회과학도서 Sub Brand 이다. 한국외대의영문명인 HUFS, 현명한국제전문가양성의 (International+Intelligent) 의의미를담고있으며, 휴인 ( 携引 ) 의뜻인 이끌다, 끌고나가다 라는의미처럼출판계를이끄는리더로서, 혁신의이미지를담고있다.