새소식

Tech Interview/Interview

1. 질문

  • -

1) 멀티 프로세스로 처리 가능한 걸 굳이 멀티 스레드로 하는 이유?

 

: 프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소함으로써 자원의 효율적 관리가 가능, 프로세스 간의 통신보다 스레드 간의 통신 비용이 적어 작업들 간 부담이 감소한다. 대신, 멀티 스레드를 사용할 때는 공유 자원으로 인한 문제 해결을 위해 동기화에 신경써야한다. 

 

교착상태는 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태를 못한다.(시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생하는 문제이다.)

 

- 상호 배제 : 프로세스들이 필요로 하는 자원에 대해 배타적 통제권을 요구한다.

- 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

- 비선점 : 프로세스가 어떤 자원의 사용을 끝날 때까지 그 자원을 뺏을 수 없다.

- 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있다.

 

하나라도 만족하지 않으면 교착상태는 발생하지 않는다. 교착상태 해결 방법으로는 예방, 회피, 무시, 발견이 있다.

 

 

 

2) 메모리 계층 구조에 대해 설명해주세요.

 

 : 메모리 계층 구조는 메모리를 필요에 따라 여러 가지 종류로 나누어 둠을 의미하는데, 이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다. 아래와 같은 구조를 가지며 레지스터와 캐시는 CPU 내부에 존재하여 CPU에서 빠르게 접근할 수 있다. 메모리는 CPU외부에 존재하고, 하드 디스크는 CPU가 직접 접근할 방법이 없다. (CPU와 근접해 있을수록 접근 속도가 빠르다는 것을 알 수 있다.)

 

레지스터

캐시

메모리

하드디스크

 

 

 

3) 외부단편화와 내부단편화는 무엇인가요?

 

외부 단편화는 작업보다 많은 공간이 있더라도 실제로 그 작업을 받아들일 수 없는 경우이다.

내부 단편화는 작업에 필요한 공간보다 많은 공간을 할당 받음으로써 발생하는 내부의 사용 불가능한 공간

 

 

 

4) 가상메모리, 페이징, 세그먼테이션은 무엇인가요?

 

가상 메모리 - 메모리에 로드된 실행 중인 프로세스가 메모리가 아닌 가상의 공간을 참조해 마치 커다란 물리 메모리를 갖는 것처럼 사용할 수 있게 해주는 기법

 

 프로세스에서 사용하는 메모리 주소와 실제 물리적 메모리 주소는 다를 수 있음. 따라서 메모리 = 실제 + 가상 메모리라고 생각하면 안 된다.

메모리가 부족해서 가상 메모리를 사용하는 것은 맞지만, 가상메모리를 쓴다고 실제 메모리처럼 사용하는 것은 아니다. 실제 메모리 안에 공간이 부족하면, 현재 사용하고 있지 않은 데이터를 빼내어 가상메모리에 저장해 두고, 실제 메모리에선 처리만 하게 하는 것이 가상 메모리의 역할이다.

즉, 실제 메모리에 놀고 있는 공간이 없게 계속 일을 시키는 것. 이를 도와주는 것이 ‘가상 메모리’이다.

 

 

페이징 - 페이지 단위의 논리, 물리 주소 관리 기법이고 논리 주소 공간이 하나의 연속적인 물리 메모리 공간에 들어가야 하는 제약을 해결하기 위한 기법 논리 주소 공간과 물리 주소 공간을 분리해야 한다.변환을 위해서는 MMU 필요하며 특징으로 외부 단편화를 없앨 수 있다. 페이지가 클수록 내부 단편화도 커진다.

 

세그먼테이션 : 사용자/프로그래머 관점의 메모리 관리 기법. 페이징 기법은 같은 크기의 페이지를 갖는 것과는 다르게 논리적 단위로 나누므로 미리 분할하는 것이 아니고 메모리 사용할 시점에 할당됨.

 

Context Switching

  • 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의. 프로세스 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업. 한 프로세스의 문맥은 그 프로세스의 PCB에 기록됨.

 

MMU - 메모리 관리 장치 (CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이다.)

 

 

 

5) 뮤텍스, 세마포어의 차이점은 무엇인가요?

 

세마포어 - 운영체제에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호. 공유자원에 접근할 수 있는 최대 허용치만큼만 동시에 사용자 접근 가능 스레드들은 리소스 접근 요청을 할 수 있고, 세마포어는 카운트가 하나씩 줄어들게 되며, 리소스가 모두 사용 중인 경우 다음 작업은 대기를 하게 된다.

 

