OS

운영체제 프로세스 스레드 메모리 구조

1. 프로그램(Program)

어떤 작업을 위해 실행할 수 있는 파일로 정의할 수 있습니다.

2. 프로세스(Process)

의미

사전적 의미로는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 또는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적 개체)
즉, 운영체제로 부터 시스템 자원을 할당받는 작업의 단위이며 실행된 프로그램을 의미한다.

할당 시스템 자원

CPU시간, 운영시 필요한 주소공간 Code, Data, Stack, Heap의 구조로 되어있는 독립된 메모리 영역

특징

프로세스 메모리 영역

프로세스는 각각 도립된 메모리 영역(Code, Data, Stack, Heap)구조를 할당받게 되며 프로세스당 최소 1개의 메인스레드를 가지고 있습니다.
각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없습니다.
만약, 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스간의 통신(IPC, inter-process communication)을 사용해야합니다.
하나의 예로 pipe, file, socket

3. 스레드(thread)

의미

프로세스 내에서 실행되는 여러 흐름의 단위이며 프로세스의 특정한 수행 경로입니다. 즉, 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다.

특징

스레드 메모리 영역

스레드는 프로세스 내에서 각각 Stack만 할당받고 Code, Data, Heap영역은 공유됩니다. 그리고, 한 프로세스 내에서 동작되는 여러 실행의 흐름이며 프로세스내의 주소공간이나 자원(Heap) 등과 같은 프로세스 내에 스레드끼리 공유하면서 실행이 됩니다. 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유하지만 프로세스는 다른 프로세스의 메모리에 직접 접근은 불가능합니다.
각각의 스레드는 별도의 레지스터스택을 갖고 있지만 힙 메모리는 서로 읽고 쓸 수 있습니다. 또한, 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(Sibling thread)도 변경된 사항을 확인 할 수 있습니다.

4. 멀티 프로세스(Multi Process)

멀티프로세싱 의미

하나의 응용프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 Task를 수행하는것을 일컫는 말.

특징

여러 개의 자식프로세스 중 하나의 문제가 발생하면 그 자식프로세스만 영향을 받으며 그 외에는 다른 영향을 끼치지 않습니다.
Context Switching 오버헤드가 발생할 수 있는데, 그 과정에서 캐시 메모리 등 무거운 작업이 진행과 Task수행에 있어서 시간 소모 및 오버헤드가 발생하게 됩니다.
프로세스각각의 독립된 메모리 영역할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어 Context Switching이 발생하면 캐시에 있는 모든 데이터를 리셋하고 다시 캐시 정보를 불러와야 합니다.
프로세스각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유 할 수 없습니다.

5. Context Switching

CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context Switching이라 합니다. 즉, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했든 프로세스의 상태를 복구하는 작업을 일컫는 말입니다.

6. 멀티 스레드(Multi Thread)

멀티 스레딩

하나의 응용프로그램을 여러개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는것입니다.
WIndow, Linux 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티스레딩을 기본으로 하고있습니다.
대표적인 멀티스레딩의 예는 웹서버를 들 수 있습니다.

특징

장점으로는 시스템 자원 소모 감소로 자원의 효율성을 가져다 줄 수 있습니다. 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 효율적으로 자원을 관리 할 수 있습니다.
시스템 처리량이 증가되어 처리비용을 감소시킬 수 있습니다. 스레드간 데이터를 주고 받는것이 간단해지고 시스템 자원의 소모가 줄어들게 됩니다. 스레드 사이의 작업량이 작아 Context Switching이 빠르고 간단한 통신방법으로 인한 프로그램 응답시간을 단축시킬 수 있습니다. 즉, 스레드는 프로세스내의 Stack영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적게 됩니다.

단점으로는 주의 깊은 설계가 요구되고 디버깅이 까다롭게 됩니다. 그리고 단일 프로세스 시스템을 사용할 경우 효과를 기대하기 어렵고 다른 프로세스에서 스레드를 제어할 수 없습니다. 즉, 프로세스 밖에서 스레드를 제어하기에는 어려움이 나타나게 됩니다.

멀티 스레딩의 가장 큰 문제점인 자원의 공유 동기화 문제가 나타날 수 있으며 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받게됩니다.

7. 멀티프로세스 VS 멀티스레드

비교

프로그램을 여러개 키는것보다 하나의 프로그램안에서 작업을 해결하는것이 효율성이 더 좋으며 여러 프로세스의 작업을 단일 프로세스에서 여러스레드로 나눠가면서 하는 이유는 여러가지가 있습니다.

특징

대표적인 장점은 첫번째, 자원의 효율성을 증대시켜 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다. 프로세스간의 Context Switching시 단순히 CPU 레지스터 교체뿐만아니라 RAM, CPU사이의 캐시메모리에 대한 데이터까지 초기화되므로 오버헤드가 크게 발생할 수 있습니다.
그리고 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드간의 데이터를 주고 받는것이 간단해지고 시스템 자원 소모가 줄어들게됩니다.
두번째, 처리 비용 감소 및 응답 시간 단축이 가능합니다. 스레드는 Stack영역을 제외한 모든 메모리를 공유하기 때문에 프로세스간의 통신(IPC)보다 스레드간 통신비용이 적으므로 작업들간의 통신 부담이 줄어들게됩니다. 그리고, 프로세스간의 전환 속도보다 스레드간의 전환속도가 더 빠릅니다.

동기화 문제

스레드간의 자원 공유는 전역 변수 데이터세그먼트를 이용하므로 함께 상용할때 충돌이 발생할 가능성이 높습니다.

8. PCB(Process Control Block)

PCB
프로세스 제어블록(PCB)는 특정한 프로세스를 관리 할 필요가 있는 정보를 포함하는 운영체제 커널의 자료구조이며 운영체제가 프로세스를 표현한 것이라 할 수 있습니다.
운영 체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스를 PCB라고 합니다. 운영체제에서 프로세스는 PCB로 나타내어지며 PCB는 프로세스의 주요 정보를 가지고 있습니다. 각 프로세스가 생성될 때 마다 고유의 PCB가 생성되고 프로세스가 완료되면 PCB는 제거됩니다.

특징

프로세스는 CPU를 점유하여 작업을 처리하다가도 상태가 전이되면 진행하던 작업 내용을 모두 정리하고 CPU를 반환해야하는데 진행하던 작업들을 저장하지않으면 추후에 어떤작업을 해야할지에 대한 정보를 알 수 없습니다.

, 프로세스는 CPU가 처리하던 작업의 내용들을 자신의 PCB에 저장하고 그 후에 다시 CPU를 점유하여 작업을 수행해야할 때 PCB로 부터 해당 정보들을 CPU에 넘겨와서 계속해서 하던 작업을 진행할 수 있습니다.

PCB에서 제공하는 정보

Process Control Block

  • 1)프로세스 식별자(Process ID)
  • 2)프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated) 상태가 있습니다.
  • 3)프로그램 계수기(Program Counter) : 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다
  • 4)CPU 레지스터 및 일반 레지스터
  • 5)CPU 스케줄링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
  • 6)메모리 관리 정보 : 해당 프로세스의 주소 공간 등
  • 7)프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
  • 8)입출력 상태 정보 : 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등
  • 9)포인터 : 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등.