게임 클라이언트 프로그래머 직군 면접 준비 (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)는 프로그램 전체를 스캔하여 한 번에 기계어로 번역합니다.
인터프리터는 프로그램 실행 시 한 번에 한 문장씩만 기계어로 번역합니다.
'ETC > Job' 카테고리의 다른 글
게임 클라이언트 프로그래머 직군 면접 준비 (6) (1) | 2024.02.27 |
---|---|
게임 클라이언트 프로그래머 직군 면접 준비 (5) (1) | 2024.02.27 |
게임 클라이언트 프로그래머 직군 면접 준비 (4) (3) | 2024.02.27 |
게임 클라이언트 프로그래머 직군 면접 준비 (3) (0) | 2024.02.27 |
게임 클라이언트 프로그래머 직군 면접 준비 (1) (0) | 2024.02.27 |