이번글은 프로세스와 스레드에 대해 알아보도록 하겠습니다.
CPU와 코어
그전에! CPU를 잠깐 다시살펴보면 "명령어를 실행하는 부품"을 CPU로 설명을 많이 드렸었는데
현대의 CPU는 "명령어를 실행하는 부품"들로 이루어진 부품입니다.
이 명령어를 실행하는 부품을 "코어"라고합니다.
제 CPU의 성능은 이렇습니다.
클럭이 3.35GHz 정도이고 코어가 8개, 논리 프로세서가 16으로 잡히네요...
코어안에는 필수레지스터들(프로그램 카운터)과 ALU L!, L2 캐시 등등 많이 들어있을 텐데 이것들이 총 8개 있다는 말입니다.
그리고 논리 프로세서는 16개로 코어 하나당 하드웨어적 스레드가 2개씩 있다고 보면 되겠습니다.
보통 "스레드"라고 하면은 프로세스 상의 스레드를 떠올리시기 쉬운데
스레드는 뭐냐? 하시면 "실행의 흐름 단위"입니다.
근데 이렇게만 외우시면 이해가기가 힘들고
"스레드"는 크게 두가지로 나뉩니다. 하나는 하드웨어적 스레드, 하나는 소프트웨어적 스레드 입니다.
여기서 소프트웨어적 스레드가 일반적으로 생각하시는 프로세스같은데의 스레드입니다.
"하드웨어적 스레드"는 "하나의 코어가 동시에 처리하는 명령어 단위"를 뜻합니다
제 CPU는 하나의 코어로 여러 명령어(2게)를 처리할 수 있으니까 "멀티 스레드 프로세서" 혹은 "멀티 스레드 CPU"라고 말 할 수있습니다.
"소프트웨어적 스레드(이하 스레드)" 는 "하나의 프로그램에서 독립적으로 실행되는 단위"를 뜻합니다.
그래서 제 CPU는 한번에 16개의 명령어를 처리할 수 있는데 메모리의 입장에서 보면 16개의 명령어가 처리되는 것처럼 보이기 때문에 (실제로도 그렇습니다) 논리 프로세서가 16개로 잡히는 것입니다.
즉, 하드웨어적 스레드를 "논리 프로세서"라고 부릅니다.
햇갈리시면 안되는 부분이 1코어 1스레드인 CPU도 하나의 프로세스에서 수십개의 스레드를 실행시킬 수 있습니다.
하드웨어적 스레드랑 소프트웨어적 스레드는 다르기때문이죠.
프로세스
OS는 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 이를 실행합니다. 그러면 그 프로그램은 프로세스가됩니다.
이 과정을 "프로세스를 생성한다"라고 볼 수 있습니다.
프로세스는 크게 foreground process, background process로 나뉩니다.
리눅스의 경우 백그라운드 프로세스를 데몬이라 부르고 윈도우에서는 서비스라고 부릅니다.
이번글은 백그라운드, 포그라운드 프로세스를 다루는 글은 아니기에 참고자료를 남기도록 하겠습니다.
(참고 : https://whyprogrammer.tistory.com/300)
아무튼 이런 프로세스들은 차례대로 돌아가며 CPU의 자원을 할당받을 때까지 기다립니다. 그리고 한정된 시간만큼만 CPU를 사용하게됩니다. 이때 OS가 프로세스들의 실행순서를 관리하고 프로세스들에게 자원들을 배분하는데 이 작업을 하기위해서 OS는 "프로세스 제어블록 PCB"를 이용합니다.
PCB란 "프로세스와 관련된 정보를 저장하는 자료구조"입니다. 옷 같은데 태그가 달려있는 것처럼 이해하시면 됩니다 ㅎㅎ
PCB에는 프로세스 ID, 레지스터 값, 프로세스 상태, CPU스케줄링 정보, 메모리 관리정보, 사용한 파일과 입출력 장치 목록 등이 기록됩니다.
문맥 교환
그러면 제가 아까 프로세스들이 한정된 시간만큼만 CPU를 이용이 가능하다고 말씀 드렸는데요.
그러면 한정된 시간이 다 지나면 어떻게 될까요?
이렇게 되면 다른 프로세스가 CPU자원을 사용할 수 있게 자리를 비켜주어야 합니다.
A라는 프로세스가 CPU를 한정된 시간만큼 다 사용이 끝났을 때 B라는 프로세스에게 자리를 비켜주는데 비켜주기 전에 프로세스A의 중간정보들을 저장해두어야 합니다. 즉, 나중에 다시 실행될 때 기억해야할 정보들을 "문맥"이라고합니다. 이러한 문맥은 PCB에 저장되었다가 나중에 실행이 재개될 때 CPU가 해당 프로세스의 PCB를 읽어와 다시 실행을 이어갑니다.
이렇게 A, B가 처례대로 돌아가며 기존 프로세의 문백을 PCB에 백업하고 , 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 "문맥 교환 (Context Switching)"이라고합니다.
'CS' 카테고리의 다른 글
[CS] 가상 메모리와 페이징 (0) | 2023.08.15 |
---|---|
[CS] 스와핑(Swapping) (0) | 2023.08.09 |
[CS] 논리주소와 물리주소 (0) | 2023.08.07 |
[CS] Mutex Lock과 Semaphore (0) | 2023.08.02 |
[CS] ALU, Control Unit, 레지스터 주소 지정방식 (0) | 2023.07.29 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!