말감로그

24.08.05 운영체제 - 프로세스와 스레드 , 리틀/빅 앤디언 본문

TIL

24.08.05 운영체제 - 프로세스와 스레드 , 리틀/빅 앤디언

habbn 2024. 8. 5. 17:52
728x90

프로세스와 스레드

프로세스

프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이다.

프로세스는 독립적인 주소 공간을 가진다. 이는 프로세스 간의 데이터 공유가 불가능하다.

프로세스는 최소한 하나의 스레드를 가지고 있다.

 

* 프로그램 : 컴퓨터에서 실행 할 수 있는 파일 (.exe),  정적 프로그램(파일을 실행하지 않은 상태)

* 프로세스 : 프로그램이 실행되고 있는 상태, 동적 프로그램

 

프로세스의 자원 구조

프로그램이 실행되어 프로세스가 만들어지면 다음 4가지의 메모리 영역으로 구성되어 할당 받게 된다.

 

① 코드 영역 (Code) : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.

② 데이터 영역 (Data) :  코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다.

③ 스택 영역 (Stack) :  지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 stack 영역을 초과하면 stack overflow 에러가 발생한다.

④ 힙 영역 (Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

 

스레드

스레드는 프로세스 내에서 실행되는 작은 실행 단위이다.

스레드는 프로세스의 주소 공간을 공유하며, 여러 스레드가 동일한 자원에 동시에 접근할 수 있다.

스레드는 프로세스 내에서 스택 메모리 영역을 제외한 메모리 영역(힙, 코드, 데이터)을 같은 프로세스 내 다른 스레드와 공유한다.

 

* 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에, 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다라는 의미이다. 그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 말이다.

즉,  스택을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것이다.

 

프로세스는 다른 프로세스와 정보를 공유하려면 IPC 기법을 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.

 

- 프로세스는 실행 중인 프로그램을 나타내며, 스레드는 프로세스 내에서 실행되는 실행 단위이다.

- 프로세서는 독립적인 주소 공간을 가지고 있으며, 프로세스 간 데이터 공유가 불가능하지만, 스레드는 프로세스의 자원을 공유한다.


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

멀티 프로세스

멀티 프로세스는 여러 개의 독립적인 프로세스가 동시에 실행되는 것이다. 각 프로세스는 독립된 메모리 공간을 가지며, 서로에게 접근하려면 IPC 기법을 사용해야 한다. 각 프로세스는 각각 고유한 자원을 관리하고 있어 서로에게 영향을 미치지 않는다. 하나의 프로세스 작업을 여러 개로 분할 병렬로 처리할 수 있다. 이때, 프로세스는 스레드 단위로 작업을 분할한다.

 

특징

- 안정성이 좋다. 여러 개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않는다.

- 구현이 비교적 간단하고, 각 프로세스들이 독립적으로 동작하며 자원의 서로 다르게 할당된다.

- 프로세스 간 통신을 하기 위해서는 IPC 기법을 통해야 한다.

- 메모리 사용량이 많다.

- 스케줄링에 따른 Context Switch이 많아지고, 성능 저하의 우려가 있다.

 

멀티 스레드

멀티 스레드는 하나의 프로세스 내부에서 여러 개의 스레드가 동시에 실행되는 것이다. 스레드끼리는 서로의 메모리 공간을 공유하고 접근할 수 있다. IPC 통신이 아닌 메모리 기반 통신을 사용하기에 속도가 빠르다. 각 스레드들은 여러 자원을 공유하기에, 하나의 스레드에 문제가 생기면 나머지 스레드들도 영향을 받을 수 있다. 프로세스 내에서 스레드의 작업을 여러 개로 분할 병렬로 처리할 수 있다.

 

특징

- 응답성이 좋다. 프로그램의 일부분(자식 스레드)이 오류 또는 긴 작업으로 인해 중단되어도 프로그램이 계속적으로 수행된다.

- 자원 공유가 쉽다. 스레드들은 부모 프로세스의 자원과 메모리를 공유 할 수 있다.

- 프로세스를 할당하는 것보다 스레드를 할당하는 것이 비용이 적다.

- 동기화 그리고 교착 상태가 발생하지 않도록 주의해야 한다.

- 자식 스레드 중 하나에 문제가 생긴 경우 전체 프로세스에 영향을 줄 수 있다.

- 구현 및 테스트, 디버깅이 어렵다.

 

멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가지는 반면 위험 부담도 따른다.

 

자원의 효율성증대

멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우 프로세스를 생성하여 자원을 할당하는 비용이 적고, 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.

 

응답 시간 단축 및 처리 비용 감소

프로세스 간 IPC를 사용하여 통신하는 것은 상대적을 비용이 크다.

하지만 스레드는 프로세스의 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다.

또한 프로세스간의 Context Switching은 느린 반면 쓰레드 간의 Context Swithching은 빠른데, 그 이유는 스레드는 Stack 영역만 처리하면 되기 때문이다.

 

멀티 스레드의 안정성 문제

여러 개의 스레드가 동일한 데이터 공간(임계 영역)을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제이다.

 

"임계 영역" 또는 "공유 변수 영역"은 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부를 말한다.

 

멀티 프로세스의 프로그램은 문제가 생기면 해당 프로세스가 중단되거나 중단시키고 다시 시작하면 된다. 

하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.

 


리틀 앤디언, 빅 앤디언

 

앤디언 - 컴퓨터의 메모리와 같은 1차원 연속 배열에서 원소들을 어떻게 배열하는지에 대한 방법

빅 앤디언 리틀 앤디언
큰 단위 바이트가 앞으로
사람이 읽기 편한 방식으로 저장
사람이 읽는 방식과 같아 디버깅이 편함
주로 네트워크 주소에 사용
작은 단위 바이트가 앞으로
아래 자리부터 보기 때문에 사칙연산에서 이점
x86 프로세서(컴퓨터)는 이 방식을 사용

 

바이 앤디언

리틀 앤디언과 빅 앤디언을 모두 지원하고, 필요에 따라 모드를 전환할 수 있다.

ARM 및 PowerPC 아키텍쳐는 바이 앤디언을 지원한다. 

 

미들 앤디언

데이터를 중앙에서 바깥쪽으로, 또는 비표준 방식으로 바이트를 배치한다. 

가장 유명한 미들 앤디언 형식 중 하나는 PDP-11 컴퓨터에서 사용된 방식이다.

리틀 앤디언이나 빅 앤디언보다 바이트 순서가 더 복잡해서 현대 컴퓨팅에서는 거의 사용되지 않는다.

 

 

Q1.  'x86 프로세스는 어떤 앤디언일까요?' 

-> 리틀 앤디언입니다. 이는 데이터의 가장 낮은 바이트가 메모리의 가장 작은 주소에 저장되고, 가장 높은 바이트가 메모리의 가장 큰 주소에 저장되는 방식입니다.

반대로 빅 앤디언 방식은 가장 높은 바이트가 메모리의 가장 작은 주소에 저장되고, 가장 낮은 바이트가 메모리의 가장 큰 주소에 저장됩니다. 주로 네트워크 주소에 사용됩니다.

 

Q2. '이 두가지 앤디언 외 다른 건 없나요?'

-> 바이 앤디언과 미들 앤디언이 있습니다. 바이 앤디언은 리틀 앤디언과 빅 앤디언 모두를 지원하고, 필요에 따라 모드를 전환할 수 있습니다. ARM 아키텍쳐가 바이 앤디언을 지원합니다.

미들 앤디언은 데이터를 중앙에서 바깥쪽으로, 다른 비표준 방식으로 바이트를 배치합니다. 하지만 리틀 앤디언과 빅 앤디언보다 바이트 순서가 더 복잡해서 현대 컴퓨팅에선 거의 사용하지 않습니다. 

 

Q3. 'ARM 아키텍쳐는 어떤 앤디언을 사용하나요?'

-> 바이 앤디언을 사용합니다. 성능 향상을 위해 리틀/빅 앤디언을 선택해서 사용할 수 있습니다.

 

728x90