1. 프로세스와 스레드를 비교하여 설명해주실 수 있을까요?

프로세스와 스레드는 컴퓨터에서 프로그램을 실행하는데 사용되는 기본 단위입니다. 

프로세스(Process):

  • 프로세스는 실행 중인 프로그램의 인스턴스로, 컴퓨터에서 독립적으로 실행되는 프로그램 단위입니다.
  • 각 프로세스는 독립된 메모리 공간(코드, 데이터, 스택, 힙 영역 등)을 가지며, 프로세스는 이 메모리 공간을 접근하거나 수정할 수 있습니다. 프로세스는 하나 이상의 스레드를 가질 수 있으며, 이러한 스레드들은 프로세스의 메모리와 자원을 공유합니다.
  • 프로세스 간의 메모리 공간은 독립적이므로, 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 미치지 않습니다.

스레드(Thread):

  • 스레드는 프로세스 내에서 실행되는 하나의 실행 단위로, 프로세스의 메모리 공간을 공유합니다.
  • 이 공유된 메모리 공간 때문에, 스레드는 같은 프로세스 내의 다른 스레드와 정보를 쉽게 공유할 수 있습니다.
  • 하지만 이것은 스레드간 데이터 동기화를 주의깊게 관리해야한다는 단점도 생깁니다.
  • 또한 하나의 스레드에서 발생한 오류가 전체 프로세스에 영향을 미칠 수 있습니다.

결국, 프로세스와 스레드 모두 실행 중인 프로그램의 단위이지만, 스레드는 프로세스 내에서 실행되며 동일한 메모리 공간을 공유하는 반면, 프로세스는 독립적인 메모리 공간을 가지고 있습니다. 이러한 차이점은 멀티태스킹과 병렬 컴퓨팅 구현에서 중요한 역할을 합니다.

 

프로세스는 운영체제로부터 자원을 할당받은 작업의 단위입니다. 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위입니다. 둘의 가장 큰 차이는 프로세스는 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는데 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해준다. 그러나 스레드는 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 됩니다. 만약 한 프로세스가 실행하다가 오류가 발생하면 프로세스가 강제종료된다면 다른 프로세스에는 영향을 주지 않지만 스레드는 오류로 종료가 된다면 메모리 영역을 공유하고있는 스레드 모두 강제로 종료된다는 중요한 차이점이 존재합니다.

 

프로세스란 실행 중인 프로그램으로, 1개의 CPU가 한 번에 한 프로세스만을 실행할 수 있고 프로세스 간 데이터 접근이 불가하다는 특징이 있다. 스레드란 한 개의 프로세스 안에 여러 개의 프로세스를 동시에 생성 및 실행 가능한 구조다. 프로세스 안에서는 모든 스레드끼리 데이터에 접근이 가능하다.프로세스를 한꺼번에 여러 개 실행하는 것처럼 보이기 위해 CPU는 레지스터의 도움을 받아서 사용자가 느끼지 못할 정도로 빠른 속도로 프로세스를 바꾸어 가며 실행한다. 스레드는 그럴 필요가 없다. 한 프로세스 내에서 여러 프로그램을 실행 가능한 구조이기 때문이다.

 

어떤 작업을 위해 실행할 수 있는 파일인 프로그램이 메모리에 올라와 실행되고 있는 것을 프로세스라고 한다. 프로세스는 독립된 메모리 영역을 갖고 있으며 하나의 프로세스 내에서 실제로 작업을 수행하며 동시에 여러작업을 수행하도록 할 수 있게 만드는 주체가 바로 스레드이다. 이 때 프로세스와 스레드가 cpu를 나눠 쓰는 것을 멀티태스킹이라고 하며, 한 프로세스에 두 개 이상의 스레드가 존재하면 멀티스레딩, 사용하는 코어가 두 개 이상이면 멀티프로세싱 이라고 한다.

 

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위입니다. 스레드는 할당 받은 자원을 이용하는 실행의 단위이며, 프로세스 내에 여러 개가 생길 수 있습니다. 어플리케이션은 하나의 프로세스이고, 그 안에서 처리되는 작업들이 스레드가 됩니다.

 

