[운영체제] 프로세스와 스레드

Letmegooutside·2022년 1월 6일
0

운영체제

목록 보기
4/16

Process

메모리에 적재되어 실행되고 있는 프로그램을 의미한다.

운영체제로부터 시스템 자원을 할당받는 작업의 단위를 의미하기도 한다.
CPU 시간 / 운영되기 위해 필요한 주소 공간 / 코드, 데이터, 스택, 힙의 구조로 되어있는 독립적인 메모리 영역 등의 시스템 자원을 할당받는다.

프로세스 주소공간

프로세스는 각각 독립적인 메모리 영역을 할당받으며, 기본적으로 프로세스 당 최소 하나의 스레드(메인스레드)를 가지고 있다. 프로세스는 별도의 주소공간에서 실행되며, 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
다른 프로세스의 자원에 접근하려면 프로세스간의 통신(IPC)을 사용해야 한다. (파이프, 파일, 소켓 등을 사용하여 통신)

Thread

프로세스 내에서 실행되는 여러 흐름의 단위로 프로세스의 특정한 수행 경로이다.

스레드는 프로세스가 할당받은 자원을 이용하여 실행된다. 여러개의 스레드가 동시에 동작할 경우 각각의 스레드들은 메모리 영역 중 스택 영역만 따로 할당받게 되고, 나머지 메모리 영역은 공유하게 된다.

만약 한 프로세스를 실행하다가 오류가 발생해서 프로세스가 강제로 종료되어도 공유 파일을 손상시키는 경우가 아니라면 다른 프로세스에 아무런 영향을 주지 않는다.
하지만 스레드는 스택을 제외한 메모리 영역을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내 다른 스레드 모두가 강제로 종료된다.

스레드의 stack 영역

스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 영역을 할당하게 된다.

  • 스레드 : 프로세스 내에서 실행되는 여러 실행 흐름의 단위이다. 즉 여러가지 역할을 수행하기 위한 특정한 수행 경로를 의미하므로 독립적인 실해 흐름이 가능해야 한다.

  • stack 영역 : 지역변수, 함수의 매개 변수, 함수 실행 시 되돌아갈 주소값 등이 저장되는 메모리 영역이다. 즉 독립적인 함수가 호출되어질 때 그 안에서 사용되는 지역변수 및 매개변수 들이 저장되는 영역이다.

스레드가 독립적인 실행 흐름이 가능하기 위해서는 독립적인 함수 호출이 가능해야 하기 때문에 다른 메모리 영역은 모두 공유하더라도 스택 영역 만큼은 각각 스레드가 독립적으로 할당받게 되어진다.

멀티 프로세스

하나의 응용프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것

부모-자식 관계의 프로세스라도 자신만의 메모리 영역을 가지게 된다. fork()를 통해 프로세스를 복사하며, 프로세스간 통신을 하려면 IPC를 통해야 한다.

장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.

단점

  • Context Switching에서의 오버헤드
    Context Switching이란 하나의 프로세스가 CPU를 사용중인 상태에서, 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스 상태를 보관하고 새로운 프로세스 상태를 적재하는 작업을말한다.
    프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어 문맥교환이 발생하면 캐시에 있는 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 한다.

  • 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)

멀티 스레드

하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것.

윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

장점

  • 시스템 자원의 효율성 증대
    프로세스를 생성하며 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.

  • 시스템 처리량 증가 (처리 비용 감소)
    스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.

  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
    프로세스 내의 스택 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.

단점

  • 주의 깊은 설계가 필요하다.

  • 디버깅이 까다롭다

  • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.

  • 멀티스레드의 경우 자원 공유의 문제가 발생한다. (동기화 문제. 스레드 간 전역 변수를 공유하므로 충돌이 발생할 수 있다.)





Reference
https://velog.io/@raejoonee
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://yabmoons.tistory.com/613

0개의 댓글