[OS] 프로세스와 스레드
프로세스와 스레드는 정말 중요한 개념이지만, 잘 모르고 어물쩡 넘어가는 경우가 많은 것 같아 다시 한 번 정리해보려 한다. (VER20240314)
목차
- 프로세스 Process
- 프로세스의 구조
- 프로세스의 생성
- 프로세스의 제거
- 프로세스의 상태
- 프로세스 문맥 교환
- 스레드 Thread
- 스레드의 발생
- 스레드 VS 프로세스
- 스레드의 상태 변화
- 멀티 스레드 Multi-Thread
- 스레드의 구현
- RECOMMEND FOR YOU & REFERENCE
프로세스 Process
프로세스란 무엇일까?
프로세스를 정의하는 말은 정말 많지만, 개중 가장 대표적인 정의는 '실행되고 있는 (실행중인) 작업 또는 프로그램'이다.
자세히 정의를 보자면
그렇다고 프로그램이 프로세스인 것은 아니다.
Chrome 브라우저를 여러 개 띄운다고 해보자. 프로그램은 Chrome 브라우저 하나겠지만, 프로세스는 여럿이 실행되고 있는 상황이 된다.
추가로 프로세서는 프로세스를 실행하는 주체, 즉 CPU를 말한다.
하나의 프로세서는 한 순간에 하나의 작업만 실행할 수 있다. 우리가 여러 작업을 한 번에 수행한다고 느끼는 이유는 프로세서가 굉장히 빠른 속도로 작업을 스위칭하기 때문이다.
프로세스의 구조
프로세스는 실행 중 생성 시스템을 호출하여 새로운 프로세스 생성이 가능하며, 생성 순서로 부모-자식 관계가 형성된다 - 즉 계층 구조이다.
프로세스의 생성
프로세스 생성 시 RAM에는 코드, 데이터, 힙, 스택이 생기는데 각각은 다음과 같은 것들을 저장한다.
- 코드 : 기계어로 코드를 저장하며, Read-Only이다.
- 데이터 : 전역변수, static 변수 등을 저장하며 Read-Write가 가능하다.
- 힙 : 동적으로 할당된다.
- (빈 공간) : 힙은 아래로 내려오면서, 스택은 위로 올라오면서 이 빈 공간을 채운다.
- 스택 : 지역변수, 리턴값, 매개변수, 돌아올 주소 등 없어질 것을 저장한다.
또한 프로세스가 생성될 때에는 메모리에 PCB (Process Control Block, 프로세스 제어 블록) 도 생성된다.
PCB는 TCB(Task Control Block, 작업 제어 블록)로도 부르며, 생성과 삭제를 프로세스와 함께한다.
PCB에는 운영체제가 특정 프로세스를 제어할 때 필요한 상태 정보를 저장한다. 저장 내용 예시로는 프로세스 식별자, 상태, 프로그램 카운터, 레지스터 저장 영역, 스케줄링 정보, 계정 정보, 입출력 상태 / 메모리 관리 정보 등이 있다.
프로세스의 제거
프로세스는 파괴되고, 사용중이던 자원은 반환된다. 해당 프로세스의 PCB가 차지하고 있던 메모리 공간 역시 회수되며, 프로그램은 디스크에 저장된다.
자식 프로세스의 경우 부모 프로세스가 사라지면 자동으로 제거된다.
프로세스의 상태
프로세스는 상태를 갖는다.
가장 기본적인 상태 5개에 중단된 상태 2개를 합하여 총 7개의 상태가 있는데, 상태 전이도를 보면서 알아보자.
- 생성
- 새 프로세스에 식별자와 주소 공간, PCB 공간 등을 할당한다.
- PCB를 초기화하고 링크를 건다. - 준비
- 프로세서를 할당받으려고 대기 중인 상태이다.
- 실행 상태로 넘어가면 dispatch(PROCESS_NAME)이라고 한다. - 실행
- 프로세서를 점유 중이며, 작업이 진행되고 있는 상태이다.
- 이벤트나 입출력 신호가 발생할 경우 대기(보류) 상태로 넘어가며, 이를 block(PROCESS_NAME)이라고 한다.
- 프로세서 점유 시간이 끝날 경우 준비 상태로 넘어가며, 이를 timeout(PROCESS_NAME)이라고 한다. - 대기 (보류)
- 대기 (보류) 상태에서 이벤트 / 입출력이 완료되면 준비 상태로 돌아오며, 이를 wakeup(PROCESS_NAME)이라고 한다. - 종료
- 프로세스가 실행 중 마지막 명령 실행 후 종료, 삭제를 요청한다.
- 부모가 먼저 종료되거나 자식이 비정상적으로 종료된 경우 좀비 프로세스가 되어 메모리를 차지하며, 재부팅을 통하여 해결할 수 있다. - 중단된 준비
- 준비 상태에서 중단될 경우 해당 상태로 넘어간다.
- 재시작을 통해 준비 상태로 되돌아갈 수 있다. - 중단된 대기
- 대기 상태에서 중단될 경우 해당 상태로 넘어간다.
- 재시작을 통해 대기 상태로 되돌아갈 수 있다.
프로세스를 중단 이후 재시작하며 시스템 전제의 부하를 줄일 수 있다. (다중 프로그래밍 환경에서 중단은 입출력 요구가 발생했거나 자원이 부족한 상태이다.) 장시간 중단 시 프로세스에 할당된 자원은 반환된다.
프로세스 문맥 교환
문맥 교환 이전 프로세스의 상태 레지스터 내용은 보관하고, 다른 프로세스의 레지스터를 적재하여 프로세스를 교환하는 일련의 과정이다.
실행 중인 프로세스에 인터럽트 Interrupt 가 발생 시 일어날 수 있다. (인터럽트가 발생해도 프로세스 재시작이 가능하므로 항상 문맥 교환이 발생하진 않는다)
문맥 교환 과정
- 커널의 사용자 모드에서 실행 중이던 프로세스 P1은 종료되면서 운영체제 모드로 전환된다.
- 운영체제 모드에서 P1의 하드웨어 상태를 PCB1에 저장하고, 다음으로 실행할 프로세스 P2를 선택한다.
- PCB2에서 P2 정보를 얻어 프로세서에 저장하고, 사용자 모드로 전환하여 P2를 실행한다.
프로세스 스케줄러
PCB의 우선순위를 이용하여 준비 큐 프로세스를 처리한다.
준비 상태에 있는 프로세스는 입출력 중심과 CPU 중심으로 구분된다.
- 입출력 중심
- 느린 속도
- 빠른 응답 요구에 높은 우선 순위를 부여
- CPU를 짧게 자주 사용
- CPU 중심
- CPU를 길게 사용
- 사용 횟수를 줄여서 균형 유지
스레드 Thread
스레드는 프로세스를 더 작게 나눈 단위로, 프로세스가 작업 하나라면 스레드는 동작 하나이다.
스레드의 정의를 더 자세히 살펴보자면, 프로세서의 특성인 자원과 제어에서 제어만 분리한 실행 단위이다.
프로세스 하나는 한 개 이상의 스레드로 분리 가능하며, 이 때 스레드가 1개만 있는 경우 싱글 스레드, 2개 이상이 있는 경우 멀티 스레드로 부른다.
같은 프로세스의 스레드는 스택 공간만 독립적으로 가지며, 이외의 메모리는 동일한 주소 공간을 공유하게 된다.
스레드의 발생
소프트웨어가 점점 더 많은 자원을 필요로 하고, 동시 작업 등이 늘어나면서 프로세스 생성과 문맥 교환 작업이 많아졌다. 이에 따라 컴퓨터 성능의 저하가 발생했는데, 이 탓에 가벼운 스레드의 생성과 스위칭을 선호하게 되었다.
구현 및 관리 면에서도 프로세스보다는 스레드가 효율적이다.
스레드도 프로세스처럼 제어 블록을 가지며, TCB (Thread Control Block, 스레드 제어 블록) 라고 한다. PCB 안에는 TCB 리스트가 있다.
스레드 VS 프로세스
여기까지만 읽었을 때는 스레드가 프로세스보다 압도적으로 유리하지 않나, 라는 생각이 들 수도 있다.
스레드와 프로세스의 본격적인 차이점을 알아보자.
- 생성 / 종료 시간, 문맥 교환 : 스레드가 더 적은 시간을 소요하여 유리하다.
- 상호작용 : 프로세스는 IPC를 이용하여 통신하며, 오버헤드가 많다. 스레드는 공유 메모리를 사용하여 오버헤드가 적다.
- 자원 소모 : 프로세스가 스레드 대비 많은 자원을 사용한다.
- 독립성 : 프로세스는 각각 독립적인 메모리 공간을 갖지만, 스레드는 스택 이외의 나머지 공간을 공유한다.
- 안정성 : 프로세스가 스레드 대비 안정성이 높다.
안정성이 중요한 서비스의 경우 스레드보다는 프로세스를 이용하는 것이 더 나은 선택일 것이다.
스레드와 프로세스의 본격적인 차이에 대해서는 다른 글에서 알아보도록 하자.
스레드의 상태 변화
프로세스처럼 생성, 준비, 실행, 대기(보류), 종료, 중단된 준비, 중단된 대기 (보류) 등 7가지의 상태를 갖는다.
멀티 스레드 Multi-Thread
프로세서가 여러 개 존재하는 경우 각 프로세서에서 여러 작업이 동시 수행되어 병렬적으로 수행된다. 때문에 멀티 스레드를 통해 병렬성 Parallelism 을 높일 수 있다.
프로세서가 하나일 경우에는 스위칭을 통해 병렬적으로 수행되는 것처럼 보이게 할 수 있다. 이는 동시성 Concurrency 을 높일 수 있는 방안이다.
멀티 스레드의 장점으로는 응답성 Responsiveness, 자원 공유 Resource sharing, 경제성 Economy, 확장성 Scalability 등이 있다.
스레드의 구현
커널 스레드
안정적이지만 유저 모드에서 계속 커널 모드로 바꿔주어야 하므로 성능 저하가 있다.
유저 스레드
안정성은 떨어지지만 성능 저하는 없다.
Many-to-One Model : 스레드 라이브러리로 스레드를 관리하여 효율적이지만, 한 번에 한 유저 스레드만 커널에 접근하므로 병렬 수행이 불가능하며 스레드 중 한 개가 block될 경우 프로세스 전체가 block된다.
One-to-One Model : 동시성을 높여주지만, 커널 스레드가 증가하면서 오버헤드가 커져 성능 저하가 발생할 우려가 있다.
Many-to-Many Model : 어느 정도의 동시성을 갖는 동시에 커널 스레드의 오버헤드 걱정이 없다.
RECOMMEND FOR YOU
커널 :
운영체제 :
병행 프로세스 :
동기와 비동기 :
스케줄링 알고리즘 :
REFERENCE
⎡(그림으로 배우는 구조와 원리) 운영체제 (구현회 저)⎦ : 2016, 한빛아카데미
위키백과 : https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4