728x90
운영체제
14. 페이징 개요
- 공간을 동일 크기의 조각으로 분할하는 것을 페이징(Paging)이라 부른다. 프로세스의 주소 공간을 몇 개의 가변 크기의 논리 세그멘트로 나누는 것이 아니라 고정 크기의 단위로 나눈다. 이 각각의 고정 크기 단위를 페이지(Page)라고 부른다. 상응하여 물리 메모리도 페이지 프레임(Page Frame) 이라고 불리는 고정 크기의 슬롯의 배열이라고 생각한다. 이 프레임 각각은 하나의 가상 메모리 페이지를 저장할 수 있다.
14.1 간단한 예제 및 개요
- 물리 메모리는 고정 크기의 슬롯들로 구성된다. 가상 주소 공간의 페이지들은 물리 메모리 전체에 분산 배치되어 있다.
- 페이징의 장점은 유연성이다. 페이징을 사용하면 프로세스의 주소공간 사용 방식과는 상관없이 효율적으로 주소공간 개념을 지원 할 수 있다.
- 또 다른 장점은 페이징이 제공하는 빈 공간 관리의 단순함이다. 주소 공간의 각 가상 페이지에 대한 물리 메모리 위치 기록을 위하여 운영체제는 프로세스마다 페이지 테이블(Page table)이라는 자료구조를 유지한다. 페이지 테이블의 주요 역할은 주소 공간의 가상 페이지 주소 변환(address translation) 정보를 저장하는 것이다. 각 페이지가 저장된 물리 메모리의 위치가 어디인지 알려준다.
- 페이지 테이블은 프로세스마다 존재한다는 사실을 숙지해야 한다.
- 프로세스가 생성한 가상 주소의 변환을 위해 먼저 가상 주소를 가상 페이지 번호(VPN : virtual page number)와 페이지 내의 오프셋 2개의 구성 요소로 분할한다.
- 프로세스가 가상주소를 생성하면 운영체제와 하드웨어가 의미있는 물리주소로 변환한다. 가상 페이지의 번호를 가지고 페이지 테이블의 인덱스로 사용하여 가상페이지가 어느 물리 프레임에 저장되어 있는지 찾을 수 있다.
- 오프셋은 동일하다.
14.2 페이지 테이블은 어디에 저장되는가.
- 페이지 테이블은 가상주소를 물리 주소로 매핑하는데 사용되는 자료구조이다. 가장 간단한 형태는 선형 페이지 테이블(linear page table)이다. 단순한 배열이다. 운영체제는 원하는 물리 프레임 번호(PFN)를 찾기 위해 가상 페이지 번호(VPN)로 배열의 항목에 접근하고 그 항목의 페이지 테이블 항목(PTE)을 검색한다.
- 각 PTE에는 심도있는 이해가 필요한 비트들이 존재한다. Valid bit는 특정 변환의 유효 여부를 나타내기 위하여 포함된다. 프로그램이 실행을 시작할 때 코드와 힙이 주소공간의 한쪽에 있고 반대쪽은 스택이 차지하고 있을 것이다. 그 사이의 모든 미사용 공간은 무효로 표시되고, 프로세스가 그런 메모리를 접근하려고 하면 운영체제는 트랩을 발생시킨다. 운영체제는 그 프로세스를 종료 시킬 확률이 높다. Valid bit는 할당되지 않은 주소공간을 표현하기 위해 반드시 필요하다. 주소공간의 미사용페이지를 모두 표시함으로써 이러한 페이지들에게 물리 프레임을 할당할 필요를 없애 메모리를 절약한다.
- 페이지가 읽을 수 있는지, 쓸 수 있는지, 또는 실행될 수 있는지를 표시하는 Protection bit가 있다.
- Protection bit가 허용하지 않는 방식으로 페이지에 접근하려고 하면 운영체제에 트랩을 생성한다.
- Present bit는 이 페이지가 물리 메모리에 있는지 혹은 디스크에 있는지(즉, 스왑 아웃 되었는지) 가리킨다. 스와핑은 운영체제가 드물게 사용되는 페이지를 디스크로 이동시켜 물리 메모리를 비울 수 있게 한다. dirty bit 또한 일반적인데, 메모리에 반입된 후 페이지가 변경되었는지 여부를 나타낸다.
- reference bit(또는 accessed bit)는 때때로 페이지가 접근 되었는지를 추적하기 위해 사용된다. 또한 어떤 페이지가 인기가 있는지 결정하여 메모리에 유지되어야 하는 페이지를 결정하는 데에도 유용하다. 이 정보는 페이지 교체에 매우 중요하다.
14.4 페이징 : 너무 느림
- 페이지 테이블로 인해 처리속도가 저하될 수 있다.
- 주소에서 데이터를 반입하기 전에 시스템은 프로세스의 페이지 테이블에서 적절한 페이지 테이블 항목을 가져와야 하고, 반환을 수행한 후, 물리 메모리에서 데이터를 탑재한다. 이렇게 하기 위해서 하드웨어는 현재 실행 중인 프로세스의 페이지 테이블의 위치를 알아야 한다.
- 모든 메모리 참조에 대해 먼저 페이지 테이블에서 변환정보를 반입해야 하기 때문에 반드시 한번의 추가적인 메모리 참조가 필요하다.
14.5 메모리 트레이스
- 프로그램의 메모리 참조를 살펴보자. 프로그램이 실행되면, 명령어 반입시에 메모리가 두 번 참조된다. 명령어 위치 파악을 위한 페이지 접근 그리고 명령어 자체에 한 번 추가적으로 mov 명령어는 메모리 참조를 한 번 한다. 이 명령도 먼저 페이지 테이블 접근 한 번, 다음 배열 자체를 접근하기 위해 한 번의 참조가 필요하다.
KEYWORD
File Dsecriptor(FD)
- 정의
- 운영체제가 파일, 소켓, 파이프등의 입출력 리소스를 관리하기 위해 생성해 내는 비음수의 값이다.
- 프로세스가 각 리소스에 접근하려고 할 때 리소스에 대한 인덱스로 사용된다. 덕분에 프로세스는 리소스의 실제 물리적 위치를 몰라도, 인덱스를 통해 접근이 가능하다.
- 프로세스의 FD 활용
- 리소스 열기
- 프로세스가 System Call을 사용해 리소스를 열면 운영체제는 해당 리소스에 대한 핸들을 생성하고, 이를 가리키는 파일 디스크립터를 프로세스에게 반환한다.
- 리소스 조작
- 프로세스가 read,write, send, recv 등의 system call로 리소스를 조작할 때, fd값을 인자로 운영체제에게 제공해야 한다.
- 운영체제는 이 fd를 통해서 해당 프로세스의 fd table에서 리소스를 찾아 요청된 리소스 조작을 수행한다.
- 리소스 닫기
- 프로세스가 close system call로 리소스를 닫아 달라 요청할 때, fd 값을 인자로 운영체제에 제공해야 한다.
- 운영체제는 fd table에서 해당 엔트리를 제거하고, 리소스를 해제한다.
- 리소스 열기
File Descriptor table
- 정의
- 운영체제의 커널 내부에 각 프로세스 별로 fd table이 생성된다.
- 각 프로세스가 열어놓고 있는 모든 파일, 리소스에 대한 fd를 인덱스로 하는 배열이다.
- 각 entry의 구성
- 인덱스
- 리소스별 file descriptor
- 리소스 타입
- 파일, 소켓, 파이프 중 어떤 것인지 표시
- 리소스 상태 정보
- 읽기/쓰기 가능 여부
- 블록킹/논블록킹 모드
- 열린 파일의 현재 위치
- 리소스에 대한 참조
- 실제 리소스에 대한 포인터
- 인덱스
Defalut File Descriptor
- 정의
- 프로세스가 시작될 때 자동으로 할당되는 기본 fd값
- 프로세스가 실행되고 있는 동안 항상 열려있는 것으로 표시된다.
- 다른 파일이나 리소스는 이 default fd 인덱스 이후 숫자부터 할당된다.
- 이렇게 입출력기가 file descriptor로 관리되는 이유는 OS에서 입출력기도 파일로 익식하여 관리하기 때문이다.
- 종류
- 0 : 표준 입력(stdin)
- 1 : 표준 출력(stdout)
- 2 : 표준 에러(stderr)
캐시(Cache)
Cache Memory
- 캐시 메모리는 속도가 빠른 장치와 느린 장치 간의 속도차에 따른 병목 현상을 줄이기 위한 범용 메모리다.
- 메인 메모리에서 자주 사용하는 프로그램과 데이터를 저장해두어 속도를 빠르게한다.
- 캐시의 지역성(Locality)를 이용한다.
Cache Locality
- 캐시의 지역성이란, 데이터에 대한 접근이 시간적 혹은 공간적으로 가깝게 발생하는 것을 말한다. 캐시의 적중률(Hit rate)을 극대화 하여 캐시가 효율적으로 동작하기 위해 사용되는 성질이다.
- 캐시의 지역성은 공간 지역성(Spatial Locality)과 시간 지역성(Temporal Locality)으로 나뉜다.
- 공간 지역성 : 최근에 사용했던 데이터와 인접한 데이터가 참조될 가능성이 높다는 특성
- 시간 지역성 : 최근에 사용했던 데이터가 재참조될 가능성이 높은 특성
- 공간 지역성은 배열을 예로 들 수 있고, 시간 지역성은 for,while 같은 반복문을 예로 들 수 있다.
Caching Line
- 캐시 메모리는 메인 메모리에 비해 크기가 매우 작기 때문에 메인 메모리와 1:1 매칭이 불가능하다. 그래서 캐시에 데이터를 저장할 때 특정 자료구조를 사용하여 묶음으로 저장하는데, 이를 캐싱 라인이라고 한다. 빈번하게 사용되는 데이터의 주소들이 흩어져 있기 때문에 캐시에 저장하는 데이터에는 데이터의 주소 등을 기록해둔 태그를 달아둘 필요가 있다. 이러한 태그들의 묶음을 의미한다.
- 캐싱 라인은 다음과 같은 매핑 방법을 사용한다.
- Direct Mapping
- 직접 매핑으로, 메인 메모리를 일정한 크기의 블록으로 나누어 각각의 블록을 캐시의 정해진 위치에 매핑하는 방식이다.
- 가장 간단하고 구현이 쉽다.
- 적중률(Hit rate)이 낮아질 수 있다.
- 동일한 캐시 메모리에 할당된 여러 데이터를 사용할 때 충돌이 발생하게 되는 단점이 있다.
- 직접 매핑으로, 메인 메모리를 일정한 크기의 블록으로 나누어 각각의 블록을 캐시의 정해진 위치에 매핑하는 방식이다.
- Full Associative Mapping
- 캐시 메모리의 빈 공간에 마음대로 주소를 저장하는 방식이다.
- 저장하는 것은 매우 간단하지만, 원하는 데이터가 있는지 찾기 위해서는 모든 태그를 병렬적으로 검사해야 하기 때문에 복잡하고 비용이 높다는 단점이 있다.
- 캐시 메모리의 빈 공간에 마음대로 주소를 저장하는 방식이다.
- Set Associative Mapping
- Direct Mapping과 Full Associative Mapping의 장점을 결합한 방식이다.
- 빈 공간에 마음대로 주소를 저장하되, 미리 정해둔 특정 행에만 저장하는 방식이다. Direct에 비해 검색 속도는 느리지만 저장이 빠르고 Full에 비해 저장이 느리지만 검색이 빠르다.
- Direct Mapping과 Full Associative Mapping의 장점을 결합한 방식이다.
- Direct Mapping
Cache Hit/Miss
- Cache Hit
- CPU가 참조하려는 데이터를 캐시에서 찾는 것을 의미한다.
- 해당 데이터를 바로 사용한다.
- Cache Miss
- CPU가 참조하려는 데이터가 캐시에 없으면 발생한다.
- 메모리로 가서 데이터를 찾는다.
- 종류
- Compulsory Miss
- 특정 데이터에 처음 접근할 때 발생한다.
- Capacity Miss
- 캐시 메모리의 공간이 부족해서 발생한다.
- Conflict Miss
- 캐시 메모리에 A와 B를 저장해야 하는데, A와 B가 같은 캐시 메모리 주소에 할당되어 있어 발생하는 Cache Miss다. Direct Mapped Cache에서 많이 발생한다.
- Compulsory Miss
- Cache Rate
- 캐시 히트가 되는 비율이다. 일반적인 컴퓨터는 약 90%이다.
- 캐시 적중률이 높을수록 성능이 좋아진다.
Write Through/Write Back
- Write through
- Write를 할 때, 캐시 메모리와 메인 메모리 모두에 업데이트를 하는 방식이다.
- 버퍼를 통해 캐시 메모리가 메인 메모리에 업데이트한다.
- CPU가 대기하는 시간을 줄일 수 있다.
- 데이터 로스가 발생하면 안되는 상황에서는 Write Through를 사용하는 것이 좋다.
- 장점
- 캐시와 메모리에 업데이트를 같이 하여, 데이터 일관성을 유지할 수 있어서 안정적이다.
- 단점
- 메모리의 빈번한 데이터 전송으로 인해 속도가 느려진다.
- Write Back
- 캐시에 새로운 데이터 블록으로 교체되는 때에 메모리에 반영하는 방식이다.
- 장점
- Write Through보다 훨씬 빠르다.
- 단점
- 속도가 빠르지만 캐시에 업데이트 하고 메모리에는 바로 업데이트를 하지 않기 때문에, 캐시와 메모리가 서로 값이 다른 경우가 발생할 때가 있다.
- 빠른 서비스를 요구하는 상황에서는 Write Back을 사용하는 것이 좋다.
L1/L2 Cache
- L1 Cache
- 명령어와 데이터를 구분한다.
- CPU(레지스터)와 직접적으로 연결된다.
- L2 Cache
- 명령어 데이터 구분없이 모든 자료를 가져온다.
- 메모리와 연결된다.
Rax Register
- 운영체제와 하드웨어 아키텍처 관점에서 중요한 역할을하는 레지스터 중 하나이다.
기본 개념
- 정의 및 특성
- x86-64 아키텍처에서 사용되는 범용 레지스터이다.
- 64비트 시스템에서는 rax라는 이름을 가지며, 32비트에서는 eax, 16비트에서는 ax로 알려져있다.
- 역할
- 함수의 반환
- 함수 호출의 결과값을 저장하는데 주로 사용된다. 즉, 함수가 값을 반환할 때 rax에 그 값이 저장된다.
- 산술 연산
- 산술 연산 및 다른 명령어의 결과값을 저장하는 데에도 사용된다.
- 호환성
- 이전 16비트 및 32비트 시스템과 호환성을 위해, rax는 부분적으로 ax및 eax로 사용될 수 있다.
- 함수의 반환
운영체제에서의 rax 레지스터 사용
- 시스템 호출
- 시스템 호출을 수행할 때, rax는 호출되는 시스템 호출의 번호를 저장하는 데 사용된다.
- 시스템 호출이 완료된 후, rax는 반환값을 담는 데 사용된다.
- 프로그램 예외 처리
- 프로그램이 예외 상황을 만났을 때, rax는 예외처리 루틴에서 중요한 정보를 담는데 사용될 수 있다.
- 최적화
- 컴파일러는 rax를 자주 사용되는 값의 저장 및 연산에 사용하여 성능을 최적화한다.
rax 레지스터의 중요성
- rax는 프로그램의 실행과 운영체제의 시스템 호출에서 핵심적인 역할을 한다.
- 하드웨어 아키텍처와 운영체제 사이의 인터페이스를 이해하는데 중요한 역할을 하며, 효율적인 프로그램 설계와 최적화에 기여한다.
32 bit OS vs 64 bit OS
32bit / 64 bit OS의 차이
- 컴퓨터의 워드 사이즈(Word size)
- word는 컴퓨터의 데이터 기본 처리 단위다.
- 32비트, 64비트는 워드 사이즈를 의미한다. 32비트 머신(CPU)라면 그 머신의 기본 데이터 처리 단위는 32비트가 되고, 64비트 머신이면 그 머신의 기본 데이터 처리 단위는 64비트가 된다.
- 가능한 CPU와 운영체제 조합
- 32비트 65비트가 CPU에도 운영체제에도 있다.
- CPU는 하드웨어, 운영체제는 소프트웨어
- 32비트 시스템과 64비트 시스템의 차이
- 메모리 주소 공간 크기의 차이
- 기본처리 단위가 다르다보니 프로세서의 레지스터의 크기에서 부터 차이가난다.
- 32비트 프로세서의 범용 레지스터는 32비트, 4바이트이다.
- 64비트 프로세서의 범용 레지스터는 65비트, 8바이트이다.
- 프로그램 카운터(PC : Program Counter) 크기도 각각 4바이트, 8바이트이다.
- 메모리의 주소 모드는 기본적으로 바이트당 주소를 하나 할당하는 방식이므로, 32비트 머신은 최대 32bit 메모리 어드레싱이 가능하다. 4GB에 해당하게 되는데, 따라서 32비트 머신은 최대 4GB의 메모리 밖에 사용할 수 없다.
- 메모리 주소 공간 크기의 차이
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.03.13 운영체제 (1) | 2024.03.14 |
---|---|
24.03.12 운영체제, CS, PintOS (3) | 2024.03.12 |
24.03.10 운영체제, PintOS 정리 (0) | 2024.03.10 |
24.03.09 운영체제, PintOS (0) | 2024.03.09 |
24.03.08 운영체제, PintOS 진행정도 (0) | 2024.03.09 |