[CS] 3주차 - 프로세스와 스레드

오늘·2022년 7월 5일
1

[CS] CS with Kotlin/Android

목록 보기
11/12
post-thumbnail
post-custom-banner

🎞️ 프로세스와 스레드

프로세스(Process)

  • 컴퓨터에서 실행되고 있는 프로그램
  • CPU 스케쥴링의 대상인 작업(Task)과 거의 같은 의미로 쓰임.
  • 프로그램이 메모리에 올라가 인스턴스화된 것.

스레드(Thread)

  • 프로세스 내의 작업 흐름

프로세스 vs 스레드

  • 프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고, 스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위.

📥 프로세스와 컴파일 과정

C 언어 기준

  • 전처리
    • 소스 코드의 주석 제거, 헤더 파일 병합 및 매크로 치환 등
  • 컴파일러
    • 오류 처리, 코드 최적화, 어셈블리어 변환
  • 어셈블러
    • 어셈블리어를 목적 코드(Object Code)로 변환.
  • 링커
    • 프로그램 내의 라이브러리 함수 또는 다른 파일을 목적 코드와 결합 후 실행 파일 생성

정적 라이브러리

프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식

  • 시스템 환경 등 외부 의존도가 낮음
  • 코드 중복 등 메모리 효율성이 떨어짐

동적 라이브러리

프로그램 실행 시 필요할 때만 DLL 이라는 함수 정보를 통해 참조하는 방식

  • 메모리 효율성이 높음.
  • 외부 의존도가 높음.

🚦 프로세스의 상태

  • 생성(Create)
    • fork() 또는 exec() 함수를 통해 프로세스가 생성된 상태.
    • PCB가 할당됨.
    • fork()
      • 부모 프로세스의 주소 공간을 그대로 복사하여 새로운 자식 프로세스를 생성하는 함수.
      • 주소 공간만 복사하고 부모 프로세스의 비동기 작업 등을 상속하지는 않음.
    • exec()
      • 새롭게 프로세스를 생성하는 함수.
  • 대기(Ready)
    • CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태.
    • 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기.
  • 대기 중단(Ready suspended)
    • 메모리 부족으로 일시 중단된 상태.
  • 실행(Running)
    • CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태.
    • CPU burst가 일어났다고 표현하기도 함.
  • 중단(Blocked)
    • 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
    • I/O 디바이스에 의한 인터럽트로 많이 발생.
  • 일시 중단(Blocked suspended)
    • 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태.
  • 종료(Terminated)
    • 메모리와 CPU 소유권을 모두 놓고 가는 상태.
    • 자연스럽게 종료되는 것과 비자발적 종료(Abort)(부모 프로세스가 자식 프로세스를 강제 종료)가 있음.
    • 자식 프로세스에 할당된 자원의 한계치를 넘어설때, 부모 프로세스가 종료될 때, 사용자가 process.kill 등의 명령어로 프로세스를 종료할 때 발생.

🗄️ 프로세스의 메모리 구조

  • 스택(Stack)
    • 지역변수, 매개변수, 함수가 저장됨
    • 컴파일 시에 크기가 결정됨
    • 동적
    • 위 주소부터 할당됨
  • 힙(Heap)
    • 동적 할당할 때 사용
    • 런타임 시에 크기가 결정됨
    • 동적
  • 데이터 영역(BSS Segment, Data Segment)
    • 전역 변수, 정적 변수가 저장됨
    • 정적
    • 프로그램이 종료되면 사라지는 변수가 들어있음
    • BSS 영역(BSS Segment)
      • 초기화가 되지 않은 변수가 0으로 초기화되어 저장됨
    • Data 영역(Data Segment)
      • 0이 아닌 다른 값으로 할당된 변수들이 저장됨
  • 코드 영역(Code Segment)
    • 프로그램에 내장되어 있는 소스 코드가 들어가는 영역
    • 정적
    • 수정 불가능한 기계어로 저장됨.

🕹️ PCB(Process Control Block)

= 프로세스 제어 블록
운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터

  • 프로세스가 생성되면 운영체제는 해당 PCB를 생성.
  • 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞 부분에서 관리됨.

