Direct3D는 응용 프로그램에서 GPU를 제어하고 프로그래밍 하는데 쓰이는 저수준 그래픽 API이다.

 

Direct3D12는 Direct3D11보다 훨씬 낮은 수준의 API가 되었다.

다중 스레드 지원을 개선하기 위해 이전보다 추상화가 줄었고, 개발자가 손수 관리해야할 사항들이 늘어났다.

4.1.2 COM 객체 (Component Object Model)

COM 객체 전용 스마트포인터 ComPtr 클래스를 사용하여 관리

 

COM 인터페이스를 가리키는 포인터는 new 키워드로 직접 생성하지 않고 보통 특별한 함수를 호출해서 얻는다. (Comptr와 desc 구조체를 넘겨 COM 객체를 초기화한다)

 

COM 인터페이스를 다 사용하고 난 후에는 delete로 삭제하는 것이 아니라 그 인터페이스의 Release 메서드를 호출한다.

Release 메서드는 Shared_ptr처럼 COM 객체의 참조 횟수가 0이 될 때 호출되어 메모리에서 해제시킨다.

ComPtr은 범위 밖을 벗어나면 자동으로 COM에 대해 Release 함수를 호출하므로 사용자가 Release를 호출할 필요가 없다.

 

ComPtr<[Com 인터페이스]> [변수이름] 

ComPtr 클래스의 함수

1. Get : ComPtr이 가리키는 Com 인터페이스를 반환

2. GetAddressOf : Comptr이 가리키는 Com 인터페이스의 주소를 반환

3. Reset : ComPtr 인스턴스를 nullptr로 설정하고 Com 인터페이스의 참조 횟수를 1 감소

 

COM 인터페이스들은 대문자 I로 시작한다.

 

4.1.3 텍스처 형식

1. RGBA 색상 원소를 담을 수 있다.

DXGI_FORMAT_R8G8B8A8_UINT

2. 부동 소수점 원소를 담을 수 있다.

DXGI_FORMAT_R32G32B32_FLOAT

3. 무형식 텍스쳐 형식

DXGI_R16G16B16A16_TYPELESS

 

4.1.4 교환 사슬과 페이지 전환

전면 버퍼와 후면 버퍼는 하나의 교환 사슬을 형성한다.

교환 사슬을 대표하는 인터페이스는 IDXGISwapChain이다. 이 인터페이스는 전면 버퍼 텍스처와 후면 버퍼 텍스처를 담는다. 화면에 현재 프레임에 전면 버퍼가 표시될 동안 후면 버퍼에 다음 프레임을 렌더링하고 다음 프레임에 버퍼를 교환하는 방법

이중 버퍼링 : 전면과 후면으로 버퍼를 두개 사용하는 방법

 

4.1.5 깊이 버퍼링

전면 후면 버퍼와 동일한 해상도를 가지는 버퍼

깊이 값은 [0, 1] 사이 값을 가짐

 

깊이 버퍼링을 위한 텍스처 형식

1. DXGI_FORMAT_D32_FLOAT_S8X24_UINT

ㄴ 32비트 부동소수점 깊이, 8비트 스텐실[0, 255], 24 패딩

2. DXGI_FORMAT_D32_FLOAT

ㄴ 32비트 부동소수점 깊이

3. DXGI_FORMAT_D24_UNORM_S8_UINT

ㄴ 24비트 부호없는 깊이[0, 1], 8비트 스텐실[0, 255]

4. DXGI_FORMAT_D16_UNORM

ㄴ 16비트 부호없는 깊이[0, 1]

 

4.1.6 자원과 서술자

자원 : 버퍼, 텍스처

 

렌더링 파이프라인에서 그리기 호출마다 해당 그리기 호출이 참조할 자원을 묶어줘야 한다.

자원을 묶는 대신에 자원을 설명하는 서술자를 파이프라인에 묶는다.

 

같은 자원을 렌더링 파이프라인의 서로 다른 단계에서 사용할 수 있기 때문에 이런 방식을 쓴다.

 

같은 자원이더라도 여러 방법으로 사용될 수 있다.

