ComputerScience

프로세스 & 스레드

Albosa2lol 2024. 4. 7. 08:15

프로세스 : 프로그램을 메모리 상에서 실행중인 작업

스레드 : 프로세스 안에서 실행되는 여러 흐름 단위

 

기본적으로 프로세스마다 최소 1개의 스레드 소유 (메인 스레드 포함)

 



프로세스는 각각 별도의 주소공간 할당 (독립적)

  • Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
  • Data : 전역변수, 정적변수, 배열 등
    • 초기화 된 데이터는 data 영역에 저장
    • 초기화 되지 않은 데이터는 bss 영역에 저장
  • Heap : 동적 할당 시 사용 (new(), malloc() 등)
  • Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

 

스레드는 Stack만 따로 할당 받고 나머지 영역은 서로 공유

 

하나의 프로세스가 생성될 때, 기본적으로 하나의 스레드 같이 생성

 

프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재함



멀티프로세스

하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것

장점 : 안전성 (메모리 침범 문제를 OS 차원에서 해결)

단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을 수록 오버헤드 발생. Context Switching으로 인한 성능 저하

 

Context Switching이란?

프로세스의 상태 정보를 저장하고 복원하는 일련의 과정

즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정을 말함

→ 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로, 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함



멀티 스레드

하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것

스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해줌

 

장점 : 독립적인 프로세스에 비해 공유 메모리만큼의 시간, 자원 손실이 감소 전역 변수와 정적 변수에 대한 자료 공유 가능

단점 : 안전성 문제. 하나의 스레드가 데이터 공간 망가뜨리면, 모든 스레드가 작동 불능 상태 (공유 메모리를 갖기 때문)

  • 멀티스레드의 안전성에 대한 단점은 Critical Section 기법을 통해 대비함
    상호 배제, 진행, 한정된 대기를 충족해야함
  • 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려할 때 발생하는 문제를 해결하기 위한 동기화 과정

 

 

면접 질문 답변

📎 프로세스

  • 프로그램에 대해 설명해주세요.
    • 프로그램을 실행하기 위해서는 OS로부터 프로그램이 동작하는데 필요한 CPU, 메모리 등을 할당 받아야 합니다.
    • 프로그램이란 메모리에 올라가 있지 않고, 저장 장치에 저장 되어 있는 상태의 코드 파일을 의미합니다.
  • 프로세스에 대해 설명해주세요.
    • 디스크에 파일로 존재하던 프로그램이 메모리에 올라가서 실행되면 프로세스가 됩니다.
    • 프로세스란 실행중인 프로그램입니다.
  • 프로세스 문맥에 대해 설명해주세요.
    • 프로세스 문맥이란 프로세스가 어떤 상태에서 수행되고 있는지에 대한 정보입니다.
  • 문맥교환(context switch)에 대해 설명해주세요.
    • 문맥교환은 언제 발생하나요?
      • 타이머 인터럽트나 I/O 요청 시스템 콜이 들어왔을 때 발생합니다.
      • 일반적으로 한 프로세스의 타임 슬라이스가 끝날 경우 발생합니다. (라운드 로빈 방식)
    • 문맥 교환 발생 과정에 대해서 조금 더 상세히 설명해주세요.
      1. 사용자 프로세스가 CPU를 할당 받고 실행되던 중에, 타이머 인터럽트가 발생하면 CPU의 제어권은 운영체제에게 넘어가게 됩니다.
      2. CPU의 제어권을 가지게 된 운영체제는 원래 수행 중이던 프로세스의 문맥을 PCB에 저장하고 새롭게 실행시킬 프로세스에게 CPU 제어권을 이양합니다. 이 과정에서 원래 수행 중이던 프로세스는 준비 상태로 바뀌고, 새롭게 CPU를 할당받은 프로세스는 실행 상태가 됩니다.
    • CPU가 프로세스를 변경할 때, 이전의 프로세스 상태를 PCB에 저장하고, 새로운 프로세스의 저장된 상태를 복구하는 작업입니다.
  • 프로세스의 메모리 공간에 대해 설명해주세요.
    • Code는 실행할 프로그램 코드가 저장되며, CPU에서 수행되는 명령어를 저장하는 공간입니다.Heap은 동적 데이터가 저장되는 곳입니다.
    • Stack은 지역 변수와 인자, 함수의 리턴 주소가 저장되는 곳입니다. 함수 호출 시 프레임이 생성되고, 함수가 끝나면 반환됩니다.
    • Data는 정적 변수, 배열, 구조체 등이 저장되는 공간입니다.
    • 프로세스의 메모리 공간은 Code, Data, Heap, Stack 으로 이루어져있습니다.
  • 프로세스 제어블록(PCB)에 대해 설명해주세요.
    • PCB에는 어떤 정보가 담겨있을까요?
      • PID: 프로세스를 구분할 수 있는 식별자
      • 프로세스 상태: 준비 / 대기 / 실행 등 프로세스의 상태를 나타내는 정보
      • PC 레지스터: CPU가 다음으로 실행할 명령어를 가리키는 값
      • CPU 스케줄링 정보: 우선 순위, CPU 점유 시간 등에 대한 정보
    • 프로세스 제어 블록이란 프로세스를 실행하는 데 필요한 정보를 담고 있는 자료 구조입니다.
  • 멀티 프로세스에 대해서 설명해주세요.
    • 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성하는 구조이며 서로 독립적인 메모리 공간을 가지고 있습니다.
    • 예를들어 구글의 크롬 탭은 각각이 프로세스이며, 하나의 탭이 멈추더라도 다른 탭은 정상 작동합니다.
    • 멀티 프로세스는 하나의 프로그램에서 동시에 여러개의 프로세스를 실행하는 기술입니다.
  • 프로세스 수행 상태 변화 과정에 대해 설명해주세요.
    • 그 다음 ready 상태는 CPU를 할당 받아 실행 가능한 상태이고프로세스가 수행도중 I/O 요청을 하게되면, I/O 요청이 완료될때까지마지막으로 프로세스가 종료중인 상태를 terminated 상태라고 합니다.
    • 대기하는 상태인 block 상태가 됩니다.
    • CPU를 할당 받아 실제로 수행하는 상태는 running 상태입니다.
    • 최초 상태인 new는 프로세스가 생성중인 상태입니다.
  • 프로세스끼리 협력하는 방법에 대해서 설명해주세요.
    1. 메시지 전달 방식
    2. 프로세스는 다른 프로세스에게 전달할 메시지를 운영체제에게 시스템 콜 방식으로 요청해 전달합니다.
    3. 공유 메모리 방식
    4. 시스템 콜 방식을 통해 각 프로세스 간 공유하는 공간을 만들어, 프로세스 간 같은 공유 공간에 대해 읽고 쓸 수 있도록 합니다.
  • fork() 명령어에 대해 설명해주세요.
    • fork() 시스템콜을 통해 부모 프로세스의 내용을 그대로 복제한 자식 프로세스를 생성할 수 있습니다.
    • 이때 부모 프로세스와 자식 프로세스의 주소 공간은 각각 따로 갖지만, 주소 공간 내에는 동일한 공간을 갖습니다.
    • 유닉스에서 fork() 명령어는 새로운 프로세스를 생성하게 해주는 시스템 콜입니다.

