본문 바로가기
ETC/Job

게임 클라이언트 프로그래머 직군 면접 준비 (2)

by Dev_카페인 2024. 2. 27.
반응형

게임 클라이언트 프로그래머 직군 면접 준비 (2)

 

프로세스 (Process)

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 의미합니다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없습니다. 최소 1개의 스레드를 가지고 있으며, 독립된 메모리 영역을 할당받아 사용합니다.

 

[프로세스의 생명주기]

관련 용어 설명
디스패치
(Dispatch)
준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세서를 할당받아 실행상태로전이되는과정
# 준비(Ready)  실행(Run)
Wake Up 프로세스가 대기상태에서준비상태로전이되는과정
# 대기(Wait)  준비(Ready)
스풀링(Spooling) 나중에 한꺼번에 입, 출력하기 위해 디스크에저장하는과정

 

[멀티 프로세스]

멀티 프로세싱이란 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것입니다. 독립된 메모리 영역을 할당받아 다른 프로세스에게 영향을 주지는 않지만, 상태 교환이 이루어질 때 CPU는 아무런 일을 하지 못하기 때문에 오버헤드의 발생률이 높습니다.

* 프로세스 간 메모리를 공유할 수 없기 때문에 복잡한 통신 기법을 따라야 합니다. (파이프, 파일, 메시지, 소켓)

 

[프로세스 상태 교환, 문맥 교환(Context Switching)]

멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 프로세스를 실행할 때 기존 프로세스의 상태 또는 레지스터 값을 다음 프로세스의 값으로 교체하는 작업을 말합니다.

레지스터, 스택, 주소, 상태 등의 변경

 

[스레드(Thread)]

스레드는 프로세스 내에서 실행되는 여러 흐름의 단위입니다. 프로세스가 할당받은 자원 내에서 Stack 영역을 할당받아 사용하며 Code, Data, Heap 영역은 공유하면서 사용합니다.

각 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있습니다.

 

[멀티 스레드(Multi Thread)]

하나의 프로세스를 여러 개의 스레드로 구성하여 하나의 작업을 처리하는 것을 말합니다.

멀티 프로세스와 달리 데이터를 공유할 수 있기 때문에 데이터를 주고 받는 것이 간단하고 자원의 효율성이 좋습니다.

하지만 자원을 공유하기 때문에 동기화 문제나 충돌 문제가 발생할 수 있습니다.

 

 

[교착 상태(Dead Lock)]

각 스레드가 작업에 필요한 자원을 점유하고 있을 때 상대방의 작업이 끝나기를 무한정 기다리는 상태입니다.

 

[교착 상태 발생 조건]

상호 배제(Mutual Exclusion) : 한 번에 한 개의 프로세스만이 공유 자원을 사용할 수 있어야 함

점유와 대기(Hold and Wait) : 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원

을 추가로 점유하기 위해 대기하는 프로세스가 있어야함

비선점(Non-preemption) : 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 함

환형 대기(Circular Wait) : 공유 자원과 공유 자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어

있어야 함

 

[교착 상태 해결 방안]

1. 예방(Prevention) : 교착 상태 발생 조건 중 하나를 제거(부정)합니다. (자원 낭비가 심하다.)

2. 회피(Avoidance) : 은행원 알고리즘 등을 통해 자원 할당 후에도 안전한지 검사한 후 할당합니다.

3. 탐지(Detection) : 자원 할당 그래프를 통해 탐지합니다.

4. 회복(Recovery) : 교착 상태에 있는 프로세스를 종료하거나 할당된 자원을 해제시켜 회복합니다.

 

[임계 영역(Critical Section)]

여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록

, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역

프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야 한다.

 

[뮤텍스(Mutex)]

동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘

임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술.

- 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법

- Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.

 

[세마포어(Semaphore)]

멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법

공유자원의 상태를 나타낼 수 있는 카운터로 생각할 때, 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

 

[은행원 알고리즘]

은행이 최소한 한 명에게 대출해줄 수 있는 금액을 항상 보유하고 있어야한다는 개념에서 나온 것이다.

데드락이 빠질 가능성이 있는지 없는지 운영체제가 검사하고 빠질 가능성이 없을 경우에만 자원을 할당함으로써 문제 발생을 피하는 방법입니다.

 

[메모리 공간(RAM)]

메모리 공간은(RAM) 코드(Code), 데이터(Data), 스택(Stack), (Heap) 영역으로 나뉩니다.

코드(Code) 영역: 실행할 프로그램의 코드, 작성한 소스코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.

기계어 형태(0,1)로 저장한다.

데이터(Data) 영역: 전역 변수, 정적 변수, 전역 변수와 정적 변수(static)가 할당되는 영역이다.

- 프로그램의 시작과 동시에 할당되고 프로그램이 종료돼야 메모리가 소멸된다.

(Heap) 영역: 런타임 시 크기가 결정됨(사용자의 동적 할당),

- 이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation) 이라고 부른다.

- 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장되는 공간,

스택(Stack) 영역: 컴파일 타임에 크기가 결정됨, 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역

Heap 영역과 Stack 영역은 사실 같은 공간을 공유한다. Heap이 메모리 위쪽 주소부터 할당되면 Stack은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데, 이를 각각 Heap Overflow, Stack Overflow 라고 칭한다.

 

[컴파일(Compile)]

컴파일은 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java ) CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.

전처리 - 컴파일 - 어셈블리 - 링킹

전처리(Pre-processing) 과정은 전처리기(Preprocessor)를 통해 소스 코드 파일(*.c)을 전처리된 소스 코드 파일(*.i)로 변환하는 과정이다. 주석제거, 헤더 파일 삽입, 매크로 치환 적용 등

컴파일(Compilation) 과정은 컴파일러(Compiler)를 통해 전처리된 소스 코드 파일(*.i)을 어셈블리어 파일(*.s)로 변환하는 과정이다. 언어의 문법 검사와 함께 Static한 영역(Data, BSS 영역)들의 메모리 할당을 수행한다.

어셈블리(Assembly) 과정은 어셈블러(Assembler)를 통해 어셈블리어 파일(*.s)을 오브젝트 파일(*.o)로 변환하는 과정이다.

링킹(Linking) 과정은 링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정이다.

오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.

라이브러리를 링크하는 방법에 따라 정적 링킹(Static Linking)과 동적 링킹(Dynamic Linking)으로 나눌 수 있다.

 

[컴파일러, 인터프리터]

컴파일러(Comiler)는 프로그램 전체를 스캔하여 한 번에 기계어로 번역합니다.

인터프리터는 프로그램 실행 시 한 번에 한 문장씩만 기계어로 번역합니다.

 

 

반응형