프로세스의 정의
메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
운영체제로부터 시스템 자원을 할당받은 작업의 단위
프로세스의 구조
- Code : 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 영역
- Data: 전역변수(Global Variable), 정적변수(Local Variable)의 할당을 위해 존재하는 공간
- Stack: 지역변수 할당과 함수 호출 시 전달되는 인자 값(리턴 값)들을 저장하기 위한 공간 (임시 메모리 영역)
- Heap: 동적 할당 시 사용 (Java의 new(),C의 malloc() 등)
프로세스의 주소 공간(Process Address Space)
프로그램이 실행되면 프로세스 주소 공간이 Memory에 할당(생성)된다.
Process Address Space | |
Code Segment (코드 부분) | 프로그램의 코드가 저장되어 있다. |
읽기만 가능하다 | |
Data Segment (데이터 부분) | 전역 변수(Global Variables) 같은 데이터가 저장되어 있다. |
읽고 쓰기가 가능하다. | |
Stack Segment (스택 부분) | 함수(function)나 지역 변수(Local Variables)가 저장되어 있다. |
읽고 쓰기가 가능하다. |
- Code Segment를 따로 둔 이유
Program의 Code는 Program이 만들어지고(컴파일되고) 나서는 바뀔 일이 전혀 없는Read Only 부분입니다. 그렇기 때문에 몇 개의 Prcess가 실행되더라도 같은 프로그램이라면 Code 부분은 다 똑같은 내용을 가지고 있게 됩니다. 따라서 같은 Program의 Process일 경우 Code 부분을 공유(Share)하여 메모리 사용량을 줄이는 목적입니다.
- Stack Segment와 Data Segment를 나눈 이유
일단 Stack이란 구조해 대해서 알아야 합니다. 하단 부가 막혀있고 상단 부가 뚫려있는 구조입니다. 따라서 한 쪽으로만 데이터를 집어 넣을 수 있고 꺼낼 때는 최근에 집어넣었던 것 부터 꺼낼 수 밖에 없는 구조입니다. 이러한 함수의 Stack 구조로 인해 Data 부분과 Stack 부분을 따로 나눈 것입니다. 전역 변수(global variables)는 어떤 함수에서도 접근 할 수 있기 때문에 Data로 따로 관리를 해주는 것입니다.
멀티 프로세스의 정의
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
멀티 프로세스의 장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 그 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다. (리스크 관리)
- 메모리 침범 문제를 OS 차원에서 해결 가능하다.
멀티 프로세스의 단점
- 각 프로세스가 독립된 메모리 영역 (Code, Data, Heap, Stack)을 가지고 있기 때문에 작업량이 많아지면 문맥 교환(Context Switching)과정에서 오버헤드가 발생한다.
- 프로세스 간의 복잡한 통신(IPC)가 필요하다.
- 문맥 교환(Context Switching)
CPU는 한번에 하나의 프로세스만 처리할 수 있기 때문에, 여러 프로세스를 처리해야 하는 상황에서는 돌아가면서 여러 프로세스 작업을 처리하는데 이 과정을 Context Switching라 한다.
동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 프로세스 제어 블록(PCB)에 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
프로세스 제어블록(PCB, Process Control Block)
- 특정 프로세스에 대한 중요한 정보를 저장하고 있는 커널 내의 자료구조이다.
- 프로세스는 CPU를 할당받아 작업을 처리하다가 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 한다. 이때 작업의 진행 상황을 모두 PCB에 저장한다. 그리고 다시 CPU를 할당받게 되면 PCB에 저장되었던 내용을 불러와 종료되었던 시점부터 다시 작업을 수행한다.
- PCB에 저장되는 정보
- 프로세스 식별자(Process ID, PID) : 프로세스 식별 번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터(Program Counter, PC) : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간 제한, 계정 번호 등
스레드(Thread)의 정의
프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
스레드(Thread)의 특징
- 스레드는 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당받는다.
- 프로세스와 해당 프로세스 내의 다른 스레드와 자원과 공간을 공유하면서 사용한다.
멀티 스레드의 정의
하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
멀티 스레드의 장점
- 프로세스에 비해 메모리 공간과 시스템 자원 소모가 줄어들게 된다.
- 스레드 간 통신시 Data, Heap 메모리 영역을 이용해 데이터를 주고 받으므로 통신 방법이 간단하다.
- 문맥 교환(Context Switching)시 PCB 및 캐시 메모리르 비울 필요가 없기 떄문에 비용이 적고 더 빠르다.
멀티 스레드의 단점
- 서로 다른 스레드가 Data, Heap 영역 등을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어보거나 수정할 수 있다. 즉, 자원 공유 동기화 문제가 발생한다.
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 주의 깊은 설계가 필요하며 디버깅이 까다롭다.
Thread-Safe
멀티스레드 환경에서 여러 스레드가 동시에 사용되어도 안전하다는 것을 말한다.
여러 스레드가 프로세스의 공유 자원(하나의 객체 및 변수)에 접글할 때, 공유 자원의 무결성을 보장하는(=자원 동기화가 잘 되지 않는 이슈 없이 의도한 대로 동작하는) 것을 말한다.
Thread-Safe 를 지키기 위한 방법
- Mutual Exclusion (상호 배제)
일반적으로 많이 사용되는 방식
공유자원에 하나의 Thread만 접근할 수 있도록, 세마포어/뮤텍스로 락을 통제하는 방법
- Atomic Operation (원자 연산)
공유 자원에 원자적으로 접근하는 방법
Automic
공유 자원 변경에 필요한 연산을 원자적으로 분리한 뒤,
실제로 데이터의 변경이 이루어지는 시점에 Lock을 걸고,
데이터를 변경하는 시간 동안, 다른 쓰레드의 접근이 불가능하도록 하는 방법
- Thread-Locla Storage (스레드 지역 저장소)
공유 자원의 사용을 최대한 줄이고, 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법
일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식
- Re-Entrancy (재진입성)
스레드 호출과 상관없이 프로그램에 문제가 없도록 작성하는 방법
멀티 스레드 vs 멀티 프로세스
- 멀티 스레드는 멀티 프로세스보다 적은 메로리 공간을 차지하고 문맥 교환(Context Switching)이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험을 갖고 있다.
- 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.
- 두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
멀티 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나눠가며 하는 이유
- 운영체제가 시스템 자원을 효율적으로 관리하기 위해 스레드를 사용한다.
- 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 프로세스 간의 통신보다 스레드 간의 통신 비용이 적으므로 작업들 간 통신의 부담이 줄어든다. (프로세스는 독립구조이기 때문에 처리비용 감소)
무조건 멀티스레드가 좋은가?
- 스레드를 활용하면 자원의 효율성이 증가하기도 하지만, 스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제가 발생할 수 있어 프로그래머의 주의가 필요하다.
'CS' 카테고리의 다른 글
22.11.25 / CS특강 / UDP (0) | 2022.11.29 |
---|---|
22.11.25 / CS특강 / OSI 7계층 (0) | 2022.11.29 |
22.11.18 / CS특강 / 동기 비동기 (0) | 2022.11.20 |
22.11.11 / CS특강 / CPU (0) | 2022.11.19 |
레지스터의 종류 (0) | 2022.11.19 |