시스템 프로그래밍(8)

조권휘·2022년 8월 24일
0

시스템 프로그래밍

목록 보기
8/14

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을 추가하면 사용할 수 있다.
profile
안녕하세요 :) Data/AI 공부 중인 한국외대 컴퓨터공학부 조권휘입니다.

0개의 댓글