PCB의 구조

  • 프로세스 스케줄링 상태
    • 준비 또는 일시중단 상태의 프로세스가 CPU에 대한 소유권을 얻은 이후 또는 이후 경과된 시간과 같은 기타 스케줄링 정보
  • 프로세스 ID
    • 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
  • 프로세스 권한
    • 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
  • 프로그램 카운터
    • 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
  • CPU 레지스터
    • 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
  • CPU 스케줄링 정보
    • CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
  • 계정 정보
    • 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
  • I/O 상태 정보
    • 프로세스에 할당된 I/O 디바이스 목록

컨텍스트 스위칭(Context Switching)

PCB를 교환하는 과정

  • 컨텍스트 스위칭이 아주 빠른 속도로 일어나기 때문에 많은 프로그램을 동시에 실행하는 것 처럼 보임.
    -> 실제로 실행되는 프로세스는 코어 하나당 한 개 뿐.

  • 스레드에서도 컨텍스트 스위칭이 발생함. 스레드의 컨텍스트 스위칭은 비용이 더 적고 시간도 더 적게 걸림.

컨텍스트 스위칭에 드는 비용

  • 유휴 시간(Idle Time)
    • 프로세스의 실행 도중 인터럽트 또는 시스템 콜이 발생해서 해당 프로세스의 PCB를 저장하고 프로세스가 중지되었다가 PCB를 다시 불러와서 실행될 때 까지의 시간
  • 캐시미스
    • 컨텍스트 스위칭 발생시 잘못된 주소 변환이 생기는 것을 막기 위해 프로세스가 가지고 있는 메모리 주소에 대한 캐시클리어링 과정을 거침.
      -> 캐시미스 발생

⛓️ 멀티프로세싱

여러 개의 프로세스 즉, 멀티프로세스를 통해 하나 이상의 일을 병렬적으로 처리하는 것.

  • 신뢰성이 높음.
    • 특정 프로세스에 문제가 생기더라도 다른 프로세스를 이용해서 처리할 수 있음.

웹 브라우저의 멀티 프로세스

  • 브라우저 프로세스
    • 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당.
    • 네트워크 요청이나 파일 접근 같은 권한을 담당.
  • 렌더러 프로세스
    • 웹 사이트가 보이는 부분의 모든 것을 제어
  • 플러그인 프로세스
    • 웹 사이트에서 사용하는 플러그인 제어
  • GPU 프로세스
    • GPU를 이용해서 화면을 그리는 부분을 제어

IPC(Inter Process Communication)

프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘

  • 클라이언트는 데이터를 요청하고 서버는 클라이언트의 요청에 응답하는 것 등

공유 메모리(Shared Memory)

여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것

  • 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있음.
  • IPC 방식 중 가장 빠름.
    -> 매개체를 통해 데이터를 주고 받는 것이 아닌 메모리 자체를 공유해서 불필요한 데이터 복사의 오버헤드가 발생하지 않기 때문.
  • 동기화가 필요.

파일

디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터.

  • 이를 기반으로 프로세스간 통신을 함.

소켓

동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터

  • TCP, UDP

익명 파이프(Anonymous Pipe)

파이프(프로세스 간에 FIFO 방식으로 읽히는 임시 공간)를 기반으로 데이터를 주고 받으며, 단 방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어 작동하는 방식

  • 부모, 자식 프로세스 간에만 사용할 수 있으며, 다른 네트워크 상에서는 사용이 불가능함.

명명된 파이프(Named Pipe)

파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프

  • 클라이언트/서버 통신을 위한 별도의 파이프 제공.
  • 여러 파이프를 동시에 사용할 수 있음.
  • 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와도 통신 가능.
  • 서버용 파이프와 클라이언트용 파이프로 구분해서 작동.
  • 하나의 인스턴스를 열거나 여러 개의 인스턴스를 기반으로 통신.

메시지 큐

큐 자료 구조 형태로 관리하는 것

  • 커널에서 전역적으로 관리됨.(커널의 전역변수 등)
  • 다른 IPC 방식에 비해 사용 방법이 매우 직관적이고 간단함.
  • 다른 코드의 수정 없이 몇 줄의 코드 추가 만으로 메시지 큐에 접근할 수 있음.
  • 공유 메모리 기반의 IPC에서 쓰기/읽기 빈도가 높아서 동기화 때문에 기능 구현이 복잡해질 때, 대안으로 메시지 큐 사용 가능.

