스레드(Thread)
프로세스를 구성하는 실행의 단위이다. 조금 더 정확하게 표현하자면 스레드란 프로세스를 구성하는 실행의 흐름 단위이다. 그리고 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다. 그러므로 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
단일 스레드 프로세스
실행 흐름이 하나인 프로세스이다. 즉 한의 작업만을 동시에 처리할 수 있다. 그러므로 작업이 순차적으로 진행된다.
멀티 스레드 프로세스
멀티 스레드 프로세스에서는 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다. 그러므로 여러 작업이 동시에 진행될 수 있다.
스레드의 구성 요소
실행에 필요한 최소한의 정보들이다. 이를 이용해서 독립적으로 실행된다.
01 스레드 ID(Thread ID)
각 스레드는 고유한 스레드 ID를 가지고 있다. 이를 통해 각각의 스레드를 구분한다.
02 프로그램 카운터(Program Counter)
프로그램 카운터는 스레드가 다음에 실행할 명령어의 위치를 가리킨다.
03 레지스터 값
각 스레드는 레지스터값을 가지고 있다.
04 스택(Stack)
스레드는 자체적인 스택의 값을 가지고 있다. 스택은 메서드 호출과 로컬 변수의 관리에 사용되며 각 스레드는 독립적인 스택을 유지한다.
그림에서 확인할 수 있는 Thread마다 프로그램 카운터, 스택 따로 갖고 있다. 서로 각기 다른 프로그램을 실행할 수 있다.
그러므로 Thread는 프로그램을 실행하는데 필요한 최소한의 정보를 유지한 채 이런식으로 병행해서 실행된다.
정리
스레드는 프로세스 내에서 독립적으로 실행되지만 프로세스를 이루는 스레드들은 프로세스의 자원을 공유한다.
최근에는 CPU한테 작업을 할당할 때 프로세스를 통째로 전달하기보다는 스레드 단위로서 CPU를 할당받아서 사용하고 할당을 해제하고 이런 식으로 사용한다. 스레드 간의 자원 공유와 통신이 상대적으로 간단하며 스레드는 프로세스보다 가볍기 때문에 더 빠르게 생성되고 제거되기 때문이다.
멀티 프로세스와 멀티 스레드
동일한 작업을 수행하는 단일 스레드 프로세스 여러개 실행 VS 하나의 프로세스를 여러 스레드로 실행
둘 다 "hello, os"라고 하는 문자열이 화면에 3번 출력된다. 똑같은 결과가 나오는데 어떤 차이가 있을까?
프로세스끼리는 기본적으로 자원을 공유하지 않지만 Thread끼리는 같은 프로세스 내의 자원을 공유한다는 큰 차이점이 있다. 프로세스 끼리는 기본적으로 서로 남남처럼 실행되면서 자원을 공유하지 않지만 Thread끼리는 같은 프로세스 내의 자원을 공유하면서 실행된다라는 차이점이 있다.
멀티 프로세스
01 프로세스 생성
fork를 이용해서 프로세스를 생성할때 새로운 프로세스가 만들어지면 해당 프로세스의 코드, 데이터, 힙 영역 등 모든 자원이 복제되어 메모리에 저장된다.
02 메모리 공간 독립
각각의 프로세스는 독립적인 공간을 가지며 프로세스 간에는 자원을 공유하지 않는다. 따라서 어느 프로세스가 변경이 되더라도 다른 프로세스에 영향을 미치지 않는다.
03 쓰기 시 복사 기법(Copy-on-Write)
쓰기 시 복사 기법을 메모리를 통째로 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는다. 처음으로 쓰기 작업이 발생할 때에만 복제한다. 이로써 자원을 효율적으로 활용할 수 있다.
04 IPC(Inter-Process Communication)
프로세스간에도 데이터를 주거나 받거나 할 수 있다. 프로세스는 독립적으로 실행되며 각자의 메모리 공간을 가지기 때문에 명시적인 방법으로 통신해야 한다. 파일을 통한 IPC , 공유 메모리를 통한 IPC등이 있다.
멀티 스레드
스레드들은 각기 다른 스레드 ID, (별도의 실행을 위해 꼭 필요한)
01 스레드 생성
스레드는 같은 프로세스 내에서 생성되기 때문에 코드,데이터,힙은 공유하고 스택은 각 스레드마다 독립적으로 할당된다. 그리고 스레드들은 각기 다른 스레드 ID를 가진다.
02 메모리 공간 공유
프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유한다. 그러므로 협력과 통신에 유리하다.
그렇다면 멀티 스레드는 장점만 갖고 있을까?
그렇지 않다 멀티 스레드도 단점이 있다. 프로세스 자원을 공유하기 때문에 하나의 스레드에 문제가 생겨버리면 전체 프로세스에 문제가 생길 수 있다.
결론
멀티 프로세스는 안전성이 높고 독립성이 보장되지만 자원 소모가 크고 통신 오버헤드가 있을 수 있다. 반면 멀티 스레드는 자원을 효율적으로 활용할 수 있지만 동기화 문제에 주의해야 하며 스레드 간의 오류가 전체 프로세스에 영향을 미칠 수 있다.
참고 : 본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard
'책 > 혼공 컴퓨터구조+운영체제' 카테고리의 다른 글
운영체제 - 동기화, 공유 자원, 임계 구역, 상호 배제 (1) | 2024.02.01 |
---|---|
운영체제 - CPU스케줄링 알고리즘(선입 선처리, 최단 작업 우선, 라운드 로빈, 최소 잔여 시간 우선, 우선순위, 다단계 큐, 다단계 피드백 큐) (0) | 2024.01.21 |
운영체제 - 프로세스 상태, 프로세스 계층 구조(부모 프로세스, 자식 프로세스), 프로세스 생성 기법(fork,exec) (0) | 2023.12.15 |
운영체제 - 프로세스 개요, 프로세스 제어 블록, 문맥 교환, 프로세스 사용자 영역 (1) | 2023.12.15 |
운영체제 - 운영체제의 큰 그림(커널,이중모드(사용자모드,커널모드),시스템호출) (0) | 2023.12.07 |
댓글