렌더 대상

깊이 스텐실 버퍼

셰이더 자원

 

무형식으로 생성된 자원은 해당 자원의 서술자 만들때 형식을 명시할 수 있다.

형식이 완전히 지정된 자원은 런타임에서 자원 접근을 최적화할 수 있게 되기 때문에, 필요한 경우에만 무형식으로 자원을 만들어야 한다.

 

서술자는 자원 자료를 지정하는 수단일 뿐만 아니라, 자원을 GPU에 서술하는 수단이기도 하다.

서술자의 종류

1. CRV/SRV/UAV 서술자 : 상수버퍼 / 셰이더 자원 / 순서 없는 접근

2. 표본추출기 서술자 : sampler 자원을 서술

3. RTV 서술자 : 렌더 대상 자원을 서술

4. DSV : 깊이스텐싈 자원을 서술

 

서술자는 프로그램 초기화 시점에서 형식 점검과 유효성 검증이 일어나기 때문에 초기화 시점에 서술자를 생성해야 한다.

 

서술자 힙

ㄴ 서술자들의 배열

서술자의 종류마다 서술자 힙이 필요하다.

4.1.7 다중표본화

초과 표본화 : 화면 해상도보다 4배 큰 후면 버퍼에 렌더링 후 4픽셀의 평균 색상을 최종 색상으로 사용

 

다중 표본화 : 4X 다중표본화(픽셀당 부분픽셀 4개)의 경우 화면 해상도보다 4배 큰 후면버퍼에 렌더링

픽셀당 색상을 한번 계산

그 픽셀이 보이는 부분픽셀에 복제됨(부분픽셀 마다 깊이 스텐실 판정)

4개의 부분픽셀의 색상을 평균낸 것이 결과 픽셀이 됨

4.1.8 Direct3D의 다중표본화

DXGI_SAMPLE_DESC라는 구조체 인스턴스를 채워야 한다.

Count : 픽셀당 추출할 부분픽셀의 개수

Quality : 품질 수준 (하드웨어마다 다름)

 

Direct3D 12 장치는 4X 다중표본화를 지원한다.

 

4.1.9 기능 수준

기능 수준 12를 지원하는 GPU는 반드시 Direct3D 12의 기능 집합 전체를 지원해야 한다.

4.1.10 DXGI

DXGI API가 제공하는 것들

1. 교환사슬

2. 전체화면 모드 전환

3. 디스플레이 어댑터, 모니터, 지원되는 디스플레이 모드 같은 그래픽 시스템 정보의 열거

 

IDXGIFactory 인터페이스

ㄴ IDXGISwapChain 인터페이스 생성

ㄴ 디스플레이 어댑터 열거

어댑터 하나에는 모니터가 여러개 연결될 수 있다. (IDXGIOuput)

모니터 하나에는 여러개의 디스플레이 모드가 있다. (DXGI_MODE_DESC)

ㄴ 해상도 (너비 높이)

ㄴ 디스플레이 형식

4.1.11 기능 지원 점검

CheckFeatureSupport 메서드로 점검 할 수 있는 기능

ㄴ 기능 수준

ㄴ 주어진 텍스처 형식에 대한 기능들 ( 해당 형식을 렌더 대상으로 사용할 수 있는가, 혼합을 적용할 수 있는가)

ㄴ 다중표본화 기능

4.1.12 상주성

자원을 생성하면 자원이 GPU 메모리에 입주하며, 파괴되면 메모리에서 나간다.

함수로 직접 제어할 수도 있다.

ID3D12Pageable 배열을 매개변수로 사용한다.

MakeResident (올리기)

Evict (내리기)

 

4.2 CPU와 GPU의 상호작용

1. mCommandList에 set command, draw command같은 명령들을 추가한다. 

2. mCommandList->close()로 명령들의 기록이 끝났음을 알린다.

3. mCommandQueue->ExecuteCommandLists를 수행하여 GPU 명령대기열에 명령 목록을 제출하면

명령 대기열은 명령 목록에 담긴 명령 메모리 할당자(command allocator)를 참조한다. (명령 목록은 바로 reset 되어도 상관이 없음)

