Process?
프로그램을 실행하면 우선 주기억장치에 적재되어 CPU에 의해 실행됩니다. 이 때 CPU에 실행상태에 있는 프로그램을 프로세스라고 합니다. CPU가 프로그램에 할당되고 PCB(Process Control Block)을 정의하는 단위가 됩니다.
쉽게 말해서 프로그램이 CPU에 할당받는 단위를 프로세스라고 합니다. 여러개의 프로세스를 처리하기 위해서는 CPU에서 프로세스 스케줄링을 통해 일정량의 시간만 할당해 멀티 프로세스를 처리할 수 있게 됩니다.
Ubuntu에서 Monitor을 켜시거나 윈도우에서 작업관리에 들어가시면 현재 동작중이 프로세스들을 확인할 수 있습니다. 옆에 ID가 프로세스를 특정하는 PID(Process ID)가 됩니다.
프로세스 상태 전이도
프로세스는 주요한 3가지 상태를 가지게 됩니다.
① 준비상태(Ready) : 주기억 장치에서 CPU 할당을 대기하는 시점입니다.
② 실행상태(Run) : 프로세스가 CPU를 할당받아 작업이 진행되는 상태입니다.
③ 대기상태(Block) : 프로세스를 완료하기 위해 입출력 등을 기다리는 시점입니다.
④ 종료상태(Exit) : 프로세스가 완료된 상태입니다.
각 프로세스들은 CPU 할당, 프로세스 완료 여부 등에 따라 상태가 변하게 됩니다. 상태를 변하게 하는 전이는 다음과 같이 분류합니다.
① Dispatch : 준비 상태에 있는 프로세스가 실행(Run) 상태로 변하는 과정입니다.
② Time Run Out : 실행(Run) 상태의 프로세스가 CPU가 할당된 시간을 모두 사용했지만 작업을 완료하지 못한 경우 다시 준비 상태로 되돌아 가게 됩니다.
③ Block : 실행(Run) 상태의 프로세스가 입출력에 의한 작업을 위해 대기 상태로 변하는 과정입니다.
④ Wake Up : 입출력이 완료된 후 완료되지 못한 프로세스가 준비 상태로 변하는 과정입니다.
CPU는 프로세스 스케줄링을 하기 위해 다양한 알고리즘을 사용합니다.
- 비선점형 스케줄링(FIFO, SJF, HRN)
- 선점형 스케줄링(RR, SRT, MFQ)
❓️ PCB(Process Control Block) 이란?
프로그램을 동작하는 운영체제에서 프로세스에 대한 정보를 기록한 테이블입니다. 프로세스가 생성/삭제될 때 마다 PCB가 갱신됩니다. CPU는 기본적으로 한번에 1개의 프로세스만 처리할 수 있습니다. 따라서 PCB에 기록된 정보를 바탕으로 할당된 시간이 지난 경우 다른 프로세스를 실행해야 하는데(Context Switching) 이 때 PCB에 프로세스 정보를 기록하여 관리하게 됩니다.
❓️ IPC(Inter Process Communication) 이란?
동시에 여러개의 프로게스가 주기억장치에 올라가 있을 수 있습니다. 각 프로세스들은 서로 데이트를 교환하기 위해 통신을 하게 되는데 이 때 사용되는 방법이 IPC입니다. 프로세스들이 자원을 공유할 수 있으므로 성능이 향상됩니다. IPC에는 메모리를 보호하기 위해 커널이 대신 데이터를 교환하는 메시지 교환 방식과 공유 메모리를 생성해 사용하는 메모리 공유 방식이 있습니다.
Thread ❓️
스레드는 프로세스 내의 작업단위로 시스템에서 여러 자원을 할당받아 실행하는 프로그램 단위입니다. 프로그램이 주기억장치에 올라가 CPU 할당을 받으면서 프로세스가 되는데, 한 프로세스에 스레드가 하나면 싱글 스레드. 여러개면 멀티 스레드라고 합니다.
스레드는 프로세스의 작업단위이므로 경량 프로세스(Light Weight Process)라고도 불립니다. 스레드 기반 시스템에서는 스레드가 독립적인 스케줄링 단위로 사용될 수 있고, 최소 단위의 프로세스 역할을 하게 됩니다. 멀티 스레드를 사용하는 프로세스의 경우 독립적인 다중 작업이 가능합니다.
스레드의 장점?
멀티 스레드를 사용하면 1개의 프로세스에서 멀티 스레드를 돌릴 수 있으므로, 병행 작업 성능을 향상할 수 있습니다. 또한 스레드들의 실행 환경과 데이터를 공유하여 메모리 낭비를 줄일 수 있습니다. Thread는 프로세스의 작업단위이기 때문에 CPU가 프로세스에 할당한 타임 슬라이스를 여러 스레드가 공유하게 됩니다.
스레드 단점?
대규모 I/O 처리를 할 때 멀티 스레드를 사용하면 정해진 타임 슬라이스안에 작업을 마치지 못한 스레드들은 대기 상태에 빠지게 됩니다.
또한 스레드들은 Code, Data, Heap 영역은 프로세스에서 관리하며 여러 스레드들이 공유하는 데이터지만, 스레드 별로 개별적인 Stack이 할당됩니다. 대규모 I/O 작업이 요청되는 경우 스레드 컨텍스트 스위칭이 대규모로 발생하면서 성능이 저하됩니다. 이런 경우 차라리 싱글 스레드가 훨씬 높은 성능을 보일 수 있습니다.
🚀️ 도움이 되셨다면 구독과 좋아요 부탁드립니다 :)\
'Programming' 카테고리의 다른 글
Markdown code block language 선택하는 방법💡️ (0) | 2022.10.02 |
---|---|
Django Admin superuser 계정 생성 비밀번호 찾기 💡️ (0) | 2022.10.01 |
Spring boot VS Node Express 차이 성능 비교💡️ (0) | 2022.10.01 |
Django 프로젝트 시작하는 방법 💡️ (0) | 2022.10.01 |
[회고록] 코드스테이츠 블록체인 파이널 프로젝트 완수 후기 (2) | 2022.09.30 |
댓글