2. 프로세스와 스레드의 차이점을 설명해보세요.

프로세스(Process)와 스레드(Thread)는 모두 컴퓨터에서 실행되는 작업의 단위입니다. 그러나 둘 사이에는 몇 가지 주요한 차이점이 있습니다.

  1. 독립성: 프로세스는 운영 체제에서 독립적으로 실행되는 개별적인 작업 단위입니다. 각 프로세스는 고유한 메모리 공간과 자원을 할당받아 사용합니다. 반면에 스레드는 프로세스 내부에서 실행되는 작업의 단위로, 부모 프로세스의 메모리 공간과 자원을 공유하며 실행됩니다.
  2. 메모리 공유: 프로세스들은 각각 독립된 메모리 공간을 가지며, 한 프로세스의 메모리 공간은 다른 프로세스로부터 보호됩니다. 그러나 스레드는 같은 프로세스 내부에서 실행되므로, 스레드끼리 메모리 공간(Heap 영역 등)을 공유하게 됩니다.
  3. 생성과 종료: 프로세스를 생성하거나 종료하는 것은 상당히 많은 자원을 소모하는 작업입니다. 반면에 스레드의 생성 및 종료는 상대적으로 더 빠르고 자원을 적게 소모합니다.
  4. 컨텍스트 스위칭: 프로세스간 컨텍스트 스위칭은 많은 시간과 자원을 소모합니다. 그러나 스레드간 컨텍스트 스위칭은 더 빠르며 효율적입니다. 이는 스레드가 같은 프로세스 내부에서 메모리를 공유하기 때문입니다.
  5. 통신: 프로세스 간 통신(IPC)는 복잡한 메커니즘을 통해 이루어지며, 상대적으로 많은 자원을 소모합니다. 반면에 스레드 간 통신은 프로세스 내부에서 메모리를 공유하기 때문에 더 쉽고 빠릅니다.

따라서, 프로세스와 스레드의 선택은 실행하려는 작업의 특성과 요구 사항에 따라 달라집니다. 여러 작업이 서로 독립적이고 각각 다른 자원을 사용해야 하는 경우에는 프로세스를, 작업이 메모리와 자원을 공유하며 효율적으로 실행되어야 하는 경우에는 스레드를 사용하는 것이 좋습니다.

 

3. 멀티프로세싱과 멀티스레딩의 차이점에 대해 설명해주세요.

멀티프로세싱과 멀티스레딩은 컴퓨터 시스템에서 동시성을 구현하는 두 가지 주요한 방법입니다. 둘 다 여러 작업을 동시에 처리하도록 설계되어 있지만, 그 방식과 세부적인 특성에는 차이가 있습니다.

  1. 멀티프로세싱(Multiprocessing) 여러 프로세서(또는 다중 코어 시스템에서의 여러 코어) 동시에 여러 프로세스를 실행하도록 하는 방식입니다. 프로세스는 독립적인 메모리 공간을 가지며, 프로세서가 프로세스를 처리합니다. 멀티프로세싱은 프로세스가 독립적으로 실행되기 때문에 병렬성이 높고, 하나의 프로세스가 실패해도 다른 프로세스에 영향을 주지 않는 안정성을 제공합니다. 그러나 프로세스 간의 통신과 동기화는 복잡하며 자원을 많이 소모합니다.
  2. 멀티스레딩(Multithreading) 단일 프로세스 내에서 여러 스레드를 동시에 실행하도록 하는 방식입니다. 이들 스레드는 프로세스의 메모리와 자원을 공유하며, 스레드는 프로세스 내의 특정 작업을 담당합니다. 멀티스레딩은 스레드 생성, 컨텍스트 스위칭 등에 소비되는 오버헤드가 적으며, 스레드 간의 통신과 동기화도 상대적으로 간단합니다. 하지만 스레드들이 같은 메모리 공간을 공유하기 때문에, 하나의 스레드에서 발생한 문제가 다른 스레드에 영향을 미칠 있습니다.

다중 프로세스와 다중 스레드는 데이터 처리 장소에 차이가 있습니다.

