저번에 프로세스와 스레드의 차이를 다루었다. 여기서 프로세스는 프로그램이 실행될 때의 작업의 단위라고 하였는데 프로세스가 생성될 때는 프로세스 메모리 블록이라고 하는 PCB도 생성이 된다. 그리고 이 PCB는 프로세스가 완료되면 소멸된다. 프로세스와 PCB에 대해서 자세히 알아보자!
⭐프로그램 실행 과정
프로그램이 실행될 때 보조기억장치에 있는 프로그램으로부터 프로세스 이미지를 생성하는데 운영체제가 이 생성된 프로세스 이미지를 주기억장치로 적재시켜 사용한다. 프로세스 이미지에는 코드 영역, 데이터 영역, 스택 영역, 힙 영역이 포함된다. 즉 코드와 데이터의 초기상태가 포함되어있다.
CPU는 프로세스 이미지의 내용을 참조하여 프로세스가 초기화되고 프로그램을 실행한다.
그리고 이 실행이 시작될 때 PCB가 생성되어 저장되고, PCB의 주소는 프로세스 테이블에 추가된다.
각 프로세스는 독립된 사용자 공간을 소유하고, 커널 공간을 공유한다.
프로세스의 주소 공간
프로세스의 주소공간은 두개의 공간으로 나눠진다.
1) 사용자 공간
- 프로세스의 코드, 데이터, 힙, 스택 영역이 할당되는 공간
- 코드와 데이터 영역의 크기는 프로세스 시작 시 결정
- 힙과 스택 영역의 크기는 정해져 있지 않음
- 힙 영역은 아래로 자라고, 스택은 위로 자람 -> 스택이 힙 공간을 침범하면 스택 오버플로우, 힙이 스택 공간을 침범하면 힙 오버플로우
2) 커널 공간
- 프로세스가 시스템 호출을 통해 이용하는 커널 공간
- 커널 코드, 커널 데이터, 커널 스택(커널 코드가 실행될 때)
- 커널 공간은 모든 사용자 프로세스에 의해 공유 (프로세스나 스레드가 스택이나 힙을 소유 )
사용자 공간의 구조
- 코드(Code) 영역: 프로그램의 명령어들이 저장되는 영역. 이 영역에는 실행 파일의 기계어 코드가 포함되어 있으며, CPU가 이 코드를 실행하여 프로그램을 실행한다.
- 데이터(Data) 영역: 정적으로 할당된 전역 변수, 정적 변수 및 상수가 저장되는 영역. 이 영역은 프로그램 실행 중에 변경되지 않는 데이터를 저장하는 데 사용된다.
- BSS와 GVAR 영역을 통츨어 Data 영역이라고 함.
- BSS : 초기화가 되지 않은 데이터를 저장하기 위한 영역 (RAM에 저장)
- GVAR : 초기화가 된 데이터를 저장하기 위한 영역 (ROM에 저장)
- (초기화된 데이터는 값을 저장해야하기 때문에 비휘발성 메모리인 ROM에 저장)
- BSS와 GVAR 영역을 통츨어 Data 영역이라고 함.
- 스택(Stack) 영역: 함수 호출 및 지역 변수와 같은 프로그램 실행의 임시 데이터를 저장하는 영역. 함수가 호출될 때마다 스택 프레임이 생성되고, 함수의 인수, 지역 변수, 반환 주소(리턴값)가 여기에 저장된다.
- 힙(Heap) 영역: 동적으로 할당되는 메모리가 저장되는 영역. 프로그램 실행 중에 필요에 따라 메모리가 동적으로 할당되고 해제된다. 보통 사용자가 직접 관리해야 하는 메모리 영역이다.
Q. 자바스크립트에서 객체는 어떤 영역에 저장되나요?
A. 자바스크립트의 경우 객체 타입 변수와 같이 크기가 가변이고 동적으로 생성되는 데이터 구조들이 여기에 저장된다. 객체가 생성될 때는 그 크기가 미리 알려져 있지 않으며, 따라서 필요한 만큼의 메모리가 힙에 할당되고 객체가 저장된다.
자바스크립트의 메모리 관리는 일반적으로 가비지 컬렉션(Garbage Collection) 알고리즘을 사용하여 힙 메모리에서 더 이상 필요하지 않은 객체를 정리한다.
이를 통해 메모리 누수를 방지하고 자원을 효율적으로 관리할 수 있다.
PCB란?
PCB에 저장된 정보를 보면 알 수 있듯이 프로세스를 관리하는 데 필요한 모든 중요한 정보를 포함하고 있다. 프로세스가 실행될 때 생성된다.
PCB가 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 남는다. 일부 운영 체제에서 PCB는 커널 스택의 처음에 위치한다.
PCB는 대표적으로 문맥교환에 사용이 된다. 실행중인 프로세스 A에서 다른 프로세스 B를 실행할 때 프로세스 A가 어디까지 실행되었는지 정보를 PCB에 기록해두었다가 다시 가져오게 된다.
PCB의 구조
-
- Process ID (PID) : 프로세스를 식별하는 ID
- 프로세스 상태 (Process State) : 생성Create, 준비Ready, 실행Running, 대기Waiting, 완료Terminated 상태
- 프로그램 계수기 (Program Counter,PC) : 코드 한 줄을 가리키는 주소 레지스터. 다음에 실행할 명령어의 주소를 가리킨다.
- CPU 레지스터 및 일반 레지스터
- CPU 스케줄링 정보 : 우선 순위, 최종 실행시간, CPU 점유 시간 등
- 메모리 관리 정보 : 해당 프로세스의 주소 공간
- 프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치 목록, 열린 파일 목록 등
- 포인터 (Stack Pointer,SP) : 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보. 함수 실행 될때 Stack 최상단 주소 레지스터
프로세스 테이블
운영체제는 빠르게 각 PCB에 접근하기 위해 프로세스 테이블을 이용해서 각 PCB를 관리한다. 프로세스 테이블에는 PCB의 포인터가 저장된다.
프로세스 테이블은 연결 리스트(linked-list)로 만들었는데 프로세스가 생성/소멸되는 것에 따라 업데이트해줘야 하기 때문에 추가/생성 비용이 O(1)인 연결 리스트를 사용하는 것이다.
그럼 이 프로세스 테이블과 PCB는 어디에 저장되어 있을까? 정답은 주기억장치의 커널 공간이다.
스레드 메모리 블록(TCB)
TCB는 운영체제에서 스레드를 컨트롤 할때 사용하는 중요한 정보들을 모아놓은 커널의 한 자료구조이다. TCB는 스레드처리를 위해 필요한 필수정보들을 모아놓은 라이브러리 역할을 시스템에서 하게 된다. PCB는 TCB와는 다르게 데이터 섹션이나 프로세스-커널 정보(File descriptor와 같은 프로세스 의존정보)에 대한 정보도 포함해야 하기 때문에 좀더 무겁고 느리다. 그에 반해 TCB의 처리는 하드웨어 정보다 스레드를 식별하기 위해 필요한 정보들, 예를 들어 스택 포인터, 레지스터 정보와 같은 정보만을 저장하기 때문에 가볍고 빠르다. 따라서 프로세스의 스케쥴링보다는 TCB를 이용하는 스레드 스케쥴링이 훨씬 빠르다.
TCB에는 다음과 같은 정보들이 포함된다.
- 스레드 ID
- 스택 포인터
- PC카운터
- thread state 정보
- Thread 레지스터 정보
- 스레드를 소유하는 프로세스에 대한 PCB정보
Ref
Thread control block - noriwiki
개요 TCB는 운영체제에서 스레드를 컨트롤 할때 사용하는 중요한 정보들을 모아놓은 커널의 한 자료구조이다. TCB는 스레드처리를 위해 필요한 필수정보들을 모아놓은 라이브러리 역활을 시스템
junhoahn.kr
'CS > 운영체제' 카테고리의 다른 글
가상 메모리와 물리 메모리 (0) | 2024.04.24 |
---|---|
동기와 비동기, Blocking과 Non-Blocking (0) | 2024.04.23 |
멀티 프로세스 vs 멀티 스레드 (0) | 2024.04.21 |
프로세스와 스레드의 차이 (0) | 2024.04.18 |