CS스터디 - 운영체제

최민수·2023년 9월 26일
0

CS 전공지식

목록 보기
36/36

0924_Process&Thread

Q. Process를 간단히 설명해 주세요.

실행 파일 형태로 존재하던 프로그램이 메모리 에 적재되어 CPU 를 할당받아 실행되는 것을 process라고 합니다.

💡 면접에서 프로세스 설명에 대한 질문이 나오면 메모리와 CPU 관점으로 설명하는 것이 좋다.

  1. 메모리 관점

메모리는 CPU 가 직접 접근할 수 있는 컴퓨터의 기억 장치.

따라서, 프로그램이 CPU에서 실행되려면 메모리에 적재된 상태여야만 함.

프로세스에 할당되는 메모리 공간은 크게 4개 영역으로 이루어져 있음.

Code, Data, Stack, Heap.

각 프로세스마다 독립적으로 할당을 받음.

Code 영역: 말 그대로 프로그램의 코드가 컴퓨터가 읽을 수 있는 기계어 형태로 바뀌어 저장되는 영역

Data 영역: 전역 변수, static 변수 등을 저장하는 영역

Heap 영역: 동적 할당(malloc) 하는 메모리 영역

Stack 영역: 지역 변수, 함수 호출 시 사용되는 매개 변수 등을 저장하는 임시 메모리 영역

  1. CPU 관점

    CPU가 어떤 작업을 수행할지에 대한 정보는 PC(Program Counter) 레지스터 에 저장되어 있음.

    따라서 PC 가 가리키는 주소가 프로세스의 code 영역이라면 그것이 프로세스가 실행된다는 의미임.

⭐️ Q) Multi process 에 대해서 설명해 주세요.

멀티 프로세스란 2개 이상의 프로세스가 동시에 실행되는 것을 말합니다.

여기서, 동시에 라는 말은 동시성(concurrency) 와 병렬성(parallelism) 두 가지를 의미하는데

동시성 → CPU core가 1개일 때, 여러 프로세스를 짧은 시간동안 번갈아 가면서 연산을 하는 time sharing system 으로 실행되는 것.

병렬성 → CPU core가 여러개일 때, 각각의 코어가 각각의 프로세스를 실제로 연산함으로써 동시에 실행되는 것.

즉,

동시성은 싱글 코어 입장에서, 아주 빠르게 작업들을 실행시켜 동시에 실행되는 것 같아 보이게 하는 것이고,

병렬성은 멀티 코어 입장에서, 실제로 동시에 여러 작업이 처리 되는 것.

💡 면접에서는 병렬성에 대한 깊은 질문은 거의 물어보지 않는다.

따라서 동시성에 대해서 잘 설명할 수 있어야 한다.

여기서는 멀티프로세스가 동시성을 통해 어떻게 작동되는지 원리를 잘 이해하는게 포인트다.

설명해야 될 키워드에는 time sharing 시스템을 시작으로 , 컨텍스트, PCB, 컨텍스트 스위칭, 프로세스의 메모리 영역이 있다.

다시 멀티 프로세스 질문으로 돌아가면,

멀티 프로세스란 2개 이상의 프로세스가 동시에 실행되는 것을 말하는데, 이 때 프로세스들은 메모리와 CPU를 공유하게 됩니다.

메모리의 경우에는 RAM 에 각자 메모리 영역을 차지하여 적재되어 있으면 되지만,

싱글코어 CPU의 경우에는 매 순간 하나의 작업만 연산할 수 있음.

따라서 PC 레지스터의 값을 바꿔가면서 매우 빠른 처리 속도를 이용해 수 ms 동안 여러 프로세스들을 번갈아 실행시켜 사용자 입장에서는 여러 프로그램이 동시에 실행되는 것처럼 보임.

이처럼 CPU의 작업시간을 여러 프로세스들이 조금씩 나눠쓰는 시스템을 time sharing 시스템이라고 함.

이렇게 되면 이전에 어디까지 어느 프로세스에서 명령을 수행했는지에 대한 정보가 필요하게 되는데, 그걸 컨텍스트라고 함. 이런 컨텍스트 정보들은 PCB(Process Control Block) 에 저장이 됨.

PCB?

PCB는 간단하게 말하면 운영체제가 프로세스를 표현한 자료구조 임.

프로세스 상태, PC, 레지스터 값 등 프로세스의 중요한 정보를 담고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택에 위치함.

커널 스택에 위치하는 이유는 보호를 받으면서도 커널 영역 안에서 비교적 접근하기가 편리하기 때문이라고 함.

따라서 한 프로세스에서 다른 프로세스로 CPU 제어권을 넘겨주는 것을 컨텍스트 스위칭이라 하고,

이전 프로세스의 PCB와 새로운 프로세스의 PCB 를 저장하고 읽어서 보관된 상태를 불러오는 과정을 통해 싱글코어에서 멀티 프로세스 시나리오가 가능해지는 것입니다.