다중 프로세스는 여러 개의 독립적인 프로세스가 동시에 실행되는 것을 의미합니다. 각 프로세스는 자체적인 주소 공간을 가지고 있으며, 운영체제는 각 프로세스를 독립적으로 관리합니다. 따라서 각 프로세스는 데이터를 자체적으로 보유하고 처리하는 독립된 공간을 가지고 있습니다. 이는 각 프로세스 간의 데이터 공유가 어렵고, 프로세스 간의 통신은 별도의 메커니즘을 사용하여 이루어집니다.

다중 스레드는 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 것을 의미합니다. 스레드는 하나의 주소 공간을 공유하고, 각 스레드는 프로세스의 자원을 공유하여 작업을 수행합니다. 이는 스레드 간의 데이터 공유가 쉽고, 스레드 간의 통신은 메모리 공간을 통해 직접 이루어집니다. 따라서 스레드 간의 데이터 공유와 통신이 편리하며, 동시성 작업을 더 효율적으로 처리할 수 있습니다.

요약하면, 다중 프로세스는 프로세스가 독립된 공간을 가지고 데이터를 처리하고, 프로세스 간의 통신은 별도의 메커니즘을 사용합니다. 다중 스레드는 하나의 프로세스 내에서 스레드가 공유하는 주소 공간을 통해 데이터를 처리하고, 스레드 간의 통신은 메모리 공간을 직접 사용하여 이루어집니다.

https://www.youtube.com/watch?v=y60nIDJAyJQ&t=2s

 

4. 멀티프로그래밍을 구현할 때 CPU가 어떻게 콘텍스트 스위칭을 하는가

멀티프로그래밍에서 CPU는 프로세스 또는 스레드 간에 "콘텍스트 스위칭"을 수행하여 각각의 작업에 CPU 시간을 할당합니다. 이는 여러 프로세스 또는 스레드가 동시에 실행되는 것처럼 보이게 하는 주요 메커니즘입니다.

콘텍스트 스위칭은 다음과 같이 동작합니다:

  1. 현재 실행 중인 프로세스 또는 스레드의 상태(콘텍스트)를 저장합니다. 이 콘텍스트에는 프로그램 카운터, 레지스터 값, 스택 포인터 등의 정보가 포함됩니다.
  2. 이전에 중단된 다른 프로세스 또는 스레드의 콘텍스트를 CPU에 로드합니다. 이로써 해당 프로세스 또는 스레드는 중단되었던 지점부터 다시 실행을 시작할 수 있습니다.
  3. CPU는 새롭게 로드된 프로세스 또는 스레드를 실행합니다.

이런 식으로 CPU 여러 프로세스 또는 스레드 사이를 빠르게 전환하며, 프로세스 또는 스레드가 CPU 독점하고 있는 것처럼 보이게 합니다. 그러나 실제로는 프로세스 또는 스레드는 CPU 시간을 일정한 조각(타임 슬라이스)만큼만 할당받아 사용하게 됩니다. 이렇게 함으로써 CPU 여러 프로세스 또는 스레드를 동시에 실행하는 것처럼 보이게 됩니다.

 

5. 스레드의 문맥 교환(Context Switching)이란 무엇인지 설명해주세요.

문맥 교환(Context Switching)은 운영체제가 CPU의 제어권을 현재 실행 중인 스레드에서 다른 스레드로 넘기는 과정을 말합니다. 이는 운영체제의 스케줄러가 멀티태스킹을 지원하고, 여러 스레드가 동시에 실행될 수 있게 하기 위한 기본적인 메커니즘입니다.

스레드의 문맥 교환은 다음과 같이 이루어집니다:

  1. 현재 실행 중인 스레드의 상태를 저장합니다. 이 상태 정보는 프로그램 카운터, 레지스터 값, 스택 포인터 등이 포함된 스레드의 콘텍스트(Context)입니다.
  2. 다음으로 실행할 스레드의 콘텍스트를 CPU에 로드합니다.
  3. CPU는 새롭게 로드된 스레드를 실행합니다.

