문법 종합반 강의 5주차 내용으로 프로세스와 쓰레드에 대한 내용이 포함되어있고
이것들은 면접 질문으로 나올 수 있는 내용이므로 문법책과 검색을 확실히 하여 짚고 넘어가야 하는 부분.
프로그램과 프로세스와 쓰레드의 관계
1. 프로그램 - 하드디스크에 저장된 파일들의 모임 - 실행 전 상태
2. 프로세스 - 메모리에 로딩된 프로그램 - 실행 후 상태
3. 쓰레드 - 프로세스 안에서 CPU를 사용하는 최소 단위
세 가지 핵심요소들에 대해 간단히 정의를 해보았다.
바로 공통적인 부분들과 서로 어떻게 연결되어 있는지 이해하는게 핵심이다.
프로세스는 "메모리에 로딩된 프로그램" 이라고 했다, 그렇다면 프로그램을 메모리에 로딩하는 과정이 있을것이고.
쓰레드는 "프로세스 안에서 CPU를 사용하는 최소 단위" 라고 했다, 그렇다면 프로세스 내부에 쓰레드가 존재한다는것.
그리고, 쓰레드가 CPU를 사용하며 프로세스의 내부에 쓰레드가 존재하기 때문에, 외부에서 보면 마치 프로세스가 CPU와 상호작용하는 것처럼 보일것이라는것
정도를 추론할 수 있을 것이다.
왜 이런 관계가 생겨났나?
컴퓨터의 구조에 대한 이해가 선행되야 한다.
컴퓨터의 주요 구성요소 : 중앙처리장치(CPU), 메모리(Memory), 하드디스크(HardDisck)
- 중앙처리장치(CPU) : 연산을 수행하며 프로그램을 실행하는 장치로 빠른 동작속도가 특징.
- 하드디스크 : 데이터의 저장 역할을 하며, 프로그램을 만들기 위해 작성한 파일들을 저장하는곳 낮은 동작속도를 가짐.
- 메모리 : 빠른속도의 CPU와 느린속도의 하드디스크간의 상호작용을 위해 하드디스크의 파일들을 프로그램들을 로딩해줌, CPU보다는 느리지만, 비슷한 동작속도를 가짐.
컴퓨터는 우리가 작성한 코드덩어리들인 '프로그램'을 동작시키기 위해 CPU를 사용하여 연산을 처리해야 하는데
하드디스크의 프로그램과 CPU를 직접 상호작용 시키기에는 서로 동작속도가 너무나도 차이가나기 때문에
그 프로그램들을 CPU와 비슷한 속도로 동작시키기 위해 메모리에 로딩을 하게됩니다.
이 로딩 과정에서 메모리 공간을 할당받게 되고 운영체제(OS)로부터 시스템적 자원(CPU)에 상호작용하며 프로그램을 실행시키게 됩니다, 이 메모리에 공간을 할당받고 CPU와 상호작용하며 실행을 하는 중인 프로그램을 프로세스 라고 부릅니다.
5. 프로세스 정보 · UNIXBasic (gitbooks.io)
우리가 자주 사용하는 Ctrl + Alt + Delete 의 작업관리자에서 프로세스를 볼 수 있습니다.
어떻게 보면 프로그램과 프로세스가 굉장히 닮은 느낌이 들기 때문에.
차이점을 한번 따져보면.
프로그램은 - 실행을 할 수 있는 파일 혹은 코드 덩어리, 하드디스크에 저장되어있지만 메모리에는 저장되어있지않은 상태
프로세스는 - 실행되어 작업중인 프로그램, 메모리에 저장되어있고 CPU자원을 할당받은 상태
프로그램은 정적인 개념, 프로세스는 동적인 개념!. 유사한 느낌이 많이들지만 확실한 차이점이 존재하니 구분할 수 있도록한다.
쓰레드
쓰레드는 프로세스 내에서 진행되는 작업 흐름 입니다.
하나의 프로세스는 하나 이상의 스레드를 보유합니다, 예시를 들자면, 영화를 자막달고 볼때
내부에서는 일단 두 개의 스레드가 있는 멀티쓰레드 프로세스라고 생각하면됩니다.
하나의 프로세스 ( 동영상 프로그램 ) 안에 첫번째 쓰레드(영상 출력)과 두 번째 쓰레드 (자막 출력)이
실행중인겁니다, 이때 두 개의 스레드가 서로 작업을하는 방식이 중요합니다.
만약? 자막을 달고 영화를 보는데, 영상출력과 자막출력이 순차적으로 실행된다면??
자막이 없는 영상이 출력되고 영상이 끝난 뒤에 자막이 나오기 시작할것이다.
이것은 멀티 쓰레드를 사용하지 않을때 일어나는 문제 상황으로, 멀티 쓰레드를 사용함으로써 해결이 가능할 것이다.
바로 영상출력 쓰레드와 자막 출력 쓰레드를 생성하여 실행하는것인데, 여기에서도 실행 방식이 갈린다.
분명히 CPU는 하나고, 프로세스 안의 쓰레드들이 CPU와 상호작용하면서 작업을 수행할 텐데 쓰레드의 숫자는
멀티쓰레드로 늘릴 수 있지만 CPU는 CPU 그자체로 그대로이지 않은가?? 하는 의문이 있었다.
이 부분은 바로 CPU 코어의 수와 작업의 수 간의 관계에 따른 차이로 설명이 가능한데, 이 부분에 대한 설명 이전에
쓰레드의 동시성과 병렬성에 대한 설명이 필요하다.
동시성(Concurrency)
>동시성은 처리해야 할 작업의 수가 CPU의 코어 수 보다 많을 때입니다, 이 상황에서는 CPU는 각 쓰레드의 요청작업을
매우 짧은 간격으로 교차실행하면서 실행합니다, 그러면 사용자의 입장에서는 마치 두 작업이 동시에 실행되는 듯한
느낌을 받게됩니다, 이것이 쓰레드의 동시성입니다.
병렬성(Parallelism)
>CPU의 코어 수가 작업 수 보다 많은 경우는 각각의 작업이 코어 하나씩에 할당되어 동시에 실행이 가능하기 때문에
동시에 작업이 수행됩니다, 이것이 쓰레드의 병렬성입니다.
멀티 쓰레드의 목적은 병렬성과 동시성을 확보하여 여러 작업을 동시에 실행시키거나, 동시에 실행되는것처럼 보이게하는것이라 할 수 있겠습니다.
Java에서의 쓰레드
Java에서는 기본적으로 main 쓰레드 하나가 존재하며, main() 메소드를 실행시키면서 시작합니다.
Java는 멀티 쓰레드를 지원하기때문에, 기본적인 main 쓰레드에서 필요에 따라 추가적으로 쓰레드 객체들을 생성하여
병렬적으로 코드를 실행할 수 있습니다.
'부트캠프 > TIL' 카테고리의 다른 글
[부트캠프] TIL - 팀프로젝트 Init, MySQL - GROUP BY (0) | 2024.08.01 |
---|---|
[부트캠프] TIL - Git revert & reset, 쓰레드(Daemon,Priority,ThreadGroup) (0) | 2024.07.31 |
[부트캠프] TIL - 에러핸들링 (0) | 2024.07.29 |
[부트캠프] TIL - char 배열 정렬, MySQL - DATEDIFF (0) | 2024.07.28 |
[부트캠프] TIL - 약수의 갯수, MySQL (1) | 2024.07.25 |