4. 명령 메모리 할당자는 GPU 명령 대기열의 참조가 완전히 끝난 후에 (대기열이 빈 경우) reset 해야 한다.

 

Direct3D 12 API에는 생성하고자하는 COM 인터페이스의 COM ID와 void** 를 받는 함수들이 많기 때문에 매크로를 정의하여 사용한다. 

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

4.2.2 CPU 동기화

mCommandQueue->Signal 함수를 이용

명령 대기열에 새 울타리 값을 갱신하는 명령(Signal)을 추가

 

울타리 값은 0부터 시작하는 정수, 새로운 울타리 지점을 만들때마다(명령 대기열 flush) 1씩 증가

cpu 울타리 값은 바로 증가하지만 gpu 울타리 값은 명령 대기열이 비어야 증가하기 때문에 

gpu 울타리 값이 cpu 울타리 값과 같아질 때까지 기다림

 

4.2.3 자원 상태 전이

자원에 상태를 부여하여 자원 위험 상황을 피하기 위해 존재

개발자는 자원이 언제 전이하는지 알고 있기 때문에 프로그램이 자원 전이를 추적하는 부담을 줄일 수 있다.

전이 자원 장벽(transition resource barrier)

mCommandList->ResourceBarrier함수 // 장벽(자원, 이전상태, 이후상태)의 배열을 명령 대기열에 추가

 

4.2.4 명령 목록을 이요한 다중 스레드 활용

장면 전체를 하나의 명령 목록으로 그리려고 하면 명령 목록을 만드는데 CPU 시간이 오래 걸릴 수 있음

4개의 스레드 마다 하나씩 명령 목록을 만들게 하면 CPU 시간이 1/4배가 됨

 

1. 각 스레드는 명령 목록과 명령 메모리 할당자를 독립적으로 가진다.

2. 명령 대기열에는 동시에 접근할 수 있다.

3. 성능상의 이유로 초기화 시점에 동시에 기록할 수 있는 명령 목록들의 최대 개수를 설정해야 한다.

다중 CPU 코어의 장점을 활용할 수 있다.

 

DirectX 기본 프로젝트 빌드 시 VS 2019 버전에서 일어나는 오류

잘 따라했는데 문제가 생긴다
vs2019의 c++ standard conformance check에서 발생한 문제

추가 옵션에 /permissive를 적어주면 해결된다.

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

5. 렌더링 파이프라인  (0) 2022.06.14
4. Direct3D의 초기화(2)  (0) 2022.06.13
3. 변환  (0) 2022.06.12
2. 행렬 대수  (0) 2022.06.11
1. 벡터 대수  (0) 2022.06.11

 

3.1 선형변환

선형 변환은 좌표계를 선형으로 변환하는 변환?

기저 벡터를 바꾸는 변환

비례변환, 회전변환

3.2 아핀변환

아핀변환 : 선형변환에 이동변환을 결합한 변환

동촤 좌표 (Homogeneous coordinate) : 점과 벡터에 대한 변환을 동일한 방식으로 다룰 수 있다.

벡터를 나타내는 동촤좌표는 (x, y, z, 0)

점을 나타내는 동촤좌표는 (x, y, z, 1)

 

3.4 좌표 변경 변환

 

3.6 DirectXMath 라이브러리의 변환 관련 함수들

XMMatrixScaling // float 매개변수 3개로 비례행렬 생성

XMMatrixScalingFromVector // 벡터의 성분으로 비례행렬 생성

 

XMMatrixRotationX // x축에서 라디안 값만큼 회전하는 행렬 생성 ( 축의 방향 바라보고 시계방향)

// Y Z 

XMMatrixRotationAxis(회전축 벡터, 각도) // 임의의 축에 대한 회전행렬

 

XMMatrixTranslation // float 3개로 이동행렬생성

XMMatrixTranslationFromVector // 벡터의 성분들로 이동핼렬 생성

 

XMVector3TransformCoord(벡터, 행렬) // 점 변환을 위해 벡터 마지막 원소 1로 둔다.

