운영체제 기초
1. 변수들이 메모리에 저장되는 영역에 대해서 설명해보아라.
메모리 영역은 code bata heap stack으로 이루어져 있습니다. 이 순서대로 낮은 주소에서 높은 주소로 메모리를 저장합니다. stack영역 빼고 모두 런타임에서 크기가 결정되며 stack영역은 컴파일 타임에 크가가 결정됩니다.
code영역은 실행될 명령어가 들어가는 구역입니다. 저희가 작성한 소스 코드가 들어가고 상수또한 이곳에 들어갑니다. 물론 컴파일 된 기계어가 들어갈 것이며 프로그램이 끝날 때까지 메모리에 계속 적재되어 있습니다.
bata영역은 전역변수 또는 static등이 지정되는 구역입니다. 이 또한 프로그램이 끝날 때까지 메모리에 계속 적재 됩니다.
heap영역은 malloc이나 new로 동적 할당 받은 메모리가 들어가는 구역입니다. 필요에 의해 동적으로 메모리를 할할당하고 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며 메모리 주소값에 의해서만 참조되고 사용되는 영역입니다. 메모리는 위에서 아래로 확장됩니다.
stack영역은 heap영역과 다르게 아래에 위로 확장되며 지역변수, 매개변수, 리턴값등이 저장됩니다. 함수 호출시 생성되고 종료되면 시스템에 반환하게 됩니다. 런타임 시에는 스택 사이즈를 변경할 수 없습니다.
2. 프로그램의 빌드 과정에 대해서 설명해주시겠어요?
컴파일하는 빌드과정은 프로세싱 컴파일 어셈블링 링크로 총 4단계입니다.
프로세싱은 전처리 단계라고 하며 일명 매크로 프로세서라고 합니다. 전처리기는 C++언어로 작성된 프로그램 소스를 문법적으로 해석하고 평가합니다. 주석으로 되어있는 문장을 제거하고 #include # define typedef using와 같은 키워드에 따라 필요한 파일을 읽고 실제 컴파일이 가능하도록 프로그램 소스로 만드는 작업을 수행합니다.
컴파일 단계는 컴파일러가 프로그램 소스를 어셈블러코드로 만듭니다. 어셉블로 코드는 실행이 가능한 바이너리 코드로 만들기 전에 기계어라고 하는 가장 낮은 단계의 소스코드를 말합니다.
어셉블링 단계는 어셈블러에 의하여 오브젝트 코드 또는 모듈이라고 부르는 실행이 가능한 프로그램 파일의 중간 단계에서 존해하는 파일로 만들어 집니다. 오브젝트 코드는 링크 과정에 필요한 정보를 갖고 있는 것이 특징입니다
링크 단계는 링커가 앞에서 생성한 오브젝트 코드와 C표준 라이브러리 또는 C++표준 라이브러리 하나의 실행가능한 프로그램을 만듭니다.
이렇게 만들어진 리눅스 프로그램은 커널의 로더가 요구하는 Excutable and Linking Format 즉 ELF포맷에 맞주어 저장되고 반면 윈도우는 Common object File Format이라는 COFF라는 포맷을 사용하여 저장합니다.
3. 임계영역은 무엇인가요?
둘 이상의 쓰레드가 동시에 실행될 경우 생길 수 있는 동시 접근 제어를 발생시킬수 있는 코드블록입니다.
동시 접근 문제가 발생한 메모리 공간을 임계역역이라고 하는게 아니라 동시 접근 문제가 발생할 수 있는 우리가 짠 코드 블록을 말합니다.
임계영역의 해결방법:
임계영역에 대한 문제를 해결하기 위한 동기화 기범
- 특정 임계 영역에 대한 키를 가져야만 임계영역에 접근하도록 한다.
- 이미 이 함수를 다른 쓰레드가 호출하여 해당 임계영역에 진입하였다면 뒤늦게 진입하려는 쓰레드는 호출된 수가 블로킹되어 기다리게 된다.
4. 데드락에 대해서 말해주세요.
교착 상태라고도 하며 한정된 자원을 여러 곳에서 사용하려고 할 때 발생합니다. 멀티 프로그래밍 환경에서 한정된 자원을 사용하려고 서로 경재하는 상황이 발생할 수 있다. 어떤 프로세스가 자원을 요청했을 때 그 시작에 그 자원을 사용할 수 없는 상황이 발생할 수 있고 그때는 프로세스가 대기 상태로 들어갑니다. 대기 상태로 들어간 프로세스들이 실행 상태로 변경될 수 없을 때 이러한 상황을 교착상태라고 합니다.
발생 조건: 상호 배제, 점유 대기, 비선점, 순환 대기로 네가지 조건이 동시에 성립할 때 발생합니다.
상호 배제-> 자원은 한 번에 한 프로세스만이 사용할 수 있어야한다.
점유 대기-> 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야한다.
비선점-> 다른 프로세스에 할당된 자원은 사용이 끝 날 때까지 강제로 빼앗을 수 없어야 한다.
순환 대기(환형 대기)-> 프로세스의 집합에서 p0은 p1이 점유한 자원을 대기하고 p1은 p2가 점유한 자원을 대기하고 pn은 p0이 점유한 자원을 요구해야 한다.
해결방법: 예방, 회피, 회복, 무시 4가지가 있습니다.
예방은 말 그대로 교착상태 발생조건 중 하나만 이상으로 해결하여 데드락을 발생시키지 않습니다.
5. 세마포어 뮤텍스에 대해서 각각 설명하고 차이점에 대해 설명해주세요.
세마포어: 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
뮤텍스: 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것
6. 파편화 문제는? 파편화 문제는 기기의 앱 구동 환경이 제 각각 분열되어 있는 것을 말합니다. 대표적인 예로는 안드로이드는 오픈소스이기 때문에 수많은 제조사에서 안드로이드 기반으로 기기 개발 중입니다. 각 기기는 제각기 능을 customize하여 가지고 있기 때문에 문제가 심해집니다. 따라서 한가지 기능을 개발하더라도 이러한 os파편화 문제가 발생할 수 있는 가능성을 염두해야 합니다.
7. Critical Section이란?
다중 프로그래밍 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 데이터를 엑세스 하는 프로그램 코드 부분을 가리키는 말입니다.
8. 경쟁조건이란?
명령어의 실행 순서에 따라 결과가 달라지는 현상을 말합니다.
9. 락이란?
임계영역에 대한 상호 배제를 보장하는 기법 중 하나 하나의 쓰레드만 락을 얻으면 나머지 쓰레드는 락을 얻을 때까지 리턴하지 않습니다.
10. 쓰레드와 프로세스의 차이는?
프로세스는 실행중인 프로그램 스레드는 프로세스 내에서 실행되는 흐름을 말합니다. 따라서 쓰레드는 하나의 프로세스 내에 여러 개 일 수 있습니다.
프로세스는 고유의 자원을 할당 받고 스레드는 하나의 프로세스 내에서 실행되기 때문에 스택을 제외한 모든 자원을 공유하고 프로세스는 PCB를 가지고 스레드는 TCB를 갖습니다.
11. 캐시 메모리란?
CPU내에 존재하는 용량은 작지만 액세스 속도가 빠른 기억장치
왜 필요한가? 주 기억장치의 엑세스 속도가 CPU에 비해 4~10배 또는 그 이상으로 느립니다. 캐시의 도입으로 병목현상을 완화하였습니다.
특징은? 주기억장치와 CPU사이에서 동작을하고 캐시와 관련된 동작은 모두 하드웨어로 처리됩니다. 블록은 주기억장치의 데이터 전송 단위이고 라인은 캐시의 전송 단위입니다.
캐시의 동작은? CPU가 기억장치를 엑세스 하려고 주소를 생성합니다. 만일 CPU가 요청한 데이터가 캐시안에 존재한다면 hit라고 부르며 CPU는 캐시에서 데이터를 가져옵니다. 반면 CPU가 요청한 데이터가 캐시 안에 존재하지 않는다면 miss 주기억장치에서 CPU가 원하는 데이터를 포함한 데이터 블록 후 캐시에서 해당 단어로 CPU로 전달합니다.
그래픽스 기초
1. 포워드 랜더링과 디퍼드 랜더링의 차이에 대해서 설명하세요.
포워드 랜더링은 3D공간에서 존재하는 폴리곤을 픽셀화하여 그 픽셀 마다 쉐이딩과 라이팅 연산을 더하는 방식입니다. 해상도가 올라가도 요구하는 메모리가 디퍼드보다 적지만 라이팅 연산이 느리고, 여러 오브젝트로 복잡한 화면을 구성하거나 폴리곤이 많은 모델을 렌더링 걸기 불리한 방식입니다. 그림자 처리가 어렵고, 화면의 깊이값을 이용한 포스트 프로세싱은 따로 처리해주어야 합니다.
디퍼드 렌더링은 한 화면에 수많은 라이팅 효과를 넣고 싶어서 만든 렌더링 기법입니다. 실시간으로 라이팅에 반응 하는 쉐이더를 쓰는 게임은 기본적으로 디퍼드 렌더링입니다. 구현방식은 폴리곤을 픽셀화하여 포토샵의 레이어처럼 정보를 나누어 비디오 메모리에 저장합니다. 여기에서 각종 쉐이더와 라이팅효과를 거처 화면에 보여줍니다. 동적 라이팅, 그림자도 손쉽게 그려집니다. 화면의 깊이값을 이용해 특수 효과 같은 것을 만듭니다. 단점은 뒤에 그려지는 오브젝트 정보가 비디오 메모리에서 소멸되기 때문에 알파가 빠지는 오브젝트를 표현할수 없습니다. 요구하는 하드웨어 사양이 포워드 렌더링 보다 높고 해상도가 올라갈수록 요구하는 비디오 메모리가 기하급수적으로 늘어납니다.
forward rendering | deferred rendering |
해당 라이트에 영향을 받지 않아도 빛을 연산 화면에 렌더링 되지 않는 면도 세이딩 연산 멀티 라이트 상황에서 관리 어려움 그림자와의 통합이 어려움 라이트 개수*라이트 영향받은 오브젝트 수 |
배치가 간단하고 엔진에서 관리가 쉬움 수많은 작은 동적 라이팅 사용이 가능 일종의 포스트 프로세싱 처러 수행 3d 계산을 2d계산으로 변환시킴 라이트 계산이 전혀 없이 속성산을 렌더링 라이팅 계산을 먼저 하지 않고 미루었다가 실행하기 때문에 지연셰이딩이라고 부른다 라이트 개수* 라이트에 영향받는 픽셀 개수 |
2. 그래픽스 파이프라인에 대해서 이야기하세요.
렌더링 파이프라인은 GPU를 사용하여 리소스를 2D이미지로 렌더링하는 과정을 말합니다. 파이프라인은 여러 개의 파이프라인 단계로 구성되어 있습니다. 저는 쉐이더 5.0으로 이야기하겠습니다.
파이프라인은 프로그래머가 손 댈수 없는 고정 파이프라인 단계 IA(입력 조립기 단계), RS(레스터라이저 단계), OM(아웃풋 출력 단계) ST(스트림 출력단계) TS(테셀레이션 단계)가 있습니다.
프로그래머가 수정할 수 있는 단계는 정점쉐이더, 도메인 쉐이더, 헐 쉐이더, 도메인 쉐이더, 기하 쉐이더가 있습니다.
입력 조립기 | 레스터라이저 | 출력병합기 |
응용 프로그램에서 제공하는 정점 버퍼의 정점 데이터를 다른 파이프라인에서 사용할 프리미티브로 조립하는 단계입니다. | 레스터이미지로 변환하는 단계로 래스터라이제이션을 하는 동안 각 프리미티브를 구성하는 정점은 픽셀로 변환합니다. 원근투영나누기, 카메라 절두체를 벗어나는 점들을 클리핑하고 프리미티브를 2차원 뷰포트로 매핑하며 프리미티브의 모든 픽셀들에 대해서 픽셀쉐이더를 호출합니다. | 출력병합기단계는 최종적으로 픽셀의 색상을 생성하여 렌더타겟으로 출력하는 단계입니다. 파이프라인의 상태정보 픽셀쉐이더가 생성한 픽셀 색상 렌터타겟의 내용 그리고 뎁스스텐실 버퍼의 내용들을 조합하여 출력할 색상을 결정합니다. 이곳에서 뎁스스텐실과 블랜딩이 일어납니다. |
'🙋🏻♀️ pinko > ◽ 게임회사' 카테고리의 다른 글
게임 회사 용어 정리 (아마 계속 업데이트 될거임.) (0) | 2024.07.11 |
---|---|
클라이언트 프로그래머 동영상 포트폴리오 (4) | 2022.12.13 |
1분 자기소개 (실제로 면접 때 했던...) (5) | 2021.02.22 |
실무 면접 대비 2번째 알고리즘, STL, 자료구조 (게임 클라이언트 프로그래머 기준) (0) | 2021.02.22 |
실무 면접 대비 1번째 C / C++ (게임 클라이언트 프로그래머 기준) (1) | 2021.02.22 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!