시스템 프로그래밍 정리
CH02 파일처리
저수준 파일 처리 |
pread, pwrite를 통해 원자적 실행을 보장 (쓰레드 실행중 섞이지 않는다.) 비직관적인 함수 형태 유닉스 및 호환 계열에서만 사용 가능 |
고수준 파일 처리 |
직관적이고 사용이 편리한 함수 형태 C언어를 지원하는 모든 플랫폼에서 사용 가능 라이브러리 레벨의 버퍼링이 있음 |
파일 출력이 섞이지 않게 하려면
è 저수준의 파일처리, 락(LOCK) 기능 이용(성능을 해칠 가능성 있음), 직렬화 이용
저수준 파일에서 형식화 이용 snprintf(버퍼에 형식화 값을 넣고 write로 써야함)
대신 dprintf 이용해 한번에 형식화 된값을 파일기술자에 write한다.
(*출력만 가능)
CH02 파일처리
프로세스의 메모리
텍스트(.text)
일반적으로 프로그램의 실행코드가 존재하는 영역
데이터
.rodata : 읽기전용으로 초기화되는 영역
.data : 읽기/쓰기가 가능한 영역으로 초기화되는 영역
BSS(Block Started by Symbol) : 초기화되지 않는 영역
스택(stack)
로컬 자동변수, 즉 임의로 메모리를 잡지 않아도 함수의 시작에서 자동으로 생성되고
파기되는 변수
힙(heap)
malloc, calloc 같은 메모리 할당 함수를 사용하여 얻는 공간으로 프로세스 어디서든 접근 가능. 메모리 반환을 프로그래머가 해야함
int num; |
bss |
int num=1; |
data |
char str[] = “hello” |
data(R/W) |
char *p_str = “hello” |
hello는 .rodata, p_str 포인터 변수는 data |
const char str[] = “hello” |
hello는 .rodata, str 변수는 rodata |
static int i_val; |
bss |
l 스택의 한계 수치를 넘어가면 segmentation (violation) 오류가 발생한다
ð 10Mb를 넘어갈 때 è 로컬 변수를 크게 쓰는 경우가 없다.
*스레드의 경우 따로 heap공간에 별도의 가상 스택을 만들기 때문에 연관이 없다.
-메모리락
메모리 페이지에 대해 페이징(디스크 일부와 swap)을 금지
è 메모리 공간을 항상 램에만 있도록 강제하는 것
int mlock(const void *addr, size_t len); : 특정 위치의 메모리 페이지를 잠근다.
int mlockall(int flags) : 현재 프로세스의 모든 페이지를 잠근다.
*flags 인수
MCL_CURRENT : 현재 프로세스에 할당된 페이지 전체에 대해 메모리 락
MCL_FUTURE : 앞으로 할당되는 페이지에 대해 메모리 락
munlock : 특정 위치의 메모리 페이지 잠금을 해제
munlockall(void) : 모든 페이지 잠금을 해제
*지역성의 원리
MMAP (memory mapped I/O)
장치나 파일을 메모리와 대응시키는 기법
-사용법-
파일을 열고 파일기술자를 mmap에 넘기는 방식을 사용
à read, write가 필요없이 포인터 변수를 이용하여 접근
mmap의 권한 : r, w, x
mmap의 공유방식 : shared memory, private memory
장점 : 블록 장치에 접근할 때 시스템 콜을 거치지 않기 때문에 가벼움
lseek를 쓰지 않고도 메모리의 특정 주소 번지로 이동하여 원하는 오프셋에서 읽고 쓸 수 있음
*메모리 대응전 대상 파일이 메모리의 크기보다 커야만 한다.
mmap : 메모리를 파일(장치)에 대응시킨다.
munmap : mmap을 해제
msync : 메모리와 파일을 동기화
mprotect : mmap 접근 권한을 변경
mremap : mmap을 재조정한다.
'IT 코딩' 카테고리의 다른 글
자료형 (0) | 2020.11.19 |
---|---|
암호 분석의 종류 (0) | 2020.11.18 |
리눅스 정리 (0) | 2020.11.16 |
객체지향, 상속, 생성자 (0) | 2020.11.15 |
코딩 함수 fork, exec 계열, 상속되지 않는 파일기술자, system, posix_spawn (0) | 2020.11.14 |
댓글