⭐️ Q) Multi Thread 에 대해서 설명해 주세요.

멀티 스레드란 하나의 프로세스가 동시에 여러 개의 일을 수행할 수 있도록 해주는 것입니다.

멀티 스레드에서는 한 프로세스 내에 여러 개의 스레드가 존재하고, 각 스레드들은 스택 영역을 제외한 나머지 code, data, heap 영역을 공유하고 있습니다.

스택 영역을 공유하지 않는 이유는 하나의 프로세스 내에서 독립적인 기능을 각자 수행해야 하기 때문임.

즉, 독립적으로 함수를 호출해야 하기 때문에 스택 메모리는 각자 필요함.

마찬가지 이유로 PC 레지스터도 독립적인 실행을 위해 각자 필요함.

💡 이따가 질문으로 나오겠지만, 멀티 프로세스와 멀티 쓰레드가 어떻게 다른 개념인지 생각해보는 것이 면접 팁!

⭐️ Q) Multi Process 와 Multi Thread 를 비교 설명해 주세요.

💡 어떤 상황을 가정하고 이런 질문을 하는 걸까?

하나의 프로그램을 멀티 프로세스로 짤건지, 멀티 쓰레드로 짤건지를 비교해달라는 질문이다.

예를 들어, 유튜브에서도 영상이 나오는 작업, 댓글을 쓰는 작업, 등등 여러 작업이 있는데

이 작업들을 모두 분리해서 프로세스로 설계해 멀티 프로세스로 짜는 것과, 하나의 프로세스로 설계하고 안에 여러 개의 쓰레드를 설계해 짜는 것을 비교해 달라는 의도이다.

답변에서의 포인트는 두 방법 모두 동시에 여러 작업을 수행한다는 측면에서 공통점이 있기 때문에,

“어떤 상황에서 멀티 프로세스가 유리하고, 어떤 상황에서는 멀티 스레드가 유리하다”는 식으로 답을 하는게 좋음.

메모리 구분이 필요할 때는 멀티 프로세스가 유리하다.

반면에 컨텍스트 스위칭이 자주 일어나고 데이터 공유가 빈번한 경우, 그리고 자원을 효율적으로 사용해야 하는 경우는 멀티 스레드를 사용하는 것이 유리하다.

이 두가지 내용 안에서 설명을 하도록 해보자.

멀티 프로세스의 컨텍스트 스위칭 → 새로운 PCB를 참조해 초기화 과정을 진행해야 하기 때문에 느리고 오버헤드가 크다.

멀티 스레드의 컨텍스트 스위칭 → 메모리 영역 공유하고 있기 때문에 멀티 프로세스의 컨텍스트 스위칭보다 빠르고 통신으로 인한 오버헤드도 더 적다. 또한 메모리 공간과 시스템 자원 소모가 준다.

하지만, 자원 공유로 인한 동기화 문제가 발생할 수 있음.

따라서 비교 질문에 대한 답을 정리하면)

  1. 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간과 CPU 시간을 차지하고 컨텍스트 스위칭이 더 빠르다. (스위칭 시 메모리를 초기화할 필요가 없기 때문에)
  2. 멀티 스레드는 동기화 문제의 가능성이 존재하고 하나의 스레드에 문제가 발생하면 전체 스레드에 영향을 줄 수 있음.
  3. 반면 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높음.

⭐️ 멀티 프로세스 환경에서 프로세스간 데이터를 어떻게 주고 받을까요?

원칙적으로 프로세스는 독립적인 주소 공간을 갖기 때문에 다른 프로세스를 참조할 수 없음.

하지만 운영체제는 프로세스 간 자원접근 매커니즘인 프로세스 간 통신(IPC) 를 제공하여 경우에 따라 이용할 수 있다.

IPC 방법에는 파이프, 파일, 소켓, 공유메모리 등의 방법이 존재함.

💡 멀티 스레드와 다르게 멀티 프로세스의 특징은 데이터 공유를 하지 않는다는 점이었기 때문에 면접에서 자주 물어봄.

따라서 IPC기법에 대해 자세히 알 필요가 있는데, 크게 공유메모리 모델 vs 메세지 전달 모델로 나뉨. 이 둘의 장단점을 중심으로 이해할 것.

공유 메모리

프로세스가 공유 메모리 할당 요청을 커널에게 보내면, 커널은 공유 메모리 공간을 따로 할당해 줍니다. 즉, 프로세스의 주소 공간의 일부를 공유하는 방식임.

이 공유 메모리 영역이 구축된 이후에는 모든 접근이 일반적인 메모리 접근으로 취급되기 때문에 이후부터는 커널의 도움 없이도 각 프로세스들이 해당 메모리 영역에 접근할 수 있음.

