[CS 기초 갈고 닦기] 1. 프로세스 vs 쓰레드 - 프로세스

khyojun·2022년 12월 7일
0

CS 기초 갈고 닦기

목록 보기
2/10
post-thumbnail

📌 프로세스

프로세스는 기본적으로 준비 상태에서 파견되어 실행을 위해 CPU에서 예약되는 프로그램입니다. PCB( Process Control Block )는 공정이라는 개념을 가지고 있습니다. 프로세스는 하위 프로세스로 알려진 다른 프로세스를 생성할 수 있습니다. 프로세스는 종료하는 데 더 많은 시간이 걸리고 격리되어 있어 다른 프로세스와 메모리를 공유하지 않습니다.

🔍 간단히?

간단히 말하면 실행 중인 프로그램이다.

🔍 조금 더 길게?

프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 된다는 것이다.

🔍 조금 더 더

OS에게서 할당을 받는다는 말을 했는데 우리가 알고있는 하드디스크에 존재하는 프로그램을 실행하면 OS가 메모리를 할당해줘서 진행이 된다는 것이다. 간단한 예제로 알아보면

  1. league of legend라는 게임을 할려고 한다. (프로그램)
  2. 사용자는 실행 파일을 더블 클릭을 한다. (프로그램)
  3. OS가 이제 자원(메모리)을 할당하여 관리를 한다. (프로세스)
  4. 게임을 신나게 한다. (프로세스)

이렇게 이해를 하는게 가장 잘 이해가 되는 거 같다.

위에서 간단히 말했지만 핵심은 프로세스는 실행 중인 프로그램이라는 상태를 표현하는 말이라는 것을 알 수 있었다.

📌 프로세스의 저장공간

다음과 같이 저장이 된다. 근데 Code, Data, Stack, Heap 각각에 뭘 저장하고 있는지 알아보자.

Code 영역

실행할 프로그램의 코드가 저장된다. CPU는 이 영역에서 명령어를 하나씩 가져와 처리하게 된다.

Data 영역

전역변수와 정적변수가 저장됩니다. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸된다.

Stack 영역

지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다. 함수 호출 시 할당되고 함수 반환 시 소멸됩니다. 로드 시(컴파일 타임) 크기가 결정된다.

위 세 영역은 컴파일 할 때 data, stack 영역의 크기를 계산해 메모리 영역을 결정한다고 한다!

Heap 영역

동적 데이터 영역입니다. 메모리 주소 값에 의해서만 참조되고 사용되는 영역입니다. 따라서, 프로그램 동작 시(런타임)에 크기가 결정된다.
예를 들어, stack에서 pointer 변수를 할당하면 pointer가 가리키는 heap 영역의 임의의 공간부터 원하는 크기만큼 할당해 사용하게 된다.

📌 프로세스는 상태를 가지고 있다!

new 단계 : 프로세스가 생성되는 단계
-> 프로그램을 실행시켰을 때의 첫 번째 상태가 됩니다.


준비(ready)단계 : 프로세스가 프로세서에 할당되기를 기다리고 있는 상태
실행(running)상태 : 프로세스가 실행중인 상태
대기(waiting)상태 : 프로세스가 어떤 사건(event)을 기다리고 있는 상태


terminated상태 : 프로세스의 실행이 종료된 상태

이런 상태로 존재하는데 중간중간 여러 단어들이 있다.

  • scheduler dispatch: 프로세스에 CPU를 할당해주는 것(준비 상태에서 실행 상태로 전이되는 과정)
  • Interrupt : 인터럽트(방해) 신호를 받게되면, 실행(running)중이던 프로세스는 준비(ready)상태로 전이되고, 우선순위(Priority)가 높은 프로세스를 실행(running)상태로 전이시키게 됩니다. (프로세스는 각각 우선순위를 부여받고, 우선순위에 따라 프로세스가 준비상태로 전이되거나, 실행상태로 전이됩니다.)
  • I/O or event wait : CPU를 점유하고 있는데 만약 입출력 처리를 해줘야되면, 실행상태에 있는 프로세스는 대기/보류 상태로 바뀌게 되는데 입출력 처리가 끝날때까지 대기상태로 머물게 됩니다. 그러면서 준비(ready)에 있던 또 다른 프로세스가 실행(running)상태로 전이가 됩니다.
  • I/O or event completion : 입출력 처리가 끝난 프로세스가 대기(waiting)에서 준비(ready)로 전이가 되서 스케줄러에게 선택이 될 수 있게 됩니다. 추가로 프로세스를 종료(Terminate)시킬 때 Blocked 상태를 거칠 수 있습니다.