뮤텍스 - 상호배제, 제어되는 섹션에 하나의 스레드만 허용하기 때문에, 해당 세션에 접근하려는 다른 스레드들을 강제적으로 막음으로써 첫 번째 스레드가 해당 섹션을 빠져나올 때까지 기다리는 것이다. (대기열(queue) 구조라고 생각하면 됨)

 

차이점 - 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없고, 세마포어는 소유 불가능하지만, 뮤택스는 소유가 가능하며

동기화의 개수가 다르다.

 

 

 

6) 사용자 수준 스레드 vs 커널 수준 스레드 차이는 무엇인가요?

 

사용자 수준 스레드

장점 : context switching이 없어서 커널 스레드보다 오버헤드가 적다.( 스레드 전환 시 커널 스케줄러 호출할 필요가 없기 때문)

단점 : 프로세스 내의 한 스레드가 커널로 진입하는 순간, 나머지 스레드들도 전부 정지된다.( 커널이 스레드의 존재를 알지 못하기 때문)

 

커널 수준 스레드

장점 : 사용자 수준 스레드보다 효율적. 커널 스레드를 쓰면 멀티 프로세서를 활용할 수 있기 때문이다. 사용자 스레드는 cpu가 아무리 많아도 커널 모드의 스케줄이 되지 않으므로, 각 cpu에 효율적으로 스레드를 배당할 수가 없음.

단점 : context swithching이 발생함. 이 과정에서 프로세서 모드가 사용자 모드와 커널 모드 사이를 움직이기 때문에 많이 돌아다닐수록 성능이 떨어지게 된다.

 

 

 

7) fork()와 vfork()의 차이점은 무엇인가요?

 

fork()

부모 프로세스의 메모리를 복사해서 사용한다.

 

vfork()

부모 프로세스와의 메모리를 공유한다. 복사하지 않기 때문에 fork() 보다 생성 속도가 빠름. 하지만 자원을 공유하기 때문에 자원에 대한 race condition이 발생하지 않도록 하기 위해 부모 프로세스는 자식 프로세스가 exit 하거나 execute가 호출되기 전까지 block 된다.

 

Race condition

두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 공용 데이터에 대한 접근이 순서에 따라 실행 결과가 달라지는 상황.

Race Condition이 발생하게 되면, 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없음. 따라서 이러한 상황은 피해야 하며 상호배제나 임계구역으로 해결이 가능하다.

 

 

 

8) 리눅스에서 시스템 콜과 서브루틴의 차이는 무엇인가요?

 

우선 커널은 하드웨어를 둘러싸고 있다. 즉, 커널은 하드웨어를 제어하기 위한 일종의 API와 같은데 서브루틴은 우리가 프로그래밍할 때 사용하는 대부분의 api를 얘기하는 것이다.

 

ex) stdio.h 에 있는 printf나 scanf

      string.h에 있는 strcmp나 strcpy

 

서브루틴시스템 콜을 호출하고, 시스템 콜이 수행한 결과를 서브루틴에 보내면 시스템 콜 호출 시, 커널이 호출되고 커널이 수행한 임의의 결과 데이터를 다시 시스템 콜로 보냄. 

(실무로 사용할 둘의 차이는 없다고 한다.)

 

< Word Study >

 

컴파일 : 프로그램을 생성하기 위해 개발자는 첫째로 소스코드를 작성하고 컴파일이라는 과정을 통해 기계어코드로 변환 되어 실행 가능한 프로그램이 되며, 이러한 편집 과정

 

런타임 : 컴파일과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 때

 

프로세스 : 실행중인 프로그램, 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 된다.

 

쓰레드 : 프로세서는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있으며 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다.

 쓰레드는 프로세스 내에서 각각 Stack만 할당받고 code, Data, Heap 영역은 공유된다. 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소공간이나 자원들과 같은 프로세스 내에 스레드끼리 공유하면서 실행된다. 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다.

 

Seriallization : 객체의 상태 혹은 데이터 구조를 기록할 수 있는 포맷으로 변환해줌. 나중에 재구성 할 수 있게 자바 객체를 JSON으로 변환해주거나 JSON을 자바 객체로 변환해주는 라이브러리

 

JIT(Just-in-Time) 컴파일러 : 바이트코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램

'Tech Interview > Interview' 카테고리의 다른 글

5. 질문 (웹 브라우저에 URL 전체 동작과정)  (0) 2024.03.09
4. 질문 (Middleware)  (0) 2023.12.06
3. 질문 (Proxy & SpringBoot)  (1) 2023.11.30
1. JPA 소개 & 영속성 관리  (1) 2023.11.30
2. 질문  (0) 2023.11.27
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.