[OS] 프로세스와 스레드 part 1

이름이름·2023년 8월 13일
0

OS

목록 보기
2/3
post-thumbnail

프로세스

실행 중인 프로그램을 프로세스라고 합니다.
보조기억장치에 저장 돼있는 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 됩니다.

윈도우의 작업 관리자를 열어보면 굉장히 많은 프로세스가 실행 중인 것을 알 수 있습니다.
우리가 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고 사용되지 않는 프로세스는 메모리에서 삭제됩니다.

  • 일반적으로 하나의 CPU는 한 개의 프로세스만을 실행할 수 있기에 CPU는 이 프로세스들을 번갈아 가며 실행하게 됩니다.

타이머 인터럽트

모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU자원은 한정되어 있습니다.
그렇기에 모든 프로세스들을 차례대로 돌아가며 한정된 시간만큼만 CPU를 사용합니다.

자신의 차례가 되면 정해진 시간만큼 CPU를 사용하고, 시간이 끝났음을 알리는 타이머 인터럽트가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다립니다.

프로세스 제어 블럭 (PCB)

수많은 프로세서들을 관리하기 위해 운영체제는 프로세스 제어 블럭 (process control bolck)/PCB 를 이용합니다.
이 PCB는 프로세스와 관련된 정보를 저장하는 자료 구조입니다.

비유하자면 마치 상품에 달린 태그와 같아서 프로세스들을 식별하기 위한 필요한 정보들을 저장하게 됩니다.
메모리는 커널 영역과 사용자 영역으로 나누어 진다고 했었는데 이 PCB는 커널영역에 생성이 됩니다.

이 PCB는 프로세스가 생성 시에 만들어지고 실행이 끝나면 폐기됩니다.

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

이런 PCB에는 어떤 정보들이 담기게 될까요??
다음과 같은 정보들이 담기게 됩니다.

1. 프로세스 아이디 (PID)

특정 프로세스를 식별하기 위한 아이디

2. 레지스터 값

프로세스가 어떤 작업을 실행하는 도중에 다른 프로세스로 전환될 수 있습니다.
따라서 다시 원래 프로세스로 돌아왔을 때 이전 작업들을 이어 하기 위해서 해당 프로세스(원래 프로세스)가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값이 담깁니다.

3. 프로세스 상태

해당 프로세스가 어떤 상태인지도 PCB에 기록이 돼야합니다.
입출력장치를 사용하기 위해 기다리는 상태인지 아니면 CPU를 사용하기 위해 기다리고 있는지 등의 상태를 말이죠

4. CPU 스케줄링

프로세스가 언제,어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록됩니다.

5. 메모리 관리 정보

프로세스마다 메모리에 저장된 위치가 다릅니다.
그래서 PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보들이 들어가야 합니다.

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

프로세스가 실행 과정에서 특정 파일이나 입출력장치를 사용하면 PCB에 명시가 됩니다.
어떤 입출력장치가 이 프로세서에 할당이 되었는지, 이 프로세스가 어떤 파일들을 열었는지 등

문맥 교환

하나의 프로세스가 시간이 다 되어 다른 프로세스로 넘어갈 때 어떤 일이 일어날까요?
예를 들어 A프로세스에서 B프로세스로 넘어가기 전에 A프로세스가 열어봤던 파일들이나 이용한 입출력장치, 메모리 정보 등의 중간 정보들을 백업해 놓아야 합니다.
그래야 다음에 다시 A프로세스의 차례가 왔을 때 기억하고 작업을 이어갈 수 있기 때문이죠

이러한 중간 정보를 문맥 (context) 이라고 합니다.
중간 정보 = 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보

이런 프로세스 문맥은 해당 프로세스의 PCB에 잘 기록되어 있습니다.

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

프로세스의 메모리 영역

메모리에는 커널 영역과 사용자 영역이 존재한다고 했습니다.
프로세스가 생성되면 PCB가 커널 영역에 생성이 된다고 했죠?
그럼 사용자 영역에는 어떻게 배치될까요?

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

코드 영역

코드 영역은 텍스트 영역이라고 불립니다.

여기에는 말 그대로 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장됩니다.

단순한 데이터가 아닌 CPU가 실행할 명령어가 담겨있기 때문에 쓰기가 금지되어 있습니다.
따라서 여기는 읽기 전용(read-only) 공간입니다.

데이터 영역

잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다.
이런 데이터로는 전역 변수가 대표적입니다.

정적 할당 영역과 동적 할당 영역

코드 영역과 데이터 영역 그 영역의 크기가 변하지 않습니다.

  • 코드 영역 : 프로그램을 구성하는 명령어들이 갑자기 바뀔 일이 없으니 코드 영역의 크기가 바뀔리 없고

  • 데이터 영역 : 데이터 영역에 저장될 데이터는 프로그램이 실행되는 동안에만 유지될 데이터니까요!

힙 영역

힙 영역은 프로그래머가 직접 할당할 수 있는 저장 공간입니다.

이 힙 영역에 메모리 공간을 할당했다면 언젠가는 다시 해당 공간을 반환해야합니다.
메모리 공간을 반환하지 않는다면 할당된 공간은 메모리에 계속 남아 메모리 낭비를 초래합니다. 이 문제를 메모리 누수 (memory leak)라고 합니다.

스택 영역

스택 영역은 데이터를 일시적으로 저장하는 공간입니다.

함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수가 대표적입니다.
일시적으로 저장될 데이터는 스택 영역에 PUSH되고, 더 이상 필요하지 않은 데이터는 POP됨으로써 스택 영역에서 사라집니다.

힙 영역과 스택 영역은 실시간으로 그 영역의 크기가 변할 수 있기 때문에 동적 할당 영역이라고 부릅니다.
그래서 일반적으로

  • 힙 영역은 메모리의 낮은 주소부터 높은 주소로 할당되고
  • 스택 영역은 메모리의 높은 주소부터 낮은 주소로 할당이 됩니다.

    그래야 주소가 겹칠 일이 없으니까요!

profile
공부 정리

1개의 댓글

comment-user-thumbnail
2023년 8월 13일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기