프로세스(Process)와 스레드(Thread)
가장 기초가 되는 기본 OS 개념 프로세스와 스레드
프로세스란?
- 프로세스란 메모리 상에서 실행중인 프로그램을 말한다.
- 프로세스 내부에는 최소 하나의 스레드(Thread)를 가지고 있다.
- 프로그램을 실행하면 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라고 불린다.
프로세스의 상태(State)
- 프로세스는 상태(state)가 변경되며 수행된다.
- Running: CPU를 잡고 *instruction 을 수행중인 상태
- Ready: CPU를 기다리는 상태
- Blocked (waiting, sleep): 프로세스 자신이 요청한 event가 즉시 만족되지 않아, 이를 기다리는 상태
PCB (Process Control Block)
- PCB는 운영체제가 프로세스를 표현한 자료구조이다. 특정 프로세스에 대한 정보를 갖고 있다.
각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
프로세스 간 문맥교환이 일어나면서, 프로세스는 진행하던 작업들을 PCB에 저장하고, 이후에 자신의 순서가 왔을 때 이어서 처리한다.- OS 가 관리상 사용하는 정보
- Process state, Process ID
- Scheduling information, priority(우선순위)
- CPU 수행 관련 하드웨어 값
- OS 가 관리상 사용하는 정보
문맥교환 (Context Switch)
- 하나의 프로세스가 이미 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하기 위해 이전 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 적재하는 것
이 과정에서 운영체제는 타이머 인터럽트 처리 루틴으로 가서 직전까지 수행중이던 프로세스 A의 문맥을 자신의 PCB에 저장하고, 프로세스 B는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원 시키는 과정을 거치게 된다. - CPU가 동시에 여러개의 프로세스를 실행시키는 것처럼 보이지만, 사실은 CPU가 재빠르게 여러 프로세스를 번갈아가며 실행하고 관리하고 있는 것. 이 때 프로세스를 번갈아가면서 처리하는 것을 Context Switching(문맥교환) 이라고 한다.
스레드(Thread)란?
- 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생한다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
- 즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 가장 작은 시퀀스이다.
프로세스와 스레드의 차이점
- 운영체제는 프로세스마다 독립된 메모리 영역을 할당한다. 각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 데이터에 접근할 수 없다.
- 스레드는 메모리를 서로 공유할 수 있다. 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 메모리 영역을 공유한다.
스레드가 메모리를 공유하는 이유?
- 스레드는 흐름의 단위이다. CPU 입장에서 최소 작업 단위가 된다.
반면 운영체제는 이렇게 작은 단위까지 직접 작업하지 않기 때문에 운영체제의 관점에서는 프로세스가 최소 작업단위가 된다.
하나의 프로세스는 하나 이상의 스레드를 가진다.
따라서 운영체제 관점에서는 프로세스가 최소 작업 단위인데, 같은 프로세스 소속의 스레드끼리 메모리를 공유하지 않을 수 없다.
스레드 생성 시에 운영체제(OS)가 관여한다던데?
스레드에는 크게 세 가지 종류가 있다.
- 커널 수준 스레드 (1:1 매핑)
- 사용자 수준 스레드 (N:1 매핑)
- 혼합 스레드 (N:M 매핑)
이 문서에서 말하고 있는 스레드는 코드 레벨에서 사용하는 2번 사용자 수준 스레드이다.
따라서 OS가 스레드 생성 및 삭제에 관여하지 않는다.
그렇다면 스택을 스레드마다 독립적으로 할당하는 이유?
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소 값 및 로컬 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다.
따라서 스레드 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
멀티태스킹, 멀티스레드
멀티태스킹
- 멀티태스킹이란 하나의 운영체제에서 여러 프로세스가 실행되는 것이다.
멀티스레드
- 하나의 프로세스가 여러 작업을 여러 스레드를 사용해 동시에 처리하는 것을 의미한다.
멀티스레드의 장점
- 멀티태스킹에 비해 Context-Switching 시 메모리 자원을 아낄 수 있다. (메모리 일부를 공유하고 있기 때문에)
- 스택을 제외한 모든 메모리를 공유하기 때문에 통신 부담이 덜해, 응답 시간이 빠르다.
멀티스레드의 단점
- 스레드 하나가 프로세스 내 자원 망쳐버린다면 프로세스 전체가 종료될 수 있다.
- 자원을 공유하기 때문에 동기화 문제 발생할 수 밖에 없다. 교착상태가 발생하지 않도록 주의해야 한다.
동기화 문제?
- 멀티스레드를 사용하면 어떤 스레드가 먼저 작업할지 순서를 알 수 없다.
만약 A 스레드가 어떤 자원을 사용하다가 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A가 해당 자원에 접근하지 못하거나,
바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
이처럼 여러 스레드가 함께 전역 변수를 함께 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 합니다.
비동기와 멀티스레딩의 차이?
- 비동기란 여러개의 작업을 시작 순서와 관계 없이 번갈아 진행하는 것을 의미한다. (순서)
- 멀티스레딩이란 그저 여러개의 스레드를 이용해서 작업하는 것을 의미한다. (공간)
그럼 여러개의 스레드를 사용해서 작업하면 비동기라고도 볼 수 있는 것 아닌가?
- 엄밀히 따지면 답은 '아니오' 이다. 3개의 스레드를 사용하는 작업이 있다고 가정하자.
그런데 만약 1번 스레드의 작업이 끝나고 나서 2번 스레드가 동작, 2번 스레드의 작업이 끝나고 나서 3번 스레드가 동작한다면?
이러한 방식은 비동기라고 할 수 없다. 이러한 케이스는 동기 - 멀티스레드 로 보는 것이 맞다.
정말 프로세스 간에는 정보 공유가 불가능할까?
- 가능하게 하는 방법이 존재한다.
하지만 이 경우에는 CPU 레지스터 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다.
- IPC(Inter-Process Communication) 사용
- LPC(Local-Process Communication) 사용
- 별도의 공유 메모리를 만들어 정보를 주고받도록 설정
IPC(Inter-Process Communication)
- 크게 두 가지의 방법이 있다.
- Message Passing: 메시지를 전달하기 위해 커널을 이용한다. 이 과정에서 User Level과 Kernel Level을 넘나들게 되고 매번 System call 이 호출되어 오버헤드가 발생한다.
- Shared Memory: 공유 공간이 존재하기 때문에 커널 의존성이 낮고 속도도 빠르다. 하지만 공유 공간에 대한 제스이 존재한다.
추가해서 정리할 주제
- 커널 스레드, 혼합 스레드
'OS > Common' 카테고리의 다른 글
스레드 풀(Thread Pool) (1) | 2024.07.16 |
---|