Process Address Space

- Text : code에 해당하는 부분으로, 일반적으로 ROM에 저장되며 Read-only constant
- Data : Global initialized data + Global uninitialized data(BSS = Block Started by Symbol)
- Heap : Dynamic memory 할당 영역
- Stack : Function, 함수 호출 시 frame(stack pointer)을 할당한다.
Memory Mapped File

- memory의 영역을 file에 mapping한다.
- memory에 Auto-saving한다.
- memory 영역에 접근할 때 file에 접근하는 것과 동일하게 하면 되고, memory r/w = file r/w이다.
- file과 memory 동장이 일원화 되어있어 불필요한 동작을 줄인다.
- 변수가 file에 작성해도 자동적으로 disk에 저장되어 kernel buffer copy를 사용하지 않아도 된다.
- 서로 다른 두 process / thread의 정보 전달 때 개선된 방법이다.
#include <sys/types.h>
#include <sys/mman.h>
caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset);

- addr : file에 mapping할 memory영역의 시작 주소
- 보통 0으로 설정(특정 주소 지정X)
- 만일 특정 주소에 mapping하고 싶으면 starting addr
- 일반적으로 OS가 확인하고 적당 위치에 연결한 뒤 해당 addr을 return
- len : mapping 공간의 size
- prot : 해당 mapping 영역에 부과할 permission
- flag : mapping scheme, 일반 적으로 MAP_SHARED를 많이 사용
- MAP_PRIVATE : 원본 file은 적용하지 않고, copy본에 작성. 즉, original에는 저장되지 않는다.
- MAP_FIXED : 자기가 원하는 주소로 꼭 설정해야 할 때 사용한다.
- MAP_NORESERVE : swap space를 사용하지 않는다. 그렇기 때문에 여기의 memory에 있는 data는 항상 memory에 대기해야한다.
- fd : open한 file descriptor
- offset : file에서 mapping을 시작할 위치
- return : 성공 시 mapping된 영역의 시작 주소 / 실패 시 MAP_FAILED
#include <sys/types.h>
#include <sys/mman.h>
int munmap(caddr_t addr, size_t len);
- 설정했던 mmap을 해제한다.
- file과의 connection도 끊긴다.
- addr : mapping을 취소할 memory의 시작 주소
- len : mapping을 했던 공간의 size
- return : 성공 시 0 / 실패 시 -1
MM Area Disk Synchronization
#include <sys/mman.h>
#include <unistd.h>
int msync(const void *addr, size_t len, int flags);
- mmap에 write를 하면 page cache에 잠시 write가 되는데, 이 때 disk로 즉시 보내야하는 상황이 있을 때 사용한다.
- fflush(), sync()와 유사하다.
- addr : 시작 주소
- len : 길이
- flags : operation
- MS_ASYNC : sync 후 바로 돌아온다. 실행 시킨 뒤 바로 돌아오기 때문에 확인을 하지 않고 오므로, 긴박한 일이 있을 때 돌아왔다가 나중에 확인한다.
- MS_SYNC : 다 쓰였는지 확인하고 돌아온다.
- MS_INVALIDATE : file에 있는 mmap을 다 초기화한다.
- return : 성공 시 0 / 실패 시 -1
Nonblocking I/O
Blocking I/O
- I/O가 끝날 때까지 계속 대기한다.
- 끝나지 않고 계속 기다릴 수도 있다는 문제점이 생긴다.
- getchar()같은 경우 key가 입력될 때까지 계속 기다릴 수도 있다.
Nonblocking I/O
- I/O 요청을 한 뒤 대기하지 않고 바로 돌아온다.
- 만일 정상적으로 작동하지 않았다면 바로 error로 돌아온다.
open("a.out", O_RDONLY| O_NONBLOCK);
- file open 시 또는 fcntl()을 사용할 때 flag에 O_NONBLOCK을 추가하면 사용할 수 있다.