기술 정리/리눅스시스템프로그래밍

리눅스 시스템 프로그래밍 - 7장, 8장

투칼론 2016. 4. 1. 09:50
반응형

CHAPTER7 스레딩


7.1 바이너리, 프로세스, 스레딩


스레드는 운영체제의 프로세스 스케줄러에 의해 스케줄링될 수 있는 최소한의 실행 단위를 뜻한다.

최신 운영체제는 가상 메모리와 가상 프로세서라는 두가지 추상 개념을 제공한다.

가상메모리는 스레드가 아니라 프로세스와 관련이 있다. 즉 각 프로세스는 메모리에 대한 하나의 유일한 뷰를 갖지만 한 프로세스 내의 모든 스레드는 메모리를 서로 공유한다. 반면에 가상 프로세서는 스레드와 관련이 있다.


7.2 멀티스레딩


멀티스레딩의 장점

프로그램 추상화 - 작업을 나누고 각각 실행 단위로 할당하는 것

병렬성 - 멀티 프로세서에서 효과적으로 병렬 처리

응답속도 향상 

입출력블록

컨텍스트 스위칭 - 프로세스 단위 보다는 저렴

메모리 절약 - 메모리 공유로 인한 메모리 절약


멀티스레딩 비용 - 가상 메모리가 하나라는 점이 스레드의 존재 이유인 동시에 스레드의 단점이기도 함. 멀티스레드들 사이에 메모리를 공유해야 함. 이에 따른 동기화 전략이 필수 임

멀티스레딩 대안 - 다중입출력, 논블록입출력, 비동기식 입출력 등이 있지만, 이들 또한 단점이 있다. 멀티코어가 점점 유행하면서 스레드 사용 역시 늘고 있다.


7.3 스레딩 모델


  • 커널 레벨 스레딩 - 커널이 제공하는 것과 사용자가 사용하는 것이 1:1의 관계이므로 1:1 스레딩이라고도 함
  • 사용자 레벨 스레딩 - 사용자영역에서 스레드를 구현하고, 스레드가 N개인 프로세스 하나는 단일 커널 프로세스로 맵핑되므로 N:1이라고도 함.

  • 하이브리드 스레딩 - 커널은 네이티브 스레드 개념을 제공하고, 사용자 영역에서도 역시 사용자 스레드를 구현함. N:M 스레딩으로 N개의 사용자 스레드를 M개의 커널 스레드와 맵핑함


  • 코루틴과 파이버 - 리눅스는 빠른 컨텍스트 스위칭 속도로 인해 코루틴이나 파이버에 대한 네이티브 지원이 없는데, Go 언어는 언어수준에서 코루틴과 유사한 고루팀을 제공함 


7.4 스레딩 패턴


연결별 스레드 - 하나의 작업 단위가 스레드 하나에 할당됨

이벤트 드리븐 스레딩 - 모든 입출력은 비동기식으로 처리하고, 다중 입출력을 사용해서 서버 내 제어 흐름을 관리한다. 이 모델에서는 요청을 처리하는 과정이 일련의 비동기식 입출력 요청으로 변환되어 관련된 콜백과 연결된다.


7.5 동시성, 병렬성, 경쟁상태


동시성 - 둘 이상의 스레드가 특정 시간에 함께 실행되는 것을 의미함

병렬성 - 둘 이상의 스레드가 동시에 실행되는 것을 의미함

경쟁상태 - 스레딩에서 겪게되는 가장 큰 수난. 리소스에 대한 스레드들간의 경쟁


7.6 동기화


상호 배제(Mutual Exclusion)하는 방식으로 접근을 동기화 해야 함

뮤텍스(Mutex) - lock(), unlock()을 통해 락관리


데드락이란 두 스레드가 서로 상대방이 끝나기를 기다리고 있어서 결국엔 둘 다 끝나지 못하는 상태를 말한다.



7.7 Pthread


POSIX 스레드를 줄여서 Pthread라고 한다.

스레드 관리 - 스레드 생성, 종료, 조인, 디태치 함수 등

동기화 - 뮤텍스와 조건 변수, 배리어(barrier)를 포함하는 스레드 동기화 함수 등


스레드 함수 - pthread_create(), pthread_self(), pthread_exit(), pthread_cancel(), pthread_setcancelstate(), pthread_join(), pthread_detach()

뮤텍스 함수 - pthread_mutex()_lock(), pthread_mutex_unlock()




CHAPTER 8 파일과 디렉터리 관리


8.1 파일과 메타 데이터


stat() - 파일의 메타 데이터를 얻을 수 있는 함수

chmod(), fchmod() - 파일의 권한값을 변경할 수 있는 함수


8.2 디렉터리


getcwd() - 현재 작업 디렉터리 알아내기

chdir(), fchdir() - 현재 작업 디렉터리 변경하기

mkdir() - 디렉터리 생성하기

rmdir() - 디렉터리 삭제하기

opendir() - 디렉터리 내용 읽기

readdir() - 디렉터리에서 스트림 읽기

closedir() - 스트림 닫기


8.3 링크


링크는 본질적으로 inode를 가리키는 목록에 있는 이름일 뿐이다. 

하드링크와 심볼릭 링크가 있다.

같은 파일 시스템 내에서만 특정 파일에 여러 링크를 걸 수 있다.


하드링크 - link() 시스템콜을 통해 링크를 생성한다.

심볼릭링크 - symlink() 시스템콜을 통해 링크를 생성한다. 소프트링크라고도 한다. 새로운 유형의 파일이고, 다른 파일의 경로를 가지고 있음. 파일시스템이 달라도 사용할 수 있다.


링크끊기 - unlink(), remove()


파일복사 - 유닉스는 파일과 디렉토리를 복사하기 위한 시스템콜이나 라이브러리를 제공하지 않는다. 소스를 열어 읽은 후에 dest 쪽에 write 하는 방식이다. 디렉토리도 유사하다.


파일이동 - 파일 이동을 위한 시스템콜은 제공한다. rename()


디바이스 노드 - 애플리케이션과 디바이스 드라이버를 연결하는 인터페이스를 제공하는 특수한 파일이다. 읽기, 쓰기 등 요청을 디바이스 드라이버에 전달한다. 특수 디바이스 노드로 /dev/null, /dev/zefo, /dev/full, /dev/random(난수발생기) 등이 있음


ioctl() - 입출력 컨트롤을 의미하며 대역외(Out of Band) 통신을 허용한다


파일 이벤트 모니터링 - 파일이 옮겨지거나 읽혀지거나 쓰여지거나 삭제되는 등의 이벤트를 모니터링할 수 있는 inotify라는 인터페이스를 제공한다.

inotify_init(), inotify_add_watch(), inotify_event(), inotify_rm_watch(), close(fd)