XMVector3TransformNormal // 벡터 변환을 위해 벡터 마지막 원소를 0으로 둔다.

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

5. 렌더링 파이프라인  (0) 2022.06.14
4. Direct3D의 초기화(2)  (0) 2022.06.13
4. Direct3D의 초기화(1)  (0) 2022.06.13
2. 행렬 대수  (0) 2022.06.11
1. 벡터 대수  (0) 2022.06.11

 

2.5 2.6 2.7

 

 

2.8 DirectXMath의 행렬

XMMATRIX 구조체

XMVECTOR r[4]를 멤버로 가짐 // SIMD 활용을 위해 4개의 XMVECTOR를 멤버로 가짐

 

초기화 방법

1. 행벡터 4개

2. float 성분 16개

3. float 성분 16개 담은 배열

4. XMMatrixSet 함수 성분 flaot 16개

 

XMVector가 클래스 자료멤버에 저장할 때 XMFLOAT4 사용을 권장했었는데

XMMATRIX는 클래스 자료 멤버에 저장할 때 XMFLOAT4X4 형식 사용을 권장함

 

XMMATRIX -> XMFLOAT4x4일때 XMStoreFloat4x4 

XMFLOAT4x4 -> XMMATRIX 일때 XMLoadFloat4x4를 사용

 

2.8.2 행렬 함수

XMMatrixIsIdentity // 단위행렬인지 여부

XMMatrixMultiply // 행렬 곱

XMMatrixTranspose // 전치행렬

XMMatrixDeterminant // (행렬식, 행렬식, 행렬식, 행렬식) 벡터 반환

XMMatrixInverse(행렬식 벡터, M) // 역행렬 반환

 

함수 매개변수로 사용시 

첫 번째 매개변수는 FXMMATRIX

나머지 매개변수는 CXMMATRIX

 

생성자는 무조건 CXMMATRIX

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

5. 렌더링 파이프라인  (0) 2022.06.14
4. Direct3D의 초기화(2)  (0) 2022.06.13
4. Direct3D의 초기화(1)  (0) 2022.06.13
3. 변환  (0) 2022.06.12
1. 벡터 대수  (0) 2022.06.11

1.1.2 왼손잡이 좌표계

왼손잡이 좌표계

1.3 내적

내적

세타 값이 90도이면 내적은 0

예각이면 양수

둔각이면 음수

 

1.4 외적

외적 : 두 벡터에 수직인 벡터를 출력

 

1.6 DirectXMath 라이브러리 벡터

SIMD : 128비트 너비의 레지스터

SIMD 명령들을 가지고 있는 라이브러리, 4차원 벡터 연산을 스칼라 연산 4개가 아니라 SIMD 명령 하나로 처리할 수 있다.

x86 플랫폼에서는 sse2(streaming simd extensions 2)옵션을 활성화 해줘야 하지만 x64 플랫폼에서는 따로 해 줄 필요 없다.

 

typedef __m128 XMVECTOR;

// XMVECTOR는 32비트값 4개로 구성된다.

 

지역변수와 전역 변수에는 XMVECTOR를 쓰면 16바이트 경계에 자동으로 정렬이 된다.

클래스 자료 멤버에서는 XMVECTOR 대신 XMFLOAT2, XMFLOAT3, XMFLOAT4를 사용하는 것이 권장된다.

 

SIMD의 장점을 취하기 위해서는 XMFLOAT를 XMVECTOR 형식으로 바꿔서 계산하는 것이 좋으므로 

클래스의 정보를 계산을 위해 XMLoadFloat 함수를 사용하여 XMVECTOR형식으로 변환하고

계산후에 XMStoreFloat함수로 XMFLOAT형식으로 되돌린다.

 

1.6.3 XMVector를 매개변수로 전달 할 때

함수에 XMVector 인수를 전달 할때 

플랫폼과 컴파일러에 따라 SSE 레지스터를 사용할 수 있는 개수가 다르기 때문에 의존성을 없애기 위해

FXMVECTOR, GXMVECTOR, HXMVECTOR, CXMVECTOR 형식을 사용해야 한다.