🧶 스레드와 멀티 스레딩

스레드

프로세스의 실행 가능한 가장 작은 단위.

  • 프로세스는 여러 스레드를 가질 수 있음.

멀티스레딩

프로세스 내 작업을 여러 개의 스레드로 처리하는 기법

  • 스레드끼리는 코드, 데이터, 힙 영역을 공유함. 스택은 별도로 생성됨.
    -> 자원을 공유하기 때문에 효율성이 높음.
  • 동시성이 좋음.
  • 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼치기 때문에 스레드로 이루어진 프로세스에 영향을 줄 수 있음.

📦 공유 자원과 임계 영역

공유 자원(Shared Resource)

시스템 안에 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등

경쟁 상태(Race Condition)

공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황

  • 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태.

임계 영역(Critical Section)

공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역

임계 영역을 해결하기 위한 방법

  • 상호 배제, 한정 대기, 융통성이라는 조건을 만족해야 함.
  • 상호 배제
    • 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
  • 한정 대기
    • 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
  • 융통성
    • 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다.

뮤텍스(Mutex)

공유 자원을 사용하기 전에 설정하고, 사용한 후에는 해제하는 잠금 장치

  • 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근할 수 없음.
  • 뮤텍스는 하나의 상태(잠금 또는 잠금 해제)만 가짐.

세마포어(Semaphore)

일반화된 뮤텍스

  • 간단한 정수 값과 두 가지 함수(wait(P 함수) 및 signal(V 함수))로 공유 자원에 대한 접근을 처리함.
  • 프로세스가 공유 자원에 접근하면 세마포어에서 wait() 작업 수행
  • 프로세스가 공유 자원을 해제하면 세마포어에서 signal() 작업 수행
  • 조건 변수가 없음.
  • 상호 배제를 명시적으로 구현해야 함.
  • 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없음.
  • wait()

    • 자신의 차례가 올 때까지 기다리는 함수
  • signal()

    • 다음 프로세스로 순서를 넘겨주는 함수
  • 바이너리 세마포어

    • 0과 1 두 가지 값만 가질 수 있는 세마포어.
    • 구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있음
      -> 다만 뮤텍스는 리소스에 대한 접근을 동기화하는데 사용되는 잠금 메커니즘, 세마포어는 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘임.
  • 카운팅 세마포어

    • 여러 개의 값을 가질 수 잇는 세마포어.
    • 여러 자원에 대한 접근을 제어하는 데 사용.

모니터

둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공하는 것.

  • 모니터큐를 통해 자원에 대한 작업들을 순차적으로 처리.
  • 세마포어보다 구현하기 쉬움.
  • 자동으로 상호 배제임.

🔒 교착 상태(Deadlock)

두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태

교착 상태의 원인(필요충분조건)

  1. 상호 배제(Mutual Exclusion)
    • 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능
  2. 점유 대기(Hold and Wait)
    • 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
  3. 비선점(Non-preemption)
    • 다른 프로세스의 자원을 강제적으로 가져올 수 없음
  4. 환형 대기(Circular Wait)
    • 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황

교착 상태의 해결 방법

  1. 예방 기법(Prevention)
    • 자원을 할당할 때 애초에 조건이 성립하지 않도록 설계
    • 교착 상태의 조건 중 어느 하나를 제거함으로써 수행
    • 자원 낭비가 가장 심한 기법
  2. 회피 기법(Avoidance)
    • 은행원 알고리즘
      • 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘.
      • 교착 상태 가능성이 없을 때만 자원이 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악.
  3. 발견(Detection) 및 회복(Recovery) 기법
    • 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지우는 것.
    • 발견 : 교착상태 탐지 알고리즘, 자원 할당 그래프 사용
    • 회복 : 프로세스 종료, 자원 선점
  4. 현대의 운영체제는 교착 상태가 발생하면 사용자가 작업을 종료하는 방식 채택.
    -> 교착 상태는 매우 드물게 일어나고 이를 처리하는 비용이 더 크기 때문.

참고

profile
Junior Mobile 개발자
post-custom-banner

0개의 댓글