📎 쓰레드

  • 쓰레드에 대해 설명해주세요.
    • 프로세스 내에서 레지스터와 스택만 따로 할당 받고 Code, Data, Heap 영역은 스레드끼리 공유합니다.
    • 프로세스 내에서 실행되는 여러 흐름의 단위입니다.
  • 쓰레드의 메모리 공간에 대해 설명해주세요.
    • 그렇기 때문에 쓰레드간 context switch는 적은 오버헤드를 갖습니다.
    • 쓰레드는 프로세스의 메모리 공간인 힙, 데이터, 코드 영역을 공유합니다.
  • 쓰레드 제어블록(TCB)에 대해 설명해주세요.
    • TCB에는 쓰레드 ID, 쓰레드 우선순위, 스케줄링 정보등을 저장하고 있습니다.
    • 쓰레드 제어블록은 프로세스의 PCB 처럼 각 스레드마다 운영체제가 문맥 정보를 담고 있는 자료구조 입니다.
  • 사용자 수준 쓰레드와 커널 수준 쓰레드의 차이를 설명해 보세요.
    • 사용자 수준 스레드란, 라이브러리를 통해 구현한 스레드를 의미합니다. 스레드와 관련된 모든 행위를 사용자 영역에서 하기 때문에, 커널은 사용자 수준 스레드의 존재를 알지 못하고 스레드 교환에 개입하지 않습니다.
    • 커널 수준 스레드란, 커널이 직접 생성하고 관리하는 스레드를 의미합니다.
  • 멀티 쓰레딩 프로그래밍 대해서 설명해주세요.
    • 쓰레드는 프로세스의 자원을 공유하기 때문에 fork로 인한 쓰레드 생성은 프로세스 생성보다 빠릅니다. (공유하는 부분을 제외한 부분만 복사하면 되기 때문 입니다.)하지만 쓰레드가 접근하는 공유 데이터에 대해 동기화 작업을 수행해야 합니다.
    • 또한 커널의 개입 없이 쓰레드간 통신을 할 수 있습니다.
    • 멀티쓰레딩은 프로세스로 해야하는 작업을 여러개의 쓰레드로 나누어서 수행하는 것을 말합니다.
  • 멀티 쓰레드 프로그래밍의 장단점을 설명해 주세요.
    • 장점
      • 프로세스 내에 있는 모든 스레드들이 프로세스의 자원을 공유하므로 자원 중복에 대한 낭비를 막을 수 있습니다.
      • 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도, 다른 스레드가 작업을 이어서 할 수 있습니다.
    • 단점
      • 한 스레드에 문제가 생기면 전체 스레드에 영향을 미칩니다.
      • 공유 자원에 대한 동기화가 필요합니다.
    • 멀티 스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 처리하는 프로그래밍 방식입니다.
  • 멀티 프로세스대신 멀티 쓰레드를 사용하는 이유가 뭔가요?
    • 프로세스 내에 있는 모든 스레드들이 프로세스의 자원을 공유하므로, 자원 중복에 대한 낭비를 막을 수 있습니다.
  • 멀티 쓰레드 프로그래밍에서 주의할 점이 있을까요?
    • 자원을 공유하기 때문에 Thread-safe하게 작성하여, 동시성 이슈가 발생하지 않도록 해야 합니다.
  • Thread-Safe하다는 의미와 그렇게 설계하는 방법을 설명해 주세요.
    • Thread-safe하다는 의미는, 여러 쓰레드가 동일한 자원에 접근하더라도 동시성 이슈가 발생하지 않는 것을 의미합니다.
    • Thread-safe하게 설계를 하려면, 기본적으로 불변 객체를 활용하는 것이 Thread-safe하게 설계할 수 있는 방법 중 하나라고 생각합니다. 그 외에 락을 통해 공유 자원에 접근할 스레드를 제한하는 방법이 있습니다.