, 스레드의 문맥 교환은 하나의 스레드에서 다른 스레드로 제어를 넘기는 과정을 말합니다. 과정에서 스레드의 콘텍스트를 저장하고 로드하는 작업이 필요하며, 이로 인해 오버헤드가 발생할 있습니다. 따라서 문맥 교환은 효율적으로 이루어져야 시스템 성능을 최적화할 있습니다.

 

6. 프로세스와 스레드의 통신 방식에 대해 설명해주세요.

프로세스와 스레드의 통신 방식은 기본적으로 다릅니다.

  • 프로세스 간 통신 (Inter Process Communication, IPC): 프로세스 간 통신은 주로 운영체제가 제공하는 메커니즘을 사용합니다. 서로 독립적인 메모리 공간을 가진 프로세스들이 통신하기 위해서는 별도의 메커니즘을 통해야 합니다. 이러한 메커니즘에는 파이프라인, 메시지 큐, 공유 메모리, 소켓 등이 있습니다. 이러한 IPC 메커니즘을 통해 프로세스들은 데이터를 교환하거나 동기화할 수 있습니다.
    더보기

    "파이프라인", "메시지 큐", "공유 메모리", "소켓"은 모두 프로세스 간 통신(Inter-Process Communication, IPC)을 위한 방법입니다.

    1. 파이프라인 (Pipe): 파이프라인은 프로세스에서 다른 프로세스로 데이터를 전송하는 방법 하나입니다. 파이프라인은 일반적으로 '부모-자식' 관계에 있는 프로세스들 사이에서 사용됩니다. 파이프라인은 단방향 통신이며, 데이터는 FIFO(First-In-First-Out) 방식으로 전달됩니다.
    2. 메시지 (Message Queue): 메시지 큐는 프로세스 또는 스레드가 메시지의 형태로 데이터를 전송할 있도록 합니다. 메시지 큐는 파이프라인과 마찬가지로 FIFO 방식을 따르지만, 프로세스 간의 관계에 구애받지 않고 양방향 통신이 가능합니다.
    3. 공유 메모리 (Shared Memory): 공유 메모리는 이상의 프로세스가 동일한 메모리 공간을 공유하여 데이터를 주고받는 방식입니다. 공유 메모리를 통한 통신은 매우 빠르지만, 동시에 여러 프로세스가 메모리에 접근할 경우 데이터 일관성을 유지하기 위한 동기화가 필요합니다.
    4. 소켓 (Socket): 소켓은 네트워크 통신을 위한 인터페이스입니다. 프로세스 통신 뿐만 아니라, 다른 머신에 있는 프로세스와도 통신이 가능합니다. TCP/IP 프로토콜을 기반으로 데이터를 송수신합니다. 이는 인터넷을 통한 원격 프로세스 통신에 주로 사용됩니다.
  • 스레드 간 통신: 스레드는 같은 프로세스 내에서 동작하므로 동일한 메모리 영역을 공유합니다. 따라서 하나의 스레드가 변경한 메모리 상의 데이터는 다른 스레드에서도 접근 가능합니다. 이런 특성으로 인해 스레드 간의 통신은 메모리를 공유함으로써 이루어집니다. 하지만 이로 인해 동시성 문제가 발생할 수 있으며, 이를 해결하기 위해 뮤텍스(Mutex), 세마포어(Semaphore) 등의 동기화 기법을 사용합니다.
    더보기

    "뮤텍스(Mutex)"와 "세마포어(Semaphore)"는 여러 프로세스 또는 스레드가 공유 자원에 동시에 접근하는 것을 막는 동기화 기법입니다.

    1. 뮤텍스(Mutex, Mutual Exclusion): 뮤텍스는 한 번에 하나의 스레드만이 특정 코드 블록(임계 영역)을 실행할 수 있도록 하는 도구입니다. 만약 다른 스레드가 이미 뮤텍스를 소유하고 있다면, 다른 스레드는 그 스레드가 뮤텍스를 해제할 때까지 대기해야 합니다.
    2. 세마포어(Semaphore): 세마포어는 뮤텍스와 비슷하지만, 동시에 여러 스레드가 임계 영역을 실행할 수 있도록 허용하는 점이 다릅니다. 세마포어는 정수 값을 가지며, 이 값은 동시에 임계 영역에 접근할 수 있는 스레드의 최대 수를 의미합니다. 세마포어 값이 0이면, 모든 스레드는 세마포어 값이 증가할 때까지 대기해야 합니다.

    뮤텍스와 세마포어는 공유 자원에 대한 동시 접근을 제어하는 방식에서 차이가 있습니다.

    1. 뮤텍스(Mutex):

    뮤텍스는 바이너리 세마포어 또는 락(lock)으로 생각할 수 있으며, 오직 하나의 스레드만이 공유 자원을 점유할 수 있습니다.

    뮤텍스는 보통 단일 프로세스 내의 스레드들 사이의 동기화에 사용됩니다.

    예를 들어, 파일 시스템에 쓰는 작업이나 공유된 메모리에 쓰는 작업 등에 뮤텍스를 사용할 수 있습니다.

    1. 세마포어(Semaphore):

    세마포어는 뮤텍스와 다르게 하나 이상의 실행 스레드를 허용합니다. 세마포어의 값은 동시에 접근할 수 있는 최대 스레드 수를 나타냅니다.

    세마포어는 프로세스 간 동기화에도 사용될 수 있습니다.

    예를 들어, 공유 자원의 개수가 한정적인 경우(예: 공유 메모리 블록, 시스템에 있는 프린터나 파일 등)에 세마포어를 사용할 수 있습니다.

    기본적으로, 뮤텍스는 오직 하나의 스레드만이 공유 자원을 점유할 있게 하는 반면, 세마포어는 여러 스레드(또는 프로세스) 공유 자원에 동시에 접근할 있게 합니다.

