sw 사관학교 정글/TIL & WIL

[2022.05.06 ]TIL - 시스템 콜, 데이터 세그먼트, 메모리 단편화, sbrk/mmap, 가상메모리(VM), 스와핑

donggyu 2022. 5. 12. 01:41
반응형

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

시스템 콜 (시스템 호출, 시스콜)

운영체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스

*커널: 운영체제의 핵심이 되는 컴퓨터 프로그램, 시스템의 모든것을 완전히 통제 → 자원을 효율적으로 관리 (cpu 스케줄링, 메모리관리, 입출력 관리, 파일시스템 관리)

*자원: cpu, 메모리, 가상메모리, 쓰래드, 패킷, 프로토콜, 테스크

  • 보안
  • 자원관리
  • 추상화

운영체제는 커널모드사용자 모드로 나누어 구동(커널에서 중요한 자원들을 관리하기 때문에, 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나눔)

 

커널모드: 모든자원에 접근, 명령을 할 수 있다.

 

사용자모드: 사용자가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드, 코드장성을 하고 프로세스를 실행하는 등의 행동을 할 수 있다, 유저 프로그램 모드가 사용자 모드에서 실행된다

시스템콜은 커널 영역의 기능을 사용자 모드가 사용 가능하게, 프로세스가 하드웨어이 직접 접근해서 필요한 기능을 사용할 수 있게 해줌

 


유저모드에서 실행되고 있는 유저 어플리케이션에서 시스템콜이나 라이브러리 함수를 통해서 I/O 요청

  • 커널 모드로 전환. 커널의 I/O 관리자가 키보드나 모니터의 장치드라이버에 요청
  • 장치드라이버에서 키보드나 모니터에서 받은 return 값을 커널에 return
  • 커널은 해당 값을 user application으로 return
  • 유저모드로 전환.

 

데이터 세그먼트(Data segment)

c언어로 작성한 프로그램은 주기억장치를 효율적으로 운영하기 위해, 일정한 크기(64kb)크기로 논리적 단위를 나누어 할당, 할당해제로 관리. 논리적 단위가 세그먼트

서로 관련이 있는 데이터와 명령어를 하나의 세그먼트로 관린하는것이 아니라 데이터를 저장하는 데이트 세그먼트, 명령어를 저장하는 코드 세그먼트 영역으로 구분

 

 

메모리 단편화(memory fragmentation)

Ram에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만, 할당이(사용)이 불가능한 상태를 보고 메모리 단편화가 발생했다라고 말함

 

단편화의 종류

 

내부 단편화(interal Fragmentation)

  1. 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황

 

 

외부 단편화(External Fragmentation)

  1. 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황

메모리 단편화(파편화) 해결방법

  1. 페이징 기법 - 가상메모리 사용, 외부 단편화 해결, 내부 단편화 존재
    • 가상 메모리를 같은 크기의 블록으로 나눈 것을 페이지(논리),주 기억 장치를 페이지와 같은 크기로 나눈 것을 프레임(물리)라고 함
    • 사용하지 않는 프레임을 페이지에 옮기고, 필요한 메모리 페이지 단위로 프레임에 옮기는(Swap-in) 중기 스케줄링 기법
  2. 세그멘테이션 기법 - 가상메모리 사용, 내부 단편화 해결, 외부 단편화 존재
    • 페이징 기법과 유사하지만 같은 크기로 나누지 않고 서로 다른 크기로 나누고 단위는 세그먼트 라고 한다. 내부 단편화는 해결이 되지만 외부 단편화는 해결되지 않는다.
  3. 메모리 풀 - 가상메모리 사용, 미리 고정된 크기의 메모리를 할당받아 메모리 동적 할당 기능을 가능하게함
    • 실시간 운영 체제들은 Transaction Processing Facility와 같은 메모리 풀을 사용하고 있다.
    • 장점
      • 메모리 풀은 일정한 실행 시간으로 메모리 할당을 할수 있도록한다(단편화 없음)
      • malloc을 사용해서 메모리가 할당된 각각의 오브젝트들은 각각 따로 메모리 해제를 해주어야 하는 반면 풀 내에서 할당된 수 많은 오브젝트들에 대한 메모리 해제는 단 한번의 조작으로 가능
      • 고정된 크기의 블록 메모리 풀들은 각각의 할당된 메모리 블록에 대한 메타정보 및 할당된 블록의 사이즈 같은 설명을 보관할 필요가 없다. 작은 크기의 할당에서는 상당한 공간을 절약할 수 있음
    • 단점
      • 메모리 풀들은 메모리 풀을 사용하는 응용 프로그램에 따라 조정되어야 함
  4. (memory pool ⩬pool allocator)

