OS 관련 지식을 습득하다 보면 프로세스란 개념을 누구나 접해볼 것이다.
나 역시 프로세스를 한 프로그램이라고 생각만 했었다. 오늘 OS 관련 특강을 들으면서 다시 한번 시스템 정리하고 머릿속에서 계속 ???? 가 떠올랐다.
그냥 너무 찍먹 느낌으로 OS 지식을 습득하고 공부하다보니 필수적으로 알고 있어야 하는 부분들을 많이 놓치게 되었다는 점과 내가 부족한 부분이 무엇인지 스스로 점검하게 되고, 찾아보았다.....(자바의 정석과 자바의 신...)
우리가 실행하고자 하는 프로그램 .exe는 실행하기 전에는 그저 코드덩어리에 불과하다.
우리는 우리가 원하는 프로그램을 실행하고자 .exe 파일을 클릭해서 프로세스로 등록시킨다.
그럼 이 프로그램이 프로세스가 되면서 어떤 변화가 일어날까?
1. 프로세스(Process)는 무엇인데요?
프로세스? 내가 알고 있는 정의 -> 실행중인 프로그램
우리가 프로그램을 실행한다면? -> OS에 의해서 자원을 할당받고 실행한다.
프로세스는 스택(Stack), 힙(Heap), 데이터(Data), 코드(Code)로 구성되어 있다.
(2022.12.02)추가
프로세스를 구성중인 이 4가지의 역할
스택(Stack) - 지역변수, 전역변수 반환 값 등 일시적인 데이터
힙(Heap) - 동적 메모리 영역
데이터(Data) - Static 변수나 Global 변수
코드(Code) - 실행 명령을 포함하는 코드들
1-1 프로세스 상태(Process State)는요? 어떻게 관리가 되는건가요
프로세스가 실행됨에 따라 상태는 달라진다. ( 정처기) 이 상태는 커널에 의해 관리가 된다!
프로세스는 5개의 상태를 가지고 있다.(실행-running),(준비-ready),(대기-waiting),(생성-new),(완료-terminated)
1. 생성(new) : 말 그대로 프로세스가 처음 생성된 상태
2. 준비(ready) : 조건을 만족한 프로세스가 CPU에 할당되기를 기다리는 상태 (우선순위를 통한 CPU 할당)
3. 실행(running) : CPU를 할당받아 실행되는 상태
4. 대기(waiting) : CPU를 양도하고 대기하는 상태, 이벤트 발생 대기, 명령수행 x
5. 완료(terminated) : 수행을 종료, 프로세스가 수행을 끝냄, 완전히 프로세스가 제거된 것은 아님
추가적으로 디스패치(Diapatch) : 문맥교환 발생 및 준비상태의 프로세스 중 실행될 프로세스 선정
타이머 런아웃(Timer Runout) : 지정된 시간이 지나면 CPU 반납 후 다시 준비 상태로 전이
웨이크 업(Wake Up) : 입출력이 완료되거나 자원이 할당되어 다시 실행
OS(운영체제)는 프로세스를 교체 및 프로세스 재시작 시 오류가 발생하지 않도록 관리하는데, 이를 위해 OS는 프로세스의 상태를 실행, 준비, 블록 상태로 분류하고 프로세스들을 상태전이(state transition)를 통해 체계적으로 관리
멀티 태스킹 => OS를 통해 CPU가 작업하는데 필요한 자원을 프로세스 혹은 스레드 간에 나누는 행위
이 멀티 태스킹을 통해 우리는 여러개의 작업을 할 수 있음.
멀티 프로세스 => 하나의 서비스를 여러 개의 프로세스로 구성해서 각 프로세스가 하나의 작업을 처리하도록 하는 것
이렇게 멀티 프로세스 방식은 안정성이 좋아서 여러개의 자식 프로세스 중 문제가 발생하더라도 다른 자식 프로세스에 영향이
확산되지 않는다.
또 구현이 비교적 간단하고, 각 프로세스들이 독립적으로 동작해서 자원을 서로 다르게 할당된다
(궁금증 발생했으나 해결 완료 => 내용 : 낭비가 발생할 수 있을거같은데??? 아닌가??)
프로세스 간 통신을 위해 IPC를 통해야 한다. (이 IPC는 상대적으로 비용이 크다)
메모리 사용량이 많다.
이 스케쥴링에 따라 문맥 교환이 많아지고, 성능이 낮아질 수 있다.
프로세스가 생성될 때마다 고유의 PCB 가 생성되고, 프로세스가 완료되면 PCB도 함께 제거된다.
그럼 이 PCB 왜 필요할까?
우리가 봤을 때, 여러 프로세스가 동시에 실행, 처리, 관리 되는 것처럼 보이지만, 실제로는 CPU는 한번에 한가지 명령밖에 처리 못한다. 동시가 아니라 빠르게 프로세스를 번갈아가며 교환 해서 실행하는 것이다.
이를 문맥교환(Context Switching)이라 한다.
문맥교환은 프로세스가 실행되다 인터럽트가 발생해 CPU를 다른 프로스로 넘겨주는 과정
그렇다. 이 PCB는 문맥교환을 위해 필요하다.
프로세스들은 PCB(프로세스 제어블록)또는 프로세스 기술자라고 부르는 자료구조에 저장된다.
1-2. 그럼 PCB(프로세스 제어 블록)는 뭔데?
PCB는 운영체제가 프로세스를 관리하기 위해 프로세스별 보유하고 있는 자신의 정보 묶음이다.
이 PCB (Process Control Block)은 운영체제에 따라 포함되는 항목이 다를 수 있다.
- 운영체제가 관리상 사용하는 정보
Process state = 프로세스 상태 (위에 그림 및 설명 참고)
Process ID = 프로세스 식별자 (프로세스를 식별하기 위한 고유 ID)
Sceduling infomation =스케쥴링 정보
Priority = 프로세스 우선순위
- CPU 수행 관련 하드웨어 값
프로그램 카운터(Program counter) = 다음 프로세스에 이어서 실행해야 할 명령의 주소를 가리키는 포인터
레지스터(Register) = 프로세스가 인터럽트 이후 올바르게 작업을 할 수 있도록 참조하는 CPU 레지스터 값(CPU 레지스터 정보)
- 메모리 관련
코드, 데이터, 스택의 위치 정보 및 base/limit 레지스터 값
- 파일 관련
열린 파일 목록 (Open file descriptors)
그럼 이 프로세스는 뭘로 구성되어 있는데?? --> ( 데이터, 메모리 등의 자원과 쓰레드 )
그래서 이 자원들을 활용해 작업을 수행하는게 "쓰레드"
운영체제를 더욱 딮하게 공부하고싶다면 OS 관련 책을 사서 공부하는 방법이 최고
2. 쓰레드(Thread)? 닌 뭔데요?
쓰레드는 작업의 주체!!!
(당연히 이 쓰레드가 여러 개 있으면 멀티 쓰레드겠죠?...)
그럼 멀티 쓰레드는 무적인가요? -> 동기화, 교착상태 등 문제 발생 합니다.
위에서 프로세스에 대해 간단히 알아보았는데, 현재 실행 중인 프로그램을 프로세스라 했다. 쓰레드는 이 프로세스 내부에서 실행되는 흐름의 단위이다. (반드시 프로세스는 하나 이상의 스레드를 가짐)
원문
In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system
직접 해석 : 컴퓨터 과학에서 실행되는 스레드는 일반적으로 운영체제의 일부분인 스케쥴러에 의해 독립적으로 관리될 수 있는 프로그래밍 된 명령어의 작은 시퀸스다
이 쓰레드는 우선 Stack 영역에 자리잡는다.
부모 프로세스의 코드나 데이터, Heap 영역은 공유하면서 실행되며 이 공유로 인해 메모리를 효율적으로 사용할 수 있다.
멀티 쓰레드는 위에서 설명한 것처럼, 쓰레드가 여러개 있는 것인데, 하나의 프로그램을 여러 개의 쓰레드로 구성하고, 각 스레드가 하나의 작업을 처리할 수 있도록 하는 것이다.
조금 더 생각해보면 메모리 공간과 자원의 사용이 분산되니까 효율적일 것이고, 더 빠를 것이다.
하지만 자원 영역을 공유하기에 자원 공유 시 동기화 문제가 발생할 수 있으며, 문제가 발생하면 전체가 문제가 될 수 있다.
그래서 과연 멀티 프로세스를 사용할 것이냐? 멀티 쓰레드를 사용할 것이냐는 잘 따져가면서 설계를 해야한다.(각자의 장 단점이 존재하니까)
참고
https://akdl911215.tistory.com/327
https://itwiki.kr/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%83%81%ED%83%9C
https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37
예시를 이용해 프로세스와 쓰레드를 설명해보자(2022.12.02 추가)
예시
2개의 프로그램을 우리가 실행해보자 (2개의 프로세스)
프로세스 1과 프로세스 2가 준비되어 있다. -> PCB 1 & PCB 2
먼저 프로세스 1이 CPU에 적재상태이다. (프로세스 2는 준비상태) -> 프로세스 2를 실행하기 위해 프로세스 1은 준비상태로 내려감 -> 2가 적재(1이 준비) ->이러한 과정이 문맥교환 (Context Switching)
이 과정이 많약에 많아진다면? -> 당연히 시스템의 과부하, 자원사용량 증가 등 좋지 못한 방향으로 흘러갈 가능성이 크다
그래서 등장한 것이 쓰레드 하나의 프로세스 속 여러 스레드가 존재하면, 공유되는 자원이 있으며, 각 스레드는 스택 부분만을 따로 가지고 있음. 그래서 이 공유된 자원으로 인해 문맥교환이 발생할 때 캐싱 적중률이 올라간다.
이 것들이 바로 프로세스와 스레드이다
(프로세스 -> 실행 프로그램, 스레드 -> 한 프로세스 내에서 자원의 효율성을 높여주는 작업, 작업의 주체)
(여기서 캐싱 적중률이란? )
먼저 캐싱은 컴퓨터의 처리 성능을 높이기 위한 기법이다.
CPU는 데이터를 처리하기 위해 메모리와 데이터를 주고받는데, CPU는 빠르고 메모리는 느리기에 속도 차이가 날 수 밖에 없다. 그래서 메모리에 접근할 때 CPU는 효율적이지 못한다.
이때 이 속도 차이로 인해 발생하는 병목 현상을 완화하기 위해 캐시 메모리를 사용하는데, 이 캐시 메모리는 CPU와 메모리 사이에 위치해있다. 그래서 이 캐시 메모리에 데이터를 저장해놓고 사용하면 CPU의 입장에서 메모리에 접근하는 것보다 더 효율적이라 성능 향상이 향상된다.
이때 적중(hit)이라는 개념이 등장하는데, CPU가 메모리에 접근하기 전 캐시 메모리에서 자신이 원하는 데이터의 존재 여부를 확인하게 되고, 원하는 데이터가 있으면 적중(hit), 없으면 실패(miss)라 한다.
이 것을 캐싱 적중률이라 한다.
프로세스는 각 각 독립적이기에 IPC 통신을 통해서 통신을 해야한다. 자원에 대한 내용이 자원을 사용하고, 개별 메모리 차지가 크다. 문맥 교환의 비용이 크다. 하지만 각 각 독립적이라서 동기화 작업에 신경을 덜 써도 된다.
스레드는 스레드 간 긴밀히 연결되어 있고 공유 자원으로 통신 비용이 절감된다. 메모리도 마찬가지로 효율적이고. 문맥 교환의 비용이 작다. 그러나 공유 자원에 대한 관리가 필요하다.
위에서 마지막에 그래서 멀티 프로세스를 사용할 것이냐, 멀티 스레드를 사용할 것이냐는 선택의 문제라고 언급했었다.
이 두 개념은 모두 일종의 처리 방식이기 때문이다.
멀티 프로세스는 한 어플리케이션이 여러개의 일을 처리해야 할 때, (예를들어 여러 사용자가 로그인을 요청하는 상황에서)
부모 프로세스는 fork()를 통해 자식 프로세스에게 작업을 처리하도록 지시하며, 이 때 자식 프로세스는 부모와 별개의 메모리 영역을 확보한다.
멀티 스레드는 한 프로세스 내에 여러개의 스레드가 위치한 방식인데, 이 때 각각의 스레드가 작업을 실행한다.
이렇게만 놓고 보면 멀티 프로세스< 멀티 스레드 가 더 좋아보인다.
그러나 공유 자원을 이용해 작업을 수행하고 행위들을 하다보니 하나가 문제가 생기면 전체 프로세스에 문제가 생긴다.
반면에 멀티 프로세스는 각 작업들이 독립적이라서 그 부분만 문제가 되는 것이고, 그 부분에 대한 해결책만 제시하면 된다.
'기술면접 관련 및 참고하기' 카테고리의 다른 글
객체 지향의 SOLID 원칙 (1) | 2022.11.28 |
---|---|
HTTP는 뭔데요? ( CS 특강 - HTTP/HTTPS/통신 흐름, TLS/SSL 등) - 작성 중 (0) | 2022.11.25 |
자바는 어떻게 메모리를 사용할까요? (자바의 메모리 사용) (0) | 2022.11.17 |
크롤링(Crawling)과 스크래핑(Scraping)?? (0) | 2022.03.12 |
라이브러리? 프레임워크? what is that? (0) | 2022.03.06 |