따라서 프로세스 통신은 운영체제의 지원을 받아야 하며, 상대적으로 복잡하고 오버헤드가 발생할 있습니다. 반면 스레드 통신은 메모리를 공유하므로 빠르고 간단하지만, 동시성 제어가 필요합니다.

 

7. 프로세스와 스레드의 메모리 관리는 어떻게 이루어지는지 설명해주세요.

프로세스 메모리 관리:

  • 프로세스는 독립적인 메모리 공간을 가지고 있습니다. 이 메모리 공간은 일반적으로 텍스트(코드), 스택, 힙, 데이터 섹션 등으로 구성됩니다.
  • 각 프로세스는 서로의 메모리 공간에 직접 접근할 수 없습니다. 이는 프로세스 간에 메모리를 보호하고, 한 프로세스의 잘못된 동작이 다른 프로세스에 영향을 주지 않도록 합니다.
  • 프로세스 간에 데이터를 공유하려면 Inter-Process Communication(IPC) 기법을 사용해야 합니다. 예를 들면 파이프라인, 메시지 큐, 공유 메모리, 소켓 등이 있습니다.

스레드 메모리 관리:

  • 스레드는 프로세스 내에서 실행되는 가벼운 실행 단위로, 프로세스의 메모리 공간을 공유합니다.
  • 스레드는 자신만의 스택을 가지지만, 프로세스의 힙 메모리를 공유합니다. 이로 인해, 같은 프로세스에 속한 스레드 간에는 데이터를 공유하기 쉽습니다.
  • 그러나 이는 스레드 간에 동기화 문제를 야기할 수 있습니다. 한 스레드가 공유 데이터를 수정하는 동안 다른 스레드도 동일한 데이터에 접근하려고 시도하면 문제가 발생할 수 있습니다. 이런 문제를 방지하기 위해 뮤텍스, 세마포어 등의 동기화 기법을 사용합니다.