참고

http://dmitrysoshnikov.com/compilers/writing-a-pool-allocator/

https://ko.wikipedia.org/wiki/메모리_풀

https://blog.naver.com/PostView.naver?blogId=ruvendix&logNo=221333044853&parentCategoryNo=&categoryNo=140&viewDate=&isShowPopularPosts=true&from=search

 


*인터럽트와 트랩 (OS)

 

인터럽트

하드웨어적 흐름변화(H/W 인터럽트), 프로그램 외부(I/O 장치, 디스크 등)에서 발생하며, 발생 시점이 일정하지 않기 때문에 비동기적

  • 기계 검사 인터럽트, 입출력 인터럽트, 전원 이상 인터럽트

트랩

소프트웨어적 흐름변화(S/W 인터럽트 라고도 함), 프로그램 내부에서 일어나는 에러. 발생 시점이 프로그램의 일정 시점이기 때문에 동기적, 고정된 영역에서 일어남

  • 예외(exception): 메모리 참조 오류, 0으로 나누기, overflow, underflow 등의 경우에서 발생하는 인터럽트
  • 시스템 콜(system call): 사용자가 의도적으로 일으킨 인터럽트

sbrk, mmap

동적 메모리 할당기 → malloc은 mmap과 munmap 함수를 사용해 힙 메모리를 할당하거나 반환 또는 sbrk 함수를 사용

sbrk(), brk(): 메모리 할당시 호출 되는 시스템 콜, 데이터 세그멘트 크기를 변경, program break의 위치를 변경

 

*program break

프로세스의 데이터 세그먼트의 끝을 규정

초기화되지않은 데이트 세그먼트 영역 후의 첫부분의 위치

program break를 증가시키는 것은 프로세스에 메모리를 할당하는 효과를 가져옴. program break를 감소시키면 메모리 할당이 해제

 

 

brk(): 시스템에 메모리가 충분할때 데이터 세그먼트의 끝을 brk의 인자인 addr에서 지정한 값으로 설정**(program break 설정)**

 

sbrk(): 프로그램의 데이터 영역(data segment) - 힙 을 increment bytes 만큼 증가시킨다. increment 인자를 0으로 설정하여 sbrk()를 호출하는 것은 현재 program break의 위치를 찾을 때 씀**(program break 증가)**

 

mmap(): 파일 디스크립터가 가리키는 객체를 파일에서 offset 바이트 지점을 기준으로 len 바이트 만큼 메모리에 맵핑하도록 커널에 요청 (커널에 새 가상 메모리 영역을 생성해줄 것을 요청하는 함수)

 

munmap(): 메모리 맵을 사용하고 자원을 해제 할 때 사용, mmap()으로 만들어진 맵핑을 제거하기 위한 시스템 호출

 

 

*파일 디스크립터(File Descripter -FD)

유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값

참조:https://aidencom.tistory.com/208

 

[ Linux System Call ] brk, sbrk

Reference : sploitfun.wordpress.com/2015/02/11/syscalls-used-by-malloc/ Syscalls used by malloc. Having landed on this page, you should know malloc uses syscalls to obtain memory from the OS. As sh..

aidencom.tistory.com

 

.

 

가상메모리

실제 메모리의 크기에 한계가 있기 때문에, 디스크 공간을 메모리처럼 사용할 수 있는, 프로세스는 가상 주소를 사용하고 실제 해당 주소에서 데이터를 읽고 쓸때만 물리적 주소 사용

물리적 주소: 실제 데이터나 프로그램이 저장되는 공간

논리적 주소: 프로그래머가 프로그래밍에 사용하는 공간

주소 바인딩: 논리적 주소를 물리적 주소로 변환하는 과정, 프로그램의 주소를 절대 주소로 바꾸어 메인 메모리에 적재하는것

가상메모리,스왑메모리,스와핑

스와핑과 가상메모리(VMM)의 가장큰 차이점

VMM은 페이징단위로 스와핑을 한다. 스와핑은 프로세스단위로한다

(= VMM에서 페이지 단위로 스와핑이 일어난다)

반응형