하지만 여전히 동시에 같은 메모리 위치에 접근하면 일관성 문제가 발생할 수 있어 동기화 문제에 대한 책임은 사용자에게 있다.

메세지 전달

system call 호출을 통해 구현되는 방식.

커널에게 send, receive 두 가지 연산을 제공받고 메세지를 보내고 받아올 때 사용하는 방식으로 진행됨.

따라서 메모리 공유보다 속도가 느림. 하지만 커널에서 동기화를 제공해준다는 장점이 있다.

그러나 역시 느리기 때문에 적은 양의 데이터를 교환하는 시나리오에서 효과가 있다는 특징이 있음.

대표적인 구현 방법으로는 파이브, 소켓, 메세지 큐가 있음.


⭐️ 멀티 프로세스/스레드 환경에서 동기화 문제를 어떻게 해결하나요?

💡 질문에 답하기 전에, 우선 동기화 문제가 무엇인지 정확히 아는 것이 답변에 중요함.

동기화 문제

동기화 문제란 서로 다른 스레드가 메모리 영역을 공유하기 때문에 일어나는 문제로, 여러 스레드가 동일한 자원에 동시에 접근하는 경우 엉뚱한 값을 읽거나 수정할 수 있는 문제이다.

스레드 2개가 count 변수를 증가시키는 시나리오를 생각해보면, count 변수를 가져오고, 가져온 값에 1을 증가시키고, 변경된 값을 저장하는 3개의 atomic operation으로 나뉠 수 있는데

첫번째 스레드의 변경된 값이 먼저 저장되고 두번째 스레드가 그 값을 가져와 연산을 할 수도 있고

둘 다 아직 변경되지 않은 값을 가져와 각각 1을 더한 다음 그대로 저장하는 상황이 생길 수도 있음.

즉, 실행 결과가 보장되지 않고 접근이 발생한 순서에 따라 그 값이 달라질 수 있는 상황이 생김. 이를 경쟁 상황 (race condition) 이라고 하며 동기화 문제가 발생했다고 한다.

따라서 한 번에 하나의 프로세스나 스레드가 특정 자원에 접근하고 조작할 수 있도록 하는 장치가 필요하게 되고 그 문제를 해결하기 위한 기법에 mutex, semaphore 가 있다는 흐름으로 이해해야 함.

다시 질문으로 돌아와 답을 하면,

Mutex

뮤텍스란 1개의 스레드만이 공유 자원에 접근할 수 있도록 해서, 경쟁 상황을 방지하는 기법임.

공유 자원을 점유하는 스레드가 lock을 걸면, 다른 스레드는 unlock 상태가 될 때까지 해당 자원에 접근할 수 없음. 이 때 lock을 거는 코드의 부분을 임계영역 (critical section) 이라고 함.

Semaphore

세마포어란 특정 개수 S개의 스레드만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법.

자원에 접근할 때는 S— 연산을 수행해 값을 감소시키고 자원을 풀어줄때는 S++ 연산으로 증가시킴.

이 때 이 값이 0 이면 모든 자원이 사용 중임을 의미하고, 이후에 자원을 사용하려는 프로세스는 이 값이 0보다 커질 때까지 block 상태가 되는 식으로 동작.

하지만 이 두 방법 모두 busy waiting(즉, block 된 상태가 풀릴 때까지 계속 확인하면서 기다림) 방법을 사용하기 때문에 다른 프로세스가 사용할 수 있는 CPU를 낭비할 수 있다는 단점이 존재함.

Q)교착 상태 (Deadlock) 에 대해서 간단히 설명해 주세요.

두 개 이상의 스레드가 각자 다른 스레드가 점유하고 있는 자원을 서로 기다리고 4가지 조건을 만족할 때, 무한 대기에 빠지는 상황을 교착상태라고 합니다.

4가지 조건에는 상호 배제, 점유 대기, 비선점 방식, 순환 대기 이렇게 4가지 조건이 있습니다.

또 deadlock 문제를 해결하는 방법에는 무시, 예방, 회피, 탐지 후 회복 이렇게 4가지 방법이 있습니다.

💡 면접에서 deadlock 질문이 나온다면, 데드락이 발생하기 위한 조건과 해결 방법을 묻는 것임.

따라서, 발생 조건 4가지, 해결 방법 4가지를 중심으로 설명하면 좋다.

데드락 발생 조건

상호 배제: 동시에 한 스레드만 자원을 점유할 수 있는 상황이다.

점유 대기: 스레드가 자신의 자원을 보유한 상태에서 원하는 자원을 추가적으로 기다리는 상황이다.

비선점 방식: 다른 스레드가 가지고 있는 자원을 강제로 가져올 수 없는 상황이다.

순환 대기: 대기 중인 스레드들이 순환 형태로 자원을 대기하는 상황이다.

해결 방법

profile
CS, 개발 공부기록 🌱

0개의 댓글