8. 프로세스와 스레드 중 어느 것을 사용해야 하는지 결정하는 기준은 무엇인가요?

  1. 자원 공유: 스레드는 같은 프로세스의 메모리 공간을 공유하기 때문에, 데이터를 공유해야 하는 작업에는 스레드가 적합합니다. 반면에 프로세스는 독립적인 메모리 공간을 가지므로, 작업이 서로 독립적으로 실행되어야 하거나 데이터 공유가 필요하지 않은 경우에 적합합니다.
  2. 오버헤드와 성능: 스레드는 프로세스보다 가볍기 때문에, 스레드를 생성하고 종료하는 드는 오버헤드가 작습니다. 따라서 빠른 반응성이 요구되는 작업에는 스레드가 적합할 있습니다. 그러나 공유 메모리 때문에 동기화 문제를 해결해야 필요가 있으며, 이는 추가적인 오버헤드를 초래할 있습니다.
  3. 안정성: 프로세스는 독립적인 메모리 공간을 가지므로, 프로세스에서 오류가 발생해도 다른 프로세스에는 영향을 주지 않습니다. 따라서 안정성이 중요한 작업에는 프로세스를 사용하는 것이 좋을 있습니다. 반면에 스레드에서는 스레드에서 오류가 발생하면 같은 프로세스의 다른 스레드에도 영향을 있습니다.
  4. 통신 비용: 프로세스 통신(IPC) 비교적 오버헤드가 크지만, 스레드 통신은 공유 메모리를 통해 쉽고 빠르게 이루어집니다.

9. 스레드 동기화란 무엇인지 설명해주세요. 그리고 이를 위해 어떤 방법들이 사용되는지 설명해주세요.

스레드 동기화는 여러 스레드가 공유 자원에 동시에 접근하는 것을 제어하는 방법입니다. 스레드 동기화가 없다면, 동시에 공유 자원을 수정하는 여러 스레드로 인해 데이터 불일치 문제가 발생할 수 있습니다. 이를 방지하기 위해 스레드 동기화 기법을 사용합니다.

다양한 스레드 동기화 기법들이 있습니다:

  1. 뮤텍스(Mutex): 뮤텍스는 Mutual Exclusion의 줄임말로, 한 번에 하나의 스레드만 공유 자원에 접근할 수 있도록 하는 도구입니다. 뮤텍스는 잠금(lock)과 잠금 해제(unlock) 두 가지 연산을 제공합니다. 스레드는 공유 자원에 접근하기 전에 뮤텍스를 잠그고, 사용 후에는 잠금을 해제합니다. 만약 다른 스레드가 뮤텍스를 잠그고 있다면, 그 스레드가 잠금을 해제할 때까지 기다려야 합니다.
  2. 세마포어(Semaphore): 세마포어는 뮤텍스와 비슷하게 동작하지만, 한 번에 여러 스레드가 공유 자원에 접근할 수 있도록 허용합니다. 세마포어는 카운터와 두 가지 연산(wait, signal)을 가지며, 카운터는 동시에 자원에 접근할 수 있는 스레드의 수를 의미합니다.
  3. 모니터(Monitor): 모니터는 객체 지향 프로그래밍에서 사용되는 동기화 메커니즘으로, 특정 객체에 대한 동시 접근을 제어합니다. 모니터 내의 메서드는 한 번에 하나의 스레드만 실행할 수 있습니다.
  4. 컨디션 변수(Condition Variable): 컨디션 변수는 스레드가 특정 조건을 기다리는 동안 그 스레드를 잠재워 다른 스레드가 실행될 수 있게 하는 도구입니다.
  5. 바캉트(Bakery Algorithm) 등의 알고리즘: 이러한 알고리즘은 스레드 간의 동기화를 위해 사용됩니다.

스레드 동기화는 공유 자원에 대한 동시 접근 문제를 해결하는 데 매우 중요하지만, 사용하는 방법에 따라 성능에 큰 영향을 줄 수 있으므로 주의해야 합니다. 특히, 뮤텍스, 세마포어 등의 잠금 메커니즘이 과도하게 사용될 경우 데드락(deadlock)과 같은 문제가 발생할 수 있습니다. 데드락은 두 개 이상의 프로세스나 스레드가 서로 대기하는 상태로, 이러한 상태는 시스템의 성능을 저하시키고 자원을 낭비할 수 있습니다.