XM_CALLCONV 호출 규약지시자를 사용해야 한다.

1 ~ 3번째 : FXMVECTOR

4번째 : GXMVECTOR

5 ~ 6번째 : HXMVECTOR

나머지 : CXMVECTOR

 

생성자에 대한 규칙은 다르다

1 ~ 3번째 : FXMVECTOR

나머지 : CXMVECOTR

그리고 XM_CALLCONV 호출 규약 지시자를 사용하지 말아야 한다.

 

1.6.4 상수 벡터

상수 벡터는 XMVECTORF32를 사용해야 한다.

중괄호 초기화 구문을 사용할 때에는 XMVECTORF32를 사용해야 한다.

 

1.6.7 설정함수

XMVECTOR XM_CALLCONV XMVectorZero(); // (0, 0, 0, 0)

XMVECTOR XM_CALLCONV XMVectorSplatOne(); // (1, 1, 1, 1)

XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w); // (x, y, z, w)

XMVECTOR XM_CALLCONV XMVectorReplicate(float s) // (s, s, s, s)

XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) // (v.x, v.x, v.x, v.x)

//Y Z 버전도 존재

 

1.6.8 벡터 함수들

길이 : xmvector3length

내적 : xmvector3dot

외적 : xmvector3cross

정규화 : xmvector3normalize

각도 : xmvector3anglebetweenvectors

proj perp : xmvector3componentsfromnormal ( 출력 매개변수 )

equal : xmvector3equal

 

XMVectorGetX // float 값 반환

// Y Z W도 있음

1.6.9 부동 소수점 오차

부동 소수점 수의 상등을 판정 할 때 

XMVector3NearEqual(벡터1, 벡터2, epsilon벡터) // 두 벡터의 차이가 epsilon벡터보다 작으면 true

 

연습문제 19번 - 다양한 함수 알아보기

 

상수

XM_PIDIV4 // 파이 / 4

XM_PIDIV2 // 파이 / 2

XM_PI // 파이

 

벡터 함수 (원소에 각각 적용)

XMVectorAbs // 절대값

XMVectorCos // cosine (라디안)

XMVectorLog // 밑이 2인 로그

XMVectorExp // 2의 거듭제곱

 

XMVectorPow(u, p) // u의 p승

 

XMVectorSqrt // 제곱근

 

XMVectorSwizzle (u, 2, 2, 1, 3) // 벡터 원소를 인덱스를 이용하여 재배치

 

XMVectorMultiply(u, v) // 각각의 원소를 곱함

XMVectorSaturate(u) // 0과 1사이로 자름

XMVectorMin(u, v) // 두 벡터중 작은 값의 원소를 선택

XMVectorMax(u, v) // 큰 값의 원소를 선택

 

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

5. 렌더링 파이프라인  (0) 2022.06.14
4. Direct3D의 초기화(2)  (0) 2022.06.13
4. Direct3D의 초기화(1)  (0) 2022.06.13
3. 변환  (0) 2022.06.12
2. 행렬 대수  (0) 2022.06.11

디스크의 파일 데이터에 접근하는 방법

하드 디스크는 읽기의 최소 단위가 block (512byte)

Contiguous Allocation

ㄴ 파일의 크기를 키우는데 제약이 있음

ㄴ 장점 : 짧은 I/O, direct access

하드디스크 연속적으로 할당하면 rotation/seek 시간이 짧음

realtime file이나 프로세스의 swap area용도로 적합

 

Linked Allocation

linked allocation의 개선한 시스템 -> FAT

부팅할 때 file-allocation table을 메모리에 올려놓음

파일이 시작주소를 가지고 table에서 왔다갔다 하면 됨

fat은 중요한 정보이므로 여러개 복제해서 보관

Indexed Allocation

파일이 인덱스 블록을 가리킴

UNIX 파일 시스템의 방식

 

'운영체제' 카테고리의 다른 글

9. Virtual memory  (0) 2022.06.09
8. 메모리  (0) 2022.06.09
7. Deadlock  (0) 2022.06.09
6. 프로세스 동기화  (0) 2022.06.09
5. CPU 스케줄링  (0) 2022.06.09

