[혼공컴운] 10. 프로세스와 스레드

uuuu.jini·2023년 3월 6일
0

✅ 10-1) 프로세스 개요


프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다. 그리고 이 과정을 '프로세스를 생성한다.'라고 한다.

🤞 프로세스 직접 확인하기

컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행된다. 윈도우에서는 작업 관리자의 프로세스 탭에서 확인이 가능하며 unix체계의 운영체제에서는 ps 명령어로 확인이 가능하다.

ps -ef
  • 포그라운드 프로세스: 사용자가 볼 수 있는 공간(보는 앞에서 실행)에서 실행되는 프로세스
  • 백그라운드 프로세스: 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
  • 데몬(서비스): 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스

🤞 프로세스 제어 블록 (PCB)

모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있다. 즉, 모든 프로세스가 CPU를 동시에 사용할 수 없다. 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용한다.

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록 (PCB: Process Control Block)을 이용한다.

프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료구조이다. (해당 프로세스 식별을 위한 정보)

PCB는 커널 영역에 생성된다. 운영체네는 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단한다. PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.

  • 새로운 프로세스가 생성되었다. => 운영체제가 PCB를 생성했다.
  • 프로세스가 종료되었다. => 운영체제가 해당 PCB를 폐기했다.

🤞 PCB 정보

1. 프로세스 ID (PID)

특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다. 같은 일을 수행하는 프로그램이라 하더라도 두 번 실행하면 PID가 다른 두개의 프로세스가 생성된다.

2. 레지스터 값

프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다. => 이전까지의 진행 작업 이어 실행 가능

3. 프로세스 상태

현재 프로세스가 어떤 상태인지 PCB에 기록 (입출력 대기, CPU 사용 대기, CPU 이용 등)

4. CPU 스케줄링 정보

프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보

5. 메모리 관리 정보

프로세스마다 메모리에 저장된 위치가 다르다. 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 있어야 한다.

  • 베이스 레짓스터, 한계 레지스터
  • 페이지 테이블 정보

6. 사용한 파일과 입출력장치 목록

프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용한다면 PCB에 해당 내용이 명시된다. 즉, 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다.

🤞 문맥 교환 (Context Switching)

프로세스 A가 운영체제로부터 CPU를 할당받아 실행되다가 시간이 다 되어 프로세스 B에 CPU 사용을 양보한다고 가정해 본다. 이때 직전까지 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력장치 등 지금까지의 중간 정보를 백업해야 한다. => 다음 차례 시 이전 실행 내용 이어 다시 실행 재개 가능

이러한 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다. 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다. 인터럽트 발생시 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다. 그리고 뒤에 실행할 프로세스의 문맥을 복구한다. => 실행 프로세스 변경

기존 프로세스 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다.

문맥교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아가며 수행 된다. => 동시에 실행되는 것처럼 보인다.

너무 자주 문맥교환 수행시 오버헤드 발생 => 반드시 좋은 것은 아님

🤞 프로세스의 메모리 영역

하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

<코드 영역>

코드 영역은 텍스트 영역이라고도 부른다. 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장되어 있다. 코드 영역은 데이터가 아닌 CPU가 실행할 명령어 담김 => 쓰기 금지 (읽기 전용 공간)

<데이터 영역>

프로그램이 실행될 동안 유지할 데이터가 저장되는 공간이다. 전역 변수 가 대표적이다. (프로그램 실행동안 유지되며 프로그램 전체에서 접근할 수 있는 변수)

코드 영역과 데이터 영역은 그 크기가 변하지 않는다. 프로그램을 구성하는 명령어들이 갑자기 바뀔 일이 없으니 크기가 변할 리 없고, 데이터 영역의 데이터는 프로그램이 실행되는 동안에만 유지될 데이터이다. => 정적 할당 영역

힙과 스택 => 동적 할당 영역

<힙 영역>

프로그램을 만드는 사용자 (프로그래머)가 직접 할당할 수 있는 저장 공간이다.

  • 메모리 할당 시 언젠가는 반환해야 한다. (더이상 해당 메모리 공간 사용하지 않겠다.)
  • 메모리 공간 반환 x => 메모리 낭비 (메모리 누수)

<스택 영역>

데이터를 일시적으로 저장하는 공간이다. 데이터 영역에 담기는 값과는 달리 잠깐 쓰다가 말 값들이 저장되는 공간이다. 매개변수, 지역변수

  • 일시적 저장 데이터 PUSH, 필요하지 않은 데이터 POP

힙과 스택 영역은 실시간으로 크기가 변할 수 있기 때문에 동적 할당 영역이라고 한다.

  • 힙: 낮은 주소에서 높은 주소로 할당
  • 스택: 높은 주소에서 낮은 주소로 할당
  • 두개가 겹치는 것으 방지한다.
profile
멋쟁이 토마토

0개의 댓글