본문 바로가기
[9oorm x kakao] 구름톤 유니브 3기/[구름톤 유니브] KDT 스터디

[코드온 - 4주차] 프로세스와 스레드

by 조희우 2024. 10. 1.

코드온 CS 스터디

구름톤 유니브에서 진행하는 Deep Dive 풀스택 11회차 과정 내에서 진행하는 CS 스터디입니다.

학습 기간

2024.09.25.(수) ~ 01.(화)

4주차 학습 주제

  1. 프로세스와 컴파일 과정: 프로그램이 실행 파일로 변환되는 과정.
  2. 프로세스의 상태: 프로세스의 생성, 실행, 대기, 종료 상태.
  3. 스레드와 멀티스레딩: 멀티스레드 프로그래밍의 이점과 구현 방식.
  4. 교착 상태: 교착 상태의 원인과 해결 방법.

1. 프로세스와 컴파일 과정

1.1. 용어 설명

  • 프로세스: 프로그램으로부터 인스턴스화하는 과정
  • 프로그램 : 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것

1.2. 컴파일 과정

프로그램이 실행 파일로 변환되는 과정은 크게 작성컴파일링킹으로 나뉜다.

프로그램의 컴파일 과정 (출처; 면접을 위한 CS 전공지식 노트, 주홍철)

  1. 소스 코드 작성(Coding): 개발자는 고급 프로그래밍 언어(C, C++, Java 등)로 프로그램의 소스 코드를 작성한다.
  2. 컴파일(Compilation): 소스 코드는 컴파일러에 의해 기계어(어셈블리어)로 변환된다.
    이 과정에서 문법 오류가 체크되며, 컴파일된 결과는 목적 파일(object file)로 저장된다.
  3. 링킹(Linking): 컴파일된 목적 파일과 함께 사용할 라이브러리 파일들이 연결(Link)되어 실행 파일이 생성된다.
    이때 외부 라이브러리나 표준 함수들을 목적 파일에 연결하여 완전한 실행 파일을 만든다.
  4. 실행: 생성된 실행 파일은 운영체제의 도움을 받아 메모리에 적재되어 실행된다.
라이브러리의 종류
1. 정적 라이브러리:
    - 방식: 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
    - 장점: 시스템 환경 등 외부 의존도가 낮음
    - 단점: 코드 중복 등 메모리 효율성이 떨어짐
2. 동적 라이브러리
    - 방식: 프로그램 실행 시 필요할 떄만 DLL이라는 함수 정보를 통해 참조하는 방식
    - 장점: 메모리 효율성이 좋음
    - 단점: 시스템 환경 등 외부 의존도가 높음

 


2. 프로세스의 상태

2.1. 용어 설명

  • PCB(Process Control Block): 프로세스에 대한 메타데이터를 저장한 데이터
  • 메타 데이터: 데이터에 관한 구조화된 데이터이자, 데이터를 설명하는 작은 데이터

2.2. 프로세스의 상태

프로세스는 실행되는 동안 다양한 상태를 가지며, 운영체제는 이 상태를 관리한다.

주요 상태는 다음과 같다.