그 외에도 라이브락(livelock), 스타베이션(starvation) 등의 문제도 발생할 수 있습니다. 라이브락은 프로세스나 스레드가 진행하지 못하면서 계속 자원을 소모하는 상황을, 스타베이션은 특정 프로세스나 스레드가 계속해서 자원을 얻지 못하는 상황을 말합니다.

따라서, 스레드 동기화를 구현할 때는 이러한 문제를 주의하면서, 공유 자원에 대한 동시 접근을 제어하고, 시스템의 성능과 효율성을 유지하도록 설계해야 합니다.

 

10. 프로세스 스케줄링에 대해 설명해주세요. 그리고 이와 관련하여 CPU 스케줄링 알고리즘이 어떻게 작동하는지 설명해주세요.

프로세스 스케줄링은 운영체제가 여러 프로세스를 관리하면서 CPU 자원을 효율적으로 분배하는 방법입니다. 프로세스 스케줄러는 CPU가 할당되는 순서를 결정하며, 이는 시스템의 전반적인 성능과 효율성에 큰 영향을 미칩니다.

프로세스 스케줄링 알고리즘은 다양한 종류가 있습니다. 각 알고리즘은 다른 목표를 가지고 설계되며, 서로 다른 종류의 작업에 최적화되어 있습니다. 대표적인 CPU 스케줄링 알고리즘으로는 다음과 같은 것들이 있습니다:

  1. First-Come, First-Served (FCFS): 가장 간단한 스케줄링 알고리즘입니다. 프로세스가 요청된 순서대로 CPU 할당받습니다.
  2. Shortest Job Next (SJN) 또는 Shortest Job First (SJF): 가장 짧은 시간이 소요되는 작업부터 CPU 할당받습니다. 알고리즘은 평균 대기 시간을 최소화하는데 효과적이지만, 짧은 작업을 우선시하기 때문에 작업이 계속 대기해야 하는 "스타베이션" 문제가 발생할 있습니다.
  3. Priority Scheduling: 프로세스에 우선순위를 부여하고, 높은 우선순위를 가진 프로세스부터 CPU 할당합니다. 알고리즘은 중요한 작업을 빠르게 처리할 있지만, 낮은 우선순위의 작업이 계속 대기해야 하는 스타베이션 문제가 발생할 있습니다.
  4. Round Robin (RR): 프로세스에 동일한 시간 할당량(quantum) 부여하고, 순환하면서 CPU 할당합니다. 알고리즘은 공정성을 유지하면서 다수의 프로세스를 효과적으로 처리하는데 적합합니다.
  5. Multilevel Queue Scheduling: 프로세스를 여러 큐에 분류하고, 큐에 대해 다른 스케줄링 알고리즘을 적용합니다. 예를 들어, 시스템 프로세스를 위한 , 인터랙티브 작업을 위한 , 배치 작업을 위한 등을 따로 관리할 있습니다.

11. 동시성(Concurrency)과 병렬성(Parallelism)의 차이점을 설명하고, 이것이 프로세스와 스레드에 어떻게 영향을 미치는지 

동시성(Concurrency)와 병렬성(Parallelism)은 컴퓨팅 작업이 어떻게 실행되는지를 설명하는 두 개념입니다.

  • 동시성(Concurrency)은 두 개 이상의 작업이 겹쳐서 실행되는 것을 의미합니다. 이 경우, 각 작업은 서로 다른 시간에 시작되고 종료될 수 있지만, 시간적으로 겹치는 부분이 있습니다. 이는 단일 프로세서에서 멀티스레딩을 이용해 여러 작업을 번갈아가며 실행하는 것과 같습니다. 즉, 동시에 진행되는 것처럼 보이지만 실제로는 한 번에 하나의 작업만 처리합니다.
  • 병렬성(Parallelism)은 두 개 이상의 작업이 동시에 실행되는 것을 의미합니다. 이 경우, 각 작업은 동시에 시작되고 종료될 수 있습니다. 이는 여러 프로세서를 사용하여 동시에 여러 작업을 실행하는 것과 같습니다.