Demand Paging 

실제로 필요할 때 page를 메모리에 올리는 것

메모리 사용량 감소

빠른 응답 시간

더 많은 프로세스를 메모리에 올릴 수 있다

 

출처 :&nbsp;https://core.ewha.ac.kr/publicview/C0101020140509151648408460?vmode=f

위 그림에서 페이지 테이블은 사용가능한 가상주소영역의 크기만큼 만들어진다. (0번 ~ 7번 페이지)

프로그램을 구성하는 페이지는 0번 ~ 5번 페이지이지만 페이지 테이블은 0번 ~ 7번 페이지까지 만들어진다.

1번 3번 4번 페이지는 프로그램에서 사용되는 프로그램이지만 메모리에 올라가있지 않으므로 invalid

프로그램에서 사용되지 않는 6번 7번 페이지는 안쓰니까 invalid

 

주소 변환시 invalid page에 접근하게 되면 page fault가 발생 (요청한 페이지가 메모리에 없는 경우)

page fault가 발생하면 MMU가 trap(소프트웨어 인터럽트)를 발생시켜 cpu가 운영체제로 넘어가고 페이지를 올리는 작업을 수행함

 

Page fault 처리 과정

1. 적절한 주소인지 확인 -> 아닌경우 프로세스 abort() 

2. 메모리에 존재하는 비어있는 페이지 프레임을 찾는다. 

3. disk에서 memory로 페이지를 읽어온다. (disk I/O) 

4. disk I/O가 일어나므로 CPU를 뺏긴다. (block 상태)

5. disk 읽어서 memory로 읽어오면 페이지 테이블 새로운 엔트리에 페이지 프레임 번호 기록하고, valid로 세팅

6. ready queue에 프로세스를 넣기 (ready 상태)

 

비어있는 페이지 프레임이 없는경우

어떤 page frame을 쫓아낼 것인지 결정하는 replacement 알고리즘이 필요함

쫓아내는 과정

1. 쫓아내는 페이지 프레임을 swap area에 복사 (write 작업으로 페이지가 변경되어 swap area에 있는 데이터와 다를 수 있기 때문)

2. 해당 페이지 엔트리를 invalid로 세팅

3. 새로운 페이지를 swap에서 physical memory로 올림

4. 페이지 테이블에 새로운 엔트리에 대해 프레임 번호와 valid 세팅

 

Clock Algorithm (Second change algorithm)

Paging System에서 사용하는 replacement 알고리즘

LRU를 근사한 알고리즘

page fault가 나지 않으면 운영체제는 제어권을 얻을 수 없기 때문에 어떤 페이지가 최근에 참조되었는지(LRU) 어떤 페이지가 가장 자주 참조되었는지(LFU)를 알 수 없음

 

페이지 테이블 entry 마다 reference bit와 modified bit을 둔다. 

하드웨어는 메모리 참조가 일어날때 reference bit을 설정해두고

나중에 os가 빈페이지를 찾을 때 reference bit가 1로 되어있는거 0으로 바꾸면서 0을 찾는다.

페이지가 write으로 참조되는 경우 페이지의 modified bit을 1로 세팅

ㄴ 1로 세팅 되어있으면 나중에 이 페이지 쫓아낼 때에는 swap area에 복사가 필요

ㄴ 0이면 그냥 지워도 됨

페이지 프레임 할당 문제

얼마만큼의 페이지 프레임을 프로세스에 할당 해주어야 page fault가 덜 발생할 것인가?

local replacement - 미리 프로세스에 정해진 프레임 개수 할당하고 프로세스 별로 replace 알고리즘을 적용하는 방법

global replacement - 다른 프로세스에서 뺏을 수 있다.

Thrashing

프로세스의 원활한 수행에 필요한 최소한의 page frame 수를 할당 받지 못한 경우 발생

Page fault rate가 높아짐

I/O 시간이 많아져 CPU 이용율이 낮아짐

swap in / swap out 하느라 시간을 다 씀

 

동시에 너무 많은 프로세스 안 올라오게 하는 global replacement 알고리즘