프로세스의 상태 (출처; [CS] 프로세스와 스레드 02 - 프로세스의 상태, Cometa's blog)

 

  1. 생성(Created): 프로세스가 생성되고 메모리와 자원을 할당받는 초기 상태이다.
    요청 작업을 커널에 등록하고 PCB를 할당한다.
    • Created -> Ready: 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당하고 준비 상태로 변환
    • Created -> Suspended Ready: 공간이 없으면 메모리를 할당하지 않고 보류 준비로 변환
  2. 준비(Ready): CPU 스케쥴러로부터 CPU 할당을 대기하는 상태로 CPU 할당 시 바로 실행이 가능한 상태이다.
    프로세서만 제외하고 메모리 등 다른 자원은 모두 할당 된 상태이다
    • Ready -> Running (Dispatch): CPU를 할당 받으면 실행 상태로 바뀌고 실행
    • Ready -> Suspended Ready: 준비 상태였다가 메모리를 뺏김
  3.  준비 중단(Suspended Ready): 다른 자원을 할당 받은 상태이나 프로세서 및 메모리를 할당받지 못한 상태이다. 
    준비 또는 실행 상태에서 메모리를 잃게 되거나 충분한 메모리 공간의 확보를 위해 준비 상태의 프로세스를 보류시키는 경우에 상태이다.
    1. Running -> Suspended Ready: 높은 우선순위의 보류 대기 상태 프로세스가 준비 상태가 되어, 실행 상태의 프로세스로부터 CPU를 뺏음
    2. Suspended Blocked -> Suspended Ready: 보류 대기 상태에 있던 프로세스가 기다리던 입출력이 완료
    3. Suspended Ready -> Ready: 다시 메모리를 받음
  4. 실행(Running): CPU 소유권과 메모리를 할당 받아 인스트럭션을 실행 중인 상태이다.
    단, 하나의 프로세스만 실행 상태에 있을 수 있습니다.
    1. Running -> Ready (Timeout / Preemption) : CPU를 받아 실행하다가 시간 할당량을 소진하여 뺏긴 상태
    2. Running -> Blocked/Asleep : 실행 상태의 프로세스가 입출력이 필요하게 되어 시스템 호출을 하고, 입출력 처리의 종료를 기다리는 상태, 이때 CPU는 바로 준비 상태의 프로세스 하나를 선택해 실행
    3.  
  5. 대기(Blocked / Asleep): 이벤트 발생 후 기다리며 프로세스가 차단된 상태이다.
    프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다린다.
    1. Blocked -> Ready (Wake-up) : 입출력이 완료되어 CPU 할당을 기다리는 상태
    2. Blocked -> Suspended Blocked : 메모리의 여유 공간 확보를 위해 대기 상태에서 메모리를 뺏겨 보류 대기 상태로 바뀜
  6. 대기 중단(Suspended Blocked)대기 상태일 때 메모리 공간을 잃은 상태로 준비 중단(Suspended Ready)상태와 유사하다.
    프로세스, 메모리, 기타 자원을 모두 할당받지 못한 상태이다.
    1. Blocked -> Suspended Blocked : 메모리 공간 확보를 위해 메모리를 잃은 상태, 준비 상태인 프로세스가 아예 없는 경우 발생하기도 함
    2. Suspended Blocked -> Blocked/Asleep : 메모리가 확보되어 대기
    3. Suspended Blocked -> Suspended Ready : 입출력이나 기다리던 사건이 종료
  7. 종료(Terminated / Zombie): 프로세스가 실행을 모두 마치고 종료된 상태이다.
    메모리와 CPU 소유권 등 모든 자원을 회수하고, PCB를 삭제한다.

3. 스레드와 멀티스레딩

3.1. 스레드(Thread)

스레드는 프로세스 내에서 실행 가능한 가장 작은 실행 단위이다.

하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 동일한 메모리 공간을 공유하면서 동시에 작업을 수행할 수 있다.

코드, 데이터, 힙은 스레드끼리 서로 공유하며, 그 외 영역은 각각 생성된다.

3.2. 멀티스레딩(Multithreading)

멀티스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법이다.

스레드끼리 서로 자원을 공유하기 때문에 효율성이 좋다.

멀티스레드의 이점은 다음과 같다.

  • 성능 향상: 스레드들이 병렬로 작업을 처리함으로써 멀티코어 프로세서에서 성능을 최적화할 수 있다.
  • 동시성: 사용자의 입력을 기다리는 동안 다른 작업을 수행할 수 있어 프로그램의 응답성이 높아진다.
  • 자원 공유: 같은 프로세스 내에서 스레드들이 메모리와 자원을 공유하여, 새로운 프로세스를 생성하는 것보다 자원을 적게 소모한다.

3.3. 멀티스레딩의 구현 방식

  • 유저 레벨 스레드(User-Level Thread): 운영체제의 커널과 상관없이 사용자 영역에서 스레드를 관리하는 방식이다.
    속도가 빠르지만, 운영체제가 스레드를 인식하지 못하여 병렬 처리가 제한될 수 있다.
  • 커널 레벨 스레드(Kernel-Level Thread): 운영체제가 직접 스레드를 관리하는 방식으로, 운영체제가 스레드 단위로 CPU 자원을 할당한다.
    병렬 처리가 가능하지만, 사용자 수준보다 오버헤드가 크다.

4. 교착 상태(Deadlock)

4.1. 교착 상태란?

교착 상태는 두 개 이상의 프로세스나 스레드가 서로 자원을 점유한 상태에서, 다른 프로세스가 점유한 자원을 요청하면서 대기하는 상황이다.
교착 상태로 인하여 프로세스들이 모두 영구적으로 대기 상태에 빠지며, 시스템이 멈추게 됩니다.

4.2. 교착 상태의 발생 조건

교착 상태의 원인은 다음과 같다.

  1. 상호 배제(Mutual Exclusion): 한 프로세스가 자원을 독점하여 다른 프로세스들은 접근이 불가능하다.
  2. 점유와 대기(Hold and Wait): 한 프로세스가 자원을 점유한 상태에서 다른 프로세스가 자원을 요청하는 상태이다.
  3. 비선점(Non-preemption): 한 프로세스가 점유한 자원을 다른 프로세스가 강제적으로 가져올 수 없다.
  4. 순환 대기(Circular Wait): 각 프로세스가 서로의 프로세스 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황이다.

4.3. 교착 상태의 해결 방법

  • 예방(Prevention): 교착 상태 발생 조건 중 하나를 제거하여 교착 상태를 미리 방지한다.
    예를 들어, 한 번에 하나의 자원만 요청하거나, 자원을 강제로 선점하는 방식이 있다.
  • 회피(Avoidance): 프로세스의 자원 요청 시 교착 상태가 발생할 가능성을 검사하고, 안전한 상태일 때만 자원을 할당한다.
    대표적인 알고리즘으로 은행원 알고리즘(Banker's Algorithm)이 있다.
    • 은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고, 안정 상태로 가도록 자원을 할당하는 알고리즘이다.
  • 탐지 및 복구(Detection and Recovery): 교착 상태가 발생했는지 탐지한 후, 자원을 회수하여 교착 상태를 해결한다.
    프로세스 중 하나를 강제로 종료하거나 자원을 선점한다.
  • 무시(Ignore): 일부 시스템에서는 교착 상태가 드물게 발생하므로, 복잡한 해결 방법을 구현하지 않고 단순히 무시하는 정책을 사용할 수 있다.
    대표적으로 UNIX와 Windows의 운영체제가 있다.

참고자료

- https://velog.io/@gkqls813/면접을-위한-CS-전공지식-노트-운영체제-메모리

- http://Blog.naver.com

- https://nostressdev.tistory.com/16

- https://velog.io/@aeong98/운영체제OS-프로세스와-스레드

- https://yanghs6.github.io/posts/1003_process_state/