이번에는 Thread에 관련해서 학습할 예정입니다 ! 면접 질문 준비하면서 프로세스는 뭐다, 스레드는 뭐다 라고 간단하게만 알고 있었는데 이번 기회에 조금 더 깊이 공부해보겠습니다 ! 하지만....쉽지 않다는거......😢
❓프로세스와 스레드란 ?
위 그림을 봤을 때 운영체제 안에 프로세스가 존재하고, 프로세스 안에 스레드가 존재합니다.
📦 프로세스
프로세스는 실행 중인 프로그램의 인스턴스입니다. 즉, 우리가 컴퓨터에서 더블 클릭을 해서 프로그램을 켰을 때 하나의 프로세스가 생성된다고 생각하시면 됩니다 ! 각 프로세스는 독립적인 메모리 공간을 가지고 있고, 운영체제에서 별도의 작업 단위로 분리(독립적)해서 관리됩니다 ! 그리고 각 프로세스는 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않으며, 서로의 메모리에 직접 접근할 수 없습니다.
> 프로세스의 메모리 구성
- 코드 섹션 : 실행할 프로그램의 코드가 저장되는 부분
- 데이터 섹션 : 전역 변수 및 정적 변수가 저장되는 부분(그림에서 기타에 포함)
- 힙(Heap) : 동적으로 할당되는 메모리 영역(자바의 힙 영역과 비슷한 개념)
- 스택(Stack) : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)
📝스레드(Thread)
스레드는 프로세스 내에서 실행되는 작업의 단위입니다. 한 프로세스 내에서 여러 스레드가 존재할 수 있으며, 이 스레드들은 프로세스가 제공하는 동일한 메모리 공간을 공유합니다. 프로세스는 반드시 하나 이상의 스레드를 포함해야됩니다.
> 메모리 구성
- 공유 메모리 : 같은 프로세스의 코드 섹션, 데이터 섹션, 힙(메모리)은 프로세스 안의 모든 스레드가 공유합니다.
- 개별 스택 : 각 스레드는 자신의 스택을 갖고 있습니다. 다른 스레드에는 접근할 수 없습니다.
🫠 프로그램이 실행된다는 것의 의미는 ?
프로그램을 실행하면 운영체제는 먼저 디스크에 있는 파일 덩어리인 프로그램을 메모리로 불러오면서 프로세스를 만듭니다.
프로그램이 실행된다는 것은 사실 프로세스 안에 있는 코드가 한 줄씩 실행되는 것이고, 코드는 보통 main()부터 시작해서 하나씩 순서대로 내려가면서 실행됩니다.
비유를 하자면 마치 실(thread) 같은 것이 코드를 위에서 아래로 하나씩 꿰면서 내려가는 것 같이 느껴져 프로세스의 코드를 실행하는 흐름을 스레드(thread)라고 합니다. 스레드를 번역하면 '실', '실을 꿰다' 라는 의미로 해석됩니다.
🤩 멀티스레드가 필요한 이유는 ?
예를 들어 워드 프로그램으로 문서를 편집하면서, 문서가 자동으로 저장되고, 맞춤법 검사도 수행되듯 하나의 프로그램도 그 안에서 동시에 여러 작업이 필요합니다 !
단일 스레드와 멀티 스레드
단일 스레드 : 한 프로세스 내에 하나의 스레드만 존재할 경우
멀티 스레드 : 한 프로세스 내에 여러 스레드가 존재할 경우
🕖 스레드와 스케줄링
운영체제의 스케줄링 과정에 대해 알아보겠습니다 !
위 그림에서 CPU 코어가 1개이고, 프로세스는 2개일 때, 프로세스 A는 스레드 1개 프로세스B는 스레드가 2개 있습니다.
프로세스는 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 실제 CPU를 사용해서 코드를 하나하나 실행하는 것을 스레드입니다.
> 스케줄링 과정
- 프로세스A에 있는 스레드 A1을 실행합니다.
- 프로세스A에 있는 스레드 A1의 실행을 잠시 멈추고 프로세스B에 있는 스레드 B1을 실행합니다.
- 프로세스B에 있는 스레드 B1의 실행을 잠시 멈추고 같은 프로세스의 스레드 B2를 실행합니다.
- 이후 프로세스A에 있는 스레드 A1을 실행합니다.
- 이 과정을 반복합니다.
단일 코어 스케줄링
이번에는 운영체제가 스레드를 어떻게 스케줄링하는지, 스케줄링 관점으로 알아보겠습니다.
운영체제는 내부에 스케줄링 큐를 가지고 있고, 각각의 스레드는 스케줄링 큐에서 대기합니다 !
> 스케줄링 과정
- 스레드A1, 스레드B1, 스레드B2가 스케줄링 큐에 대기합니다.
- 운영체제는 스레드A1을 큐에서 꺼내고 CPU를 통해 실행합니다.
- 이때 스레드A1이 프로그램의 코드를 수행하고, CPU를 통한 연상도 일어납니다.
- 운영체제는 스레드A1을 잠시 멈추고, 스케줄링 큐에 다시 넣습니다.
- 운영체제는 스레드B1을 큐에서 꺼내고 CPU를 통해 실행합니다.
- 이런 과정을 반복해서 수행합니다.
멀티 코어 스케줄링
CPU 코어가 2개 이상이면 한 번에 더 많은 스레드를 물리적으로 진짜 동시에 실행할 수 있습니다.
> 스케줄링 과정
- 스레드A1, 스레드B1, 스레드B2가 스케줄링 큐에 대기합니다.
- 스레드A1, 스레드B1을 병렬로 실행합니다. 스레드B2는 스케줄링 큐에 대기합니다.
- 스레드A1의 실행으 잠시 멈추고, 스레드A1을 스케줄링 큐에 다시 넣습니다.
- 스케줄링 큐에 대기 중인 스레드B1을 CPU 코어 1에서 실행합니다.
- 물론 조금 있다가 CPU 코어 2에서 실행 중인 스레드B2도 수행을 멈추고, 스레드 스케줄링 큐에 있는 다른 스레드가 실행될 것입니다.
- 이런 과정을 반복해서 수행합니다.
🔄 컨텍스트 스위칭이란 ?
멀티태스킹이 반드시 효율적인 것 만은 아닙니다 !
스레드A와 스레드B를 실행할 경우 스레드A를 멈추는 시점에 CPU에서 사용하던 값들을 메모리에 저장해두어야합니다. 그리고 이후 스레드A를 다시 실행할 때 이 값들을 CPU에 다시 불러와야하는 과정을 거쳐야합니다.
이거한 과정을 컨텍스트 스위칭(context switching)이라고합니다.
💭 정리
프로세스는 실행 중인 프로그램의 인스턴스이고, 프로그램 내에서 실행되는 작업의 단위를 스레드라고합니다.
각 프로세스는 독립적인 공간을 가지고 있고, 반드시 하나 이상의 스레드가 있어야합니다.
멀티테스킹이 대부분 효율적이지만 컨텍스트 스위칭 과정이 필요하므로 항상 효율적인 것만은 아닙니다 !
프로세스, 스레드, 스케줄링에 대해 공부하면서 공부해야될 것들은 정말 많다고 막막하다고 느꼈지만....내가 배울 수 있는 것들이 아직 많이 남았구나 ! 라는 럭키비키한 긍정적인 생각으로 마무리해보겠습니다 !
'IT이론 > 네트워크' 카테고리의 다른 글
[CS]캐시, 캐싱이란 ? (2) | 2024.12.31 |
---|---|
[CS] OSI 7 계층이란 ? (0) | 2024.06.27 |
[CS] CORS(Cross-origin Resource Sharing)란 ? (0) | 2024.04.26 |
[CS] SSR과 CSR이란 ? (0) | 2024.04.11 |
[CS/Network] Http 프로그래밍과 Socket프로그래밍이란? (0) | 2024.03.15 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!