프로세스와 스레드

Tabber·2021년 12월 7일
0

CS공부하기

목록 보기
1/8

공부하며 적은 글입니다! 또한 글은 Swift, iOS 를 기준으로 작성됩니다.

프로세스와 스레드의 차이를 알아보자!

그 전에 먼저 알아봐야 할 것이 있다. 바로 프로그램의 정의이다.

프로그램

사실 우리가 프로세스와 스레드 보단 프로그램이라는 단어를 더 많이 들어보았다.
프로그램을 설명 해보라고 해도 다들 설명할 수 있을 것이다.

보통 프로그램이라고 하면 어떤 작업을 위해 실행할 수 있는 파일 혹은 명령문 집합체 라고 말한다.

지금 이 글을 적고있는 브라우저(사파리)또한 프로그램에 속한다.

프로세스

자, 그럼 프로세스에 대해 알아보자.
프로세스는 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다.
즉, 프로그램을 실행 시키면 그게 바로 하나의 프로세스가 되는 것이다.

프로세스의 구조

그럼 프로세스는 어떤 구조를 가지고 있는지 알아보자.

위 그럼처럼 프로세스는 Code, Data, Stack,Heap 네가지 영역의 구조로 이루어져있다.
각각의 특징을 살펴보자.

코드 영역

프로그래머가 작성한 프로그램이 코드 영역에 위치하게 된다.
컴파일 타입에 결정이 되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장이 된다.

데이터 영역

전역변수, static 변수가 데이터 영역에 위치하게 된다.
프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 해제된다.
실행 도중에 변수의 값이 변경될 수 있으니 Read-Write로 지정이 된다.

이걸 Swift 예제로 살펴보자!

struct IBY {
    static let name = "IN Byeong Yun"   // Static 상수로 데이터 영역에 할당하게 됨.
}

var name: String?                       // 전역 변수로 데이터 영역에 할당됨.
var age: Int?                           // 전역 변수로 데이터 영역에 할당됨.

이렇게 전역 변수나 static을 사용한 상수,변수 등은 데이터 영역에 할당된다.

스택 영역

함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등등이 스택 영역에 저장되고,함수가 종료되면 저장된 메모리도 해제된다.
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
우리가 함수를 호출하면 iOS는 내부적으로 함수 안에 선언된 파라미터, 지역변수 등을 스택에 할당하게 된다.

func nameResult(_ name: String) -> String { // 파라미터 name은 스택에 할당된다.
    let plusName = name + " 입니다."          // 지역변수 plusName은 스택에 할당된다.
    return plusName
}

그리고 함수가 종료되는 시점스택에 저장된 메모리를 모두 반환하게 된다.

또한 스택은 LIFO(Last In First Out) 데이터 구조를 가지고 있고, CPU에 의해 관리되고 최적화 하여 속도가 매우 빠르다.

이렇게 장점도 존재하지만 단점 또한 존재한다.
메모리 크기에 제한이 있고, 지역변수만 액세스 할 수 있다.

힙 영역

프로그래머가 동적으로 할당/해제를 힙 영역에서 하게 된다.
프로그래머는 힙에 메모리를 할당할 수 있고, 이를 동적 할당이라고 한다.
사용하고 난 뒤에는 반드시 메모리 해제를 해주어야 한다. 그렇지 않으면 메모리 릭이 발생한다.

메모리 릭이란?
프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상이다. 할당됐던 메모리를 다 사용하고 반환하지 않는다면, 메모리가 낭비되는 상황이 생긴다. 메모리 손실이라고도 부르지만 정확한 것은 메모리 릭(메모리 누수) 라고 부른다.

코드,데이터, 스택 중 유일하게 런타임 시에 결정되기 때문에, 데이터의 크기가 확실하지 않을 때 사용한다.

Swift에서는 이 힙 영역을 어디서 사용하는지 살펴보자.
Swift에서는 클래스 인스턴스, 혹은 클로저와 같은 참조 타입 값이 힙에 자동으로 할당이 된다.

근데, 힙 특징에 사용하고 난 뒤에는 반드시 메모리에서 해제를 해야한다고 했다. 근데 우리는 클래스와 클로저를 사용하면서 메모리를 해제 해주는 작업을 하지 않았다. 왜 안해줬는데도 잘 돌아갔던 것일까?

이것은 ARC에 대해 알아야 하는데, 나중에 다른 글로 찾아오겠다.

힙 영역의 장점은
메모리 크기에 대한 제한이 없다.
본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있다.

단점은
스택에 비해 속도가 느리다.

자, 여기까지 간단하게 프로세스의 정의프로세스의 구조에 대해 알아보았다.

스레드

프로세스의 코드에 정의된 절차에 따라서 CPU에 작업 요청을 하는 실행 단위이다.
좀 간단하게 말하자면, 프로세스 내부에서 실행되는 것이라고 할 수 있다.
스레드는 하나가 아니라 여러개도 생길 수 있다.

위 사진처럼 프로세스는 여러개의 스레드를 가질 수 있고, 이러한 동작 방식을 멀티 스레드 방식이라고 한다.

멀티 프로세스, 멀티 스레드

이렇게 프로세스와 스레드를 알아보았다. 둘은 확실히 다른 존재이다.

그러면, 프로세스를 여러개 사용하는게 좋을지 스레드를 여러개 사용하는게 좋을지에 대해 생각해보자.

일단 멀티 프로세스는 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 수행하는 것이다.

  • 장점 : 하나의 프로세스가 잘못이 된다고 해도 프로그램은 동작하게 된다.
  • 단점 : Context Switching 비용이 발생한다.

    Context Switching 이란?
    하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해서, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 넣어놓는 작업을 말한다. 이 작업의 오버헤드가 크다. 이와 더 자세한 얘기는 추후 글로 찾아뵙겠다.

멀티 스레드는 프로그램을 여러개의 스레드로 구성하고, 각 스레드가 작업을 처리하는 것을 말한다.

  • 장점: 시스템의 자원소모 감소, 처리 비용 감소(실행 속도가 향상된다.), 스레드간 자원 공유 (stack영역)
  • 단점: 디버깅이 어렵다, 동기화 이슈가 발생할 수 있다, 스레드 하나의 오류로 전체 프로세스에 문제가 발생할 수 있다.

동기화 이슈와, 문제와 관련된 것도 추후에 글로 작성하겠다.

정리

이번 글에서는 프로그램, 프로세스, 스레드의 정의와 프로세스와 스레드의 구조를 알아보았다.
마지막으로 멀티 프로세스와, 멀티 스레드의 장단점을 알아보았다.

profile
iOS 정복중인 Tabber 입니다.

0개의 댓글