프로세스(Process)
: 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
멀티태스킹(Multi Tasking)
: OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드 단위로 나누는 행위
- 코드 영역 : 프로그래머가 작성한 프로그램이 코드 영역에 작성됨
- 데이터 영역 : 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있음
- 스택 영역 : 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하거나 변수 사용 범위에 영향을 미치는 영역을 구현할 때 사용
- 힙 영역 : 동적으로 할당되는 데이터들을 위해 존재하는 공간
- 코드 영역과 데이터 영역은 선언할 때, 그 크기가 결정되는 정적 영역이지만, 스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역임
- 서로 다른 프로세스 간의 메모리 공간 접근은 허용되지 않음
스레드(Thread)
: 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
- 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 가짐
- 스레드는 프로세스 내에서 각각 stack만 따로 할당받고, code, data, heap영역은 공유함
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유
- 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없음
멀티 프로세스(Multi Process)
: 하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
- 특징
- 안전성이 좋음 -> 여러 개의 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않음
- 구현이 비교젹 간단하고, 각 프로세스들이 독립적으로 동작하며 자원이 서로 다르게 할당됨
- 프로세스 간 통신을 하기 위해서는 IPC를 통해야 함
- 메모리 사용량이 많음
- 스케줄링에 따른 Context Switching이 많아지고, 성능 저하의 우려가 있음
cf) IPC(Inter Process Comminication)
: 프로세스 간 소통 방법
- 프로세스는 독립적이거나 다른 프로세스와 협력함
- 독립적인 프로세스는 동시에 실행 중인 다른 프로세스에 영향을 주지 않지만, 협력이 필요한 프로세스의 경우 다른 프로세스에 영향을 주거나 받을 수 있음
- IPC가 필요한 이유
- 정보 공유 : 여러 사용자가 동일한 정보에 관심을 가지면, 이 정보에 동시에 접근할 수 있는 환경을 제공해야 함
- 계산 속도 증가 : 특정 작업(연산)을 빠르게 실행하기 위해서는 작업은 작은 단위로 나누어서 병렬로 실행할 수 있음
- 모듈성 : 시스템 기능을 프로세스 단위 또는 스레드 단위로 나눈 모듈 방식으로 시스템을 구성할 수 있음
- 편리성 : 개별 사용자도 동시에 많은 작업을 수행할 수 있음 (EX. 편집, 인쇄, 컴파일 등)
- 일반적으로 각 프로세스에 할당된 메모리 공간은 고유하기 때문에 직접 다른 프로세스가 접근할 수 없음 -> 이를 해결하기 위해 IPC를 사용
1. Shared Memory Model
: 협력 프로세스 간 공유되는 메모리를 생성한 후, 이를 이용하여 정보를 교환함
- 데이터의 형식과 위치는 프로세스들에 의해 결정되며 운영체제의 소관이 아님 -> 커널의 도움이 거의 필요 없음
- 주로 전역 변수, 공유 변수, 겅유 파일을 통해 통신을 이룸
- 성능은 좋지만 프로세스 간의 동기화 문제가 발생하여 애플리케이션에서 직접 동기화를 해야 함 -> 충돌 가능성이 있음
- 방법
- Shared Memory Model에는 producer 프로세스와 consumer 프로세스가 존재
- 공유 메모리(버퍼)를 통해 동시에 통신
- 생산자가 item을 생산사고 buffer에 저장하면, 소비자는 buffer의 item을 소비
- 가용한 항목이 있을 때만 소비가 이루어지도록 생산자 / 소비자 간의 프로세스는 동기화되어야 함
2. Messaging Passing Model
: OS가 프로세스 간 통신 방법을 제공하고, 메세지를 대리 전달함
- OS가 동기화를 해주기 때문에 안전하고 동기화 문제가 없음
- 시스템 콜을 사용하기 때문에 성능이 떨어짐
Direct vs Indirect
▶ Direct : 프로세스들은 서로의 이름을 명시
- 한 쌍에는 하나의 링크만 존재하고, 1대 1 통신에 사용
- send(P, message) : P로 메세지를 보내라
- receive(Q, message) : Q로부터 메세지를 받아라
▶Indirect : 메세지들이 mailbox(port)를 이용하여 send와 receive가 이루어짐
- 각 mailbox는 고유의 id를 가짐
- send(A, message) : mailbox A로 메세지를 보내라
- receive(A, message) : mailbox A로부터 메세지를 받아라
- 여러 프로세스가 mailbox를 공유할 수 있음
- blocking
- Blocking send : 송신자는 수신자가 메세지를 받을 때까지 blocked되는 것
- Non - blocking send : 송신자는 메세지를 보내고 자기 할 일을 하는 것
- Blocking receive : 수신자는 메세지를 모두 다 받을 때까지 blocked되는 것
- Non - Blocking receive : 수신자가 메세지가 왔는지 수시로 검사하는 것
3. IPC 종류
1) Pipe
- 익명 Pipe
: 단방향 통신 채널
- 한 쪽은 보내기만 하고, 반대 쪽은 받기만 함
- 이때, pipe는 오로지 부모 / 자식 간에만 생성이 가능
- 양방향 통신을 위해서는 pipe가 2개 필요함
- 대신 read(), write()가 기본적으로 block모드로 작동 -> 프로세스가 read 대기 중이면 write를 할 수 없음
- Named Pipe(FIFO)
: 이름을 가진 pipe를 통해서 프로세스 간의 양방향 통신을 지원함
- 서로 다른 프로세스들이 pipe의 이름을 알면 통신이 가능
2) Message Queues
: 메모리를 사용한 pipe이며, 구조체를 기반으로 통신
- 메세지 타입에 따라 구조체 종류를 다르게 받을 수 있으며, 여러 프로세스가 동시에 데이터를 다룰 수 있음
- 커널에서 제공하기 때문에 메모리 제한이 있을 수 있음
멀티 스레드(Multi Thread)
: 하나의 프로그램을 여러 개의 스레드로 구정하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것
- 특징
- 응답성이 좋음 -> 프로그램의 자식 스레드가 오류 또는 긴 작업으로 인해 중단되어도 프로그램이 계속적으로 수행됨
- 자원 공유가 쉬움 -> 스레드들은 부모 프로세스의 자원과 메모리를 공유할 수 있음
- 멀티 프로세스 구조에서 각각의 스레드가 다른 프로세스에서 병렬로 수행될 수 있음
- 구현 및 테스트, 디버깅이 어려움
- 너무 많은 스레드 사용은 오버헤드를 발생시킴
- 동기화 그리고 교착 상태가 발생하지 않도록 주의해야 함
- 자식 스레드 중 하나에 문제가 생긴 경우, 전체 프로세스에 영향을 줄 수 있음
'운영체제' 카테고리의 다른 글
추가적인 내용 (0) | 2025.01.19 |
---|---|
5. 인터럽트(Interrupt) (0) | 2025.01.16 |
4. CPU 스케줄링 알고리즘 (0) | 2025.01.16 |
2. 메모리 계층 (0) | 2025.01.16 |
1. 운영체제와 컴퓨터 (1) | 2025.01.14 |