❓ 도중에 생각난 질문 인터럽트?

  • 인터럽트가 일어나면 왜 멈춰야 될까?
    그 이유는 입출력 연산이 CPU 명령 수행속도보다 현저히 느리기 때문이다.
  • 인터럽트에 대한 좋은 예제가 있어서 하나 가져와봤다.
    EX) 악덕 사장: 운영체제, CPU: 연봉이 아주 높은 직원, I/O 직원: 값 싼 직원
    핵심은 그렇다. 우리의 악덕 사장님은 연봉이 높은 직원을 매우 잘 사용하려한다. 근데 값 싼 직원의 일 때문에 일이 진행되지 않아 연봉이 높은 CPU가 일을 안하게 되면 운영체제 사장님은 아주 기분이 나쁘다.
    그래서 CPU 직원에게 사장님이 I/O 직원의 작업에 대한 결과가 나올 때까지 다른 일을 시킨다. 그리고 값 싼 I/O직원이 일을 끝내면 CPU 직원에게 작업이 끝났다고 알려주는게 인터럽트 라고한다.

📌 여기서 끝이 아니다! PCB

프로세스 제어 블록(Process Control Block, 줄여서 PCB)은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는, 운영체제 커널의 자료구조입니다. PCB는 운영 체제가 프로세스를 표현한 것이라 할 수 있습니다.

간단히?

운영체제가 프로세스에 대한 정보를 알아듣기 위해 가지고 있는 것 - PCB

어떤 식으로 생성, 제거

운영체제에서는 프로세스를 PCB로 나타내는데 각 프로세스마다 생성될 때 고유의 PCB가 생성이 되고 프로세스가 완료가 되면 PCB가 제거되는 형태이다.

뭘 저장하고 있을까?

  • Pointer – 프로세스의 현재 위치를 유지하기 위해 프로세스가 한 상태에서 다른 상태로 전환될 때 저장해야 하는 스택 포인터입니다.
  • Process State – 프로세스 의 각 상태를 저장합니다.
  • Process Number – 모든 프로세스에는 프로세스 식별자를 저장하는 프로세스 ID 또는 PID라는 고유한 ID가 할당됩니다.
  • Program Counter – 프로세스에 대해 실행될 다음 명령의 주소를 포함하는 카운터를 저장합니다.
  • Registers – 누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터입니다.
  • Memory Limits – 이 필드에는 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보가 포함되어 있습니다. 여기에는 페이지 테이블, 세그먼트 테이블 등이 포함될 수 있습니다.
  • Open files list - 이 정보에는 프로세스를 위해 열린 파일 목록이 포함됩니다.
  • Miscellaneous accounting and status data (기타 계정 및 상태 데이터) – 이 필드에는 사용된 CPU 양, 시간 제약, 작업 또는 프로세스 번호 등에 대한 정보가 포함됩니다

결론

프로세스도 참 Deep한 주제이다. 살펴보면 살펴볼수록 끝이 없고 계속 파고 들어갈 수 있어서 일단은 여기까지! 하는 걸로 하겠다. 주된 것은 쓰레드와 프로세스를 비교해보는 것이기 때문에. 이런 내용부터 일단은 잘 정리하고 자신의 것으로 만들어 갈 수 있도록 정리해 나가는 과정이 더 필요할 거 같다.

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글