1. working set algorithm

ㄴ working set window를 사용하여 최근에 사용한 n개의 페이지 집합을 유지하고, 집합의 크기보다 비어있는 페이지 프레임 수가 작으면 워킹셋에 있는 페이지 전부 swap out 시키고 프로세스 suspend 상태로 전환

2. PFF(page-fault-frequency) algorithm

ㄴ page fault rate에 상한값가 하한값을 두어 프로그램마다 할당하는 frame의 수를 줄인다.

 

page size

가 작으면 

전체 페이지 수가 증가하므로

페이지 테이블 크기도 증가

disk tansfer 효율성 떨어짐 - seek/rotation 비용이 커짐

locality성이 떨어짐

'운영체제' 카테고리의 다른 글

10. 파일 시스템  (0) 2022.06.09
8. 메모리  (0) 2022.06.09
7. Deadlock  (0) 2022.06.09
6. 프로세스 동기화  (0) 2022.06.09
5. CPU 스케줄링  (0) 2022.06.09

주소 바인딩 (=주소 변환)

주소 바인딩 : 논리적 주소(가상 주소)를 physcial 메모리 주소로 매핑하는 작업

주소바인딩이 일어나는 시점에 따라 3가지로 분류 가능

 

1. 컴파일 타임 바인딩

ㄴ 물리적 메모리 고정 위치에 프로그램이 올라가는것

2. 로드 타임 바인딩

ㄴ 실행될 때 프로그램이 올라가는 위치가 결정됨

3. 실행 중 바인딩

ㄴ 실행될 때, 실행중 프로그램이 올라가는 위치가 결정되고 바뀔 수 있다.

 

용어 : dynamic loading과 dynamic linking

dynamic loading : OS가 프로그램 일부 필요한 부분만 메모리에 올리는 것은 운영체제가 지원 해주는 페이징 시스템

비슷한 말인데 dynamic loading은 프로그래머가 os 라이브러리를 사용해서 구현하는 개념

 

static linking

ㄴ 라이브러리가 프로그램의 실행 파일 코드에 포함되어 실행 파일의 크기가 커짐

ㄴ 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비

 

dynamic linking (윈도우 dll 파일) (shared library)

ㄴ 라이브러리가 실행시 연결(link)됨 

ㄴ 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠

ㄴ 라이브러리가 메모리에 이미 있으면 그 주소로 가고 없으면 디스크에서 읽어옴

ㄴ 운영체제의 도움이 필요함

 

물리적 메모리에 프로세스를 할당하는 방법

1. 연속 할당

ㄴ 고정분할, 가변분할 방식

ㄴ 운영체제는 메모리에 어떤 공간이 할당되어 사용하고 있는지, 가용 공간(hole)인지 정보를 유지해야 함

2. 불연속 할당

ㄴ paging, segmentation, paged segmentation

 

Paging

ㄴ process의 virtual memory를 동일한 사이즈의 page 단위로 나눔

ㄴ virtual memory의 내용이 page단위(물리적 메모리의 frame과 같은 단위)로 저장됨 

ㄴ 일부는 backing storage(swap area)에, 일부는 physical memory에 저장

ㄴ 페이지 테이블을 이용함

ㄴ 프로그램마다 페이지 테이블을 가질 수 있음

두개의 레지스터 사용

PTBR(page table base register) : 페이지 테이블의 주소

PTLR(page table length register) : 페이지 테이블의 크기

TLB

CPU와 page table(main memory) 사이에 있는 캐싱 역할을 하는 하드웨어 

빈번히 참조되는 entry 몇개에 대해서만 내용을 저장하고 있음

TLB 내용 전체를 탐색해야 하기 때문에 Parallel search가 가능한 Associative register를 사용

TLB 탐색했는데 없으면 page table 보면 됨

TLB는 context switch 때 flush

 

2단계 페이지 테이블(계층적 구조)

ㄴ page tabe 자체를 page로 구성

ㄴ 사용되지 않는 주소 공간에 대한 outer page table의 엔트리 값은 NULL

