리눅스 시스템 프로그래밍 챕터 1
이번에 정리한 책은 리눅스 시스템 프로그래밍 입니다
http://www.yes24.com/24/Goods/15581782?Acode=101
기초부터 고급까지 정말 자세하게 나와있습니다. 꼭 사서 보시길 추천드립니다
ch1. 시스템 프로그래밍을 배워야 하는 이유
- 프로그래밍 트렌드가 바뀐다 해도 시스템프로그래밍은 사라지지 않음
- 시스템프로그래밍의 튜닝이 더 나은 성능을 이끌어 낼 수 있음
시스템 프로그래밍의 주춧돌
1. 시스템 콜
- 운영체제에 리소스나 서비스를 요청하려고 사용자영역에서 커널 내부로 들어가는 함수 호출
- 사용자영역내에서 실행시 커널 내부로 들어가는 것은 보안과 안정성상 불가능하기 때문에 대신 시스템 콜을 실행하려한다는 시그널을 보냄
- 에플리케이션은 실행할 시스템 콜과 매개변수를 보냄
2. C 라이브러리
- 유닉스 애플리케이션의 핵(모든것에 포함) CGN C라이브러리인 glibc.등이 있음.
- 시스템 콜 처리와 래퍼와 스레드 지원, 기본 어플리케이션 기능에 대한 내용이 있음.
3. C 컴파일러
- GNU 컴파일러와 gcc(실행파일)
API와 ABI
서로 다른 컴퓨터 소프트웨어 간에 인터페이스를 정의하고 기술
API
소스코드 레벨에서 서로 인터페이스가 연결되는 방식. 양쪽 모두 지킬 경우에만 동작 (C API)
ABI
특정 아키텍쳐간에 동작하는 바이너리 인터페이스를 정의, 애플리케이션과 라이브리간, 애플리케이션과 애플리케이션, 애플리케이션과 커널과의 상호동작.
콜링컨벤션, 바이트 순서, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 등과 같은 방식 정의
리눅스 아키텍쳐마다 고유의 ABI가 있음
표준
- 리눅스의 표준은 없지만 POSIS와 SUS를 지키려고 노력한다.
- C언어의 표준은 ISO C11
리눅스 프로그래밍의 개념
파일과 파일시스템
리눅스에서는 모든것이 파일.
일반 파일
- 바이트스트림으로 저장된 데이터
- 내부 파일의 위치를 지정해서 수정이 가능함.
- 하나의 파일은 고유한 파일 디스크립터가 있고 여러 프로세스에서 접근 할 수 있다. 커널은 파일에 대한 동시 접근을 막지 않는다.
- 파일명은 파일과 직접적인 연관이 없고 inode라는 고유한 정수값에 참조 된다.
디렉터리와 링크
- 사용자 영역에서는 inode 대신 파일 이름을 사용
- 이름과 inode쌍을 링크로 가지고 있음.
- 디렉터리 자체도 inode가 있음.
- 경로가 a/b/c.png이면 a의 inode를 얻고 b의 inode를 얻고 c의 inode를 얻음.
- dentry 캐시를 활용하여 탐색속도를 높임.
하드링크
다중링크는 동일한 inode에 대한 여러가지 이름을 맵핑. 파일을 삭제할때 모든 inode의 하드링크를 삭제해아하므로 파일시스템 내부에 링크카운터를 두어 링크개수를 추적함.
심볼릭 링크.
하드링크의 경우 inode가 속한 파일시스템 외부에서는 inode 번호가 무의미 하기 때문에 덜 투명한 심볼릭 링크를 제공함. 링크를 연결할 파일의 완전한 경로이름을 포함하는 독자적인 inode와 데이터가 담겨있음
특수 파일
하드웨어 장치에 대한 접근을 읽고 쓰는 방식으로 허용
- 블록 디바이스파일 - 바이트 배열로 접근 (하드 디스크, 플로피 디스크,..)
- 캐릭터 디바이스파일 - 바이트로 구성된 선형 큐
- 네임드 파이프 - FIFO라고 부르며 특수 파일을 읽는 파일 디스크립터 형태로 통신 채널을 제공. 서로 무관한 프로세스도 이 파일에 접근하는 방식으로 통신 가능
- 유닉스 도메인 소켓 - 서로 다른 프로세스끼리 통신 할 수 있는 고급 IPC의 한 종류. 네트워크 프로밍의 근간
파일시스템과 네임스페이스
- 통합된 전역 네임스페이스 제공
- 파일시스템은 파일과 디렉터리를 정형적이고 유효한 계층 구조 안에 모아놓은 것
- 블록 디바이스의 최소 접근 단위는 섹터. 파일시스템의 접근단위는 블록.
- 블록은 일반적으로 섹터보다 크지만 물리매체와는 무관. 512바이트, 1024바이트, 4096바이트
- 네임스페이스는 하나만 존재.
프로세스
- 활성화 상태로 실행중인 프로그램
- 일반적인 실행파일 포맷은 ELF
- 여러 섹션으로 구성되는데 테스트섹션, 데이터섹션, bss섹션이 공통됨.
- 테스트섹션은 실행가능한 변수나 상수.
- 데이터섹션은 값을 할당한 c 변수와 같은 초기화 자료.
- bss섹션은 초기화되지 않은 전역 데이터
- 프로세스는 가상화를 위한 추상 개념.
- 스케쥴링을 통해 여러프로세스가 시스템에 공존하도록 만듬.
스레드
- 프로세스 내부에서 실행하는 활동 단위, 코드를 실행하고 프로세스 동작 상태를 유지하는 추상 개념.
- 프로세스는 대부분 싱글 스레드.
- 스택, 프로세서 상태, 오브젝트 코드의 현재위치를 포함.
프로세스의 계층구조
각 프로세스는 pid라는 고유한 양수 값으로 구분. 프로세스 트리라는 엄격한 계층 구조를 형성 init프로그램이 첫번째 프로세스 루트 프로세스는 fork()라는 시스템 콜로 만들어짐. 프로세스가 고아가되면 init에 입양시킴 자식 프로세스가 종료되면 부모프로세스가 기다리는지를 보고 완전히 종료시킴.
사용자와 그룹
uid는 사용자를 나타내는 개념 uid 0 (root)는 특별한 관한.
모든 사용자는 하나이상의 그룹에 속해있음 (/etc/passwd, etc/group)
권한
400 - 소유자읽기 200 - 소유자 쓰기 100 - 소유자 실행 040 - 그룹읽기 020 - 그룹 쓰기 010 - 그룹 실행 004 - 그 외 사용자 읽기 002 - 그 외 사용자 쓰기 001 - 그 외 사용자 시행
시그널
리눅스에 특정한 사건이 발생했음을 알려줌 ( 약 30개정도의 시그널이 있음) 프로세스를 종료하고 멈추게하는 등등의 시그널이 있음.
에러처리
시스템 프로그래밍에서 에러는 함수 리턴 값으로 확인이 가능하며 errno라는 특수한 변수로 구체적인 이유를 알 수 있음. 직접 읽고 쓸 수 있으며 변경 가능한 변수.