프로세스와 스레드의 관점에서 볼 때, 이 두 개념은 아래와 같이 적용됩니다.

  • 동시성은 주로 하나의 CPU 코어에서 여러 스레드를 동시에 실행할 수 있는 멀티스레딩 환경에서 사용됩니다. 이 경우, CPU는 각 스레드 간에 빠르게 전환하면서 작업을 수행함으로써 동시에 실행되는 것처럼 보이게 합니다. 이를 통해 각 스레드는 독립적으로 실행되면서도 서로 협력하여 복잡한 작업을 수행할 수 있습니다.
  • 병렬성은 여러 CPU 코어를 사용하는 멀티프로세싱 환경에서 사용됩니다. 이 경우, 각 프로세스(또는 스레드)는 독립적인 CPU 코어에서 동시에 실행되므로, 더 빠른 작업 처리가 가능합니다. 병렬 처리는 대량의 데이터를 처리하거나 복잡한 계산을 수행하는 등의 상황에서 효율적입니다.

개념은 상황에 따라 선택적으로 사용되며, 종종 함께 사용되기도 합니다. 예를 들어, 여러 코어를 가진 시스템에서는 코어에서 여러 스레드를 동시에 실행함으로써 동시성과 병렬성을 동시에 활용할 있습니다.

동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함합니다. 우리가 흔히 ‘동시’라고 이야기 하지만 컴퓨터(코어)는 한번에 하나의 명령어만 처리할 수 있다. 즉, 두개 이상의 알고리즘이 하나의 코어내에서 스레드간에 빠르게 교차되면서 실행되기 때문에 ‘동시’라고 느끼는 것입니다. 병렬성을 이야기하려면 적어도 2개 이상의 코어가 있어야 합니다. 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말합니다. 그러므로 두개의 알고리즘이 정확히 같은 시점에 실행될 때 이를 병렬적이라고 말할 수 있습니다.

동시성은 여러개의 스레드를 하나의 코어에서 빠르게 교차시키면서 실행하여 동시에 실행되는 것 처럼 보이도록 동작시키는 방식이다. 스레드가 교차하며 Context Switching을 계속해서 일으키고 다중 스레드들이 실행된다. 반면 병렬성은 멀티 코어프로세서 에서 멀티 스레드를 실행 시키는 방법으로 실제로 다중의 코어에서 각자의 스레드가 명령어를 실행하는 것을 말한다.

 

12. 실제 프로젝트에서 멀티프로세싱 혹은 멀티스레딩을 사용한 경험이 있다면 설명해주세요.

더보기

예를 들어 웹 서버를 구축하는 프로젝트를 진행했다고 가정해보겠습니다. 웹 서버는 일반적으로 다수의 클라이언트 요청을 동시에 처리해야 합니다. 이때, 단일 스레드에서 모든 요청을 처리하려고 하면, 한 번에 하나의 요청만 처리할 수 있으므로 성능 저하가 발생할 수 있습니다. 따라서 웹 서버는 일반적으로 멀티스레딩을 사용하여 동시에 여러 요청을 처리합니다.

각 요청을 처리하는 독립적인 스레드를 생성하면, 요청을 병렬로 처리할 수 있어 성능 향상을 기대할 수 있습니다. 스레드는 프로세스 내에서 자원을 공유하므로, 다른 스레드와 통신하는 데 비용이 적게 들며, 스레드 생성과 스위칭 비용도 프로세스에 비해 상대적으로 적습니다. 따라서 병렬로 처리해야 하는 작업이 많은 웹 서버와 같은 환경에서는 효과적입니다.

그러나 이러한 멀티스레딩 환경에서는 스레드 간 동기화 문제를 신경 써야 합니다. 여러 스레드가 동시에 공유 자원에 액세스하려고 하면 경쟁 상태가 발생할 수 있으므로, 적절한 동기화 메커니즘을 사용해야 합니다. Java에서는 synchronized 키워드를 사용하여 이를 관리할 수 있습니다.

이처럼 멀티스레딩은 프로젝트의 효율성을 크게 향상시키지만, 동기화 등의 복잡한 이슈를 관리해야 하는 단점도 있습니다. 따라서 멀티스레딩을 적용할 때는 프로젝트의 요구 사항과 특성을 고려하여 결정해야 합니다.