ㄴ 64-bit 명령어 기계에서는 적합하지 않음

ㄴ 2단계 페이지 테이블을 사용하지 않는 페이지에 대해서는 안쪽 테이블이 만들어지지 않음

Inverted page table

ㄴ 전체 시스템에서 페이지 테이블이 하나만 존재

ㄴ 물리적 메모리 페이지 프레임 개수만큼 페이지 테이블의 엔트리가 존재

ㄴ 하나의 페이지 프레임 엔트리는 PID와 가상 주소를 가짐

ㄴ 물리적 메모리에 연속적으로 저장된 테이블에서 PID와 가상주소가 일치하는 인덱스를 찾아 물리적 주소로 변환

ㄴ 페이지 테이블을 associative register로 병렬 탐색해야함 (비용 발생)

Memory Protection

페이지 접근 권한에 대한 bit

ㄴ read/write/read-only

ㄴ 프로그램의 code는 내용이 바뀌지 않아야 하므로 read-only

ㄴ 프로그램의 data는 읽기 쓰기 가능해야하므로 read/wirte

 

페이지 테이블의 valid-invalid bit

valid-bit

ㄴ 주소 변환이 가능한 경우

invalid-bit

ㄴ 프로세스가 그 페이지를 사용하지 않는 경우

ㄴ 해당 페이지가 메모리에 올라와 있지 않고 swap area에 있는 경우

ㄴ 주소 변환시 invalid bit이 set 되어 있으면 page fault가 발생

 

Shared pages

ㄴ 같은 프로그램을 여러개 돌리는 경우 프로세스들의 code 부분은 똑같기 때문에 하나만 메모리에 올리는 기법

ㄴ shared code는 모든 프로세스의 logical address space에서 동일한 위치에 있어야 함

Segmentation

ㄴ 프로그램을 의미 단위로 (크기는 균일하지 않음) 잘라서 물리 메모리에 올린다.

ㄴ 함수, 전역 변수, 스택, symbol table, 배열 등의 단위로 나눌 수 있다.

ㄴ protection bit를 세그먼트 별로 줄 수 있어서 paging 보다 효과적인 protection이 가능하다. sharing면에서도 paging보다 효과적이다.

ㄴ 세그멘테이션 테이블에는 시작 위치와 세그먼트 길이가 기록됨 (페이지와는 달리 길이가 일정하지 않기 때문에)

STBR(segment table base register) : segment table의 주소

STLR(segment table length register) : 프로그램이 사용하는 segment의 수

'운영체제' 카테고리의 다른 글

10. 파일 시스템  (0) 2022.06.09
9. Virtual memory  (0) 2022.06.09
7. Deadlock  (0) 2022.06.09
6. 프로세스 동기화  (0) 2022.06.09
5. CPU 스케줄링  (0) 2022.06.09

deadlock은 프로세스들이 서로가 가진 자원을 기다리며 block된 상태를 말한다.

 

deadlock의 발생조건 4가지

1. mutual exclusion

2. no preemption

3. hold and wait

4. circular wait

 

circular wait을 확인하기 위해 자원할당 그래프를 그려 확인 할 수 있다.

 

deadlock의 처리 방법 4가지

1. 예방 - deadlock의 발생조건 4가지를 막는 방법 - 비효율적

2. 회피 - 자원 할당그래프 알고리즘, bankers 알고리즘을 통해 최악의 상황에 deadlock이 발생할 수 있는지 여부 파악해서 프로세스에게 자원 줄지 안줄지 결정

3. 탐지 & 복구 - 연관된 프로세스 죽이기, 연관된 프로세스의 자원 뺏기

4. 무시 - 현대 OS 방식, 사용자가 처리하도록 놔둠, 나머지 방식이 오버헤드가 크기 때문에

 

'운영체제' 카테고리의 다른 글

9. Virtual memory  (0) 2022.06.09
8. 메모리  (0) 2022.06.09
6. 프로세스 동기화  (0) 2022.06.09
5. CPU 스케줄링  (0) 2022.06.09
4. 프로세스 생성  (0) 2022.06.09

+ Recent posts