CS/Operating System
[Operating System] PCB & TCB
hanseongbugi
2024. 4. 6. 16:57
PCB(Process Control Block)?
- 운영체제가 프로세스를 제어하기 위해 정보(CPU 레지스터 값들)를 저장해 놓은 곳으로 프로세스의 상태 정보를 저장하는 구조체
- 운영체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스
- 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
- 프로세스는 CPU를 점유하여 작업을 처리하다가도 상태가 전이되면, 진행하던 작업 내용들을 모두 정리하고 CPU를 반환해야함
- 진행하던 작업들을 모두 저장하지 않으면 다음에 자신의 순서가 왔을 때 어떠한 작업을 해야하는지 알 수 없는 사태가 발생한다.
- 프로세스는 CPU가 처리하던 작업의 내용들을 자신의 PCB에 저장
- 다음에 다시 CPU를 점유하여 작업을 수행해야 할 때 PCB로부터 해당 정보들을 CPU에 넘겨와서 계속해서 하던 작업을 진행
- PCB는 프로세스의 중요한 정보들을 담고 있으므로 일반 사용자는 접근하지 못하는 보호된 메모리 영역에 존재
PCB에 저장된 정보
- 프로세스 식별자(Process ID)
- 프로세스 고유 번호
- 프로세스 상태(Process State)
- 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated)
- 프로그램 계수기(Program Counter)
- 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
- CPU 레지스터 및 일반 레지스터
- CPU(Central Processing Unit)가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치
- CPU 스케줄링 정보
- 우선 순위, 최종 실행시각, CPU 점유시간 등
- 메모리 관리 정보
- 해당 프로세스의 주소 공간 등
- 프로세스 계정 정보
- 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
- 입출력 상태 정보
- 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등
- 포인터
- 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등.
- 프로세스가 준비상태나 대기 상태일 경우에 큐로 운영이 되는데, 프로세스 제어 블록을 연결 시 큐로 구현하기 위해 포인터를 사용한다.
PCB 관리
- 운영체제는 빠르게 PCB에 접근하기 위해 프로세스 테이블을 사용하여 각 프로세스의 PCB를 관리한다
- 프로세스는 각각의 프로세스 이미지를 가진다. 프로세스 이미지는 데이터, 프로그램, 스택, PCB를 가진다.
- PCB는 Linked List 방식으로 관리된다.
- PCB List Head에 PCB들이 생성될 때마다 붙게 된다.
- 주소값으로 연결이 이루어져 있는 연결리스트이기 때문에 삽입 삭제가 용이함.
TCB(Thread Control Block)?
- TCB는 PCB보다 적은 데이터를 가지는 자료구조이다.
- thread와 관련된 data만 있으면 되기 때문
- thread의 상태, PCB를 가리키는 Pointer, 우선순위, 스택, 레지스터 등 thread의 정보를 저장하는 자료구조
- 운영체제가 thread를 관리하고 스케줄링하기 위해 필요한 정보를 제공
- thread가 생성될 때마다 생성되고, thread가 종료되면 해제된다.
- 메모리영역 중 PCB는 커널 영역TCB는 유저영역과 커널 영역에 둘다 있을 수 있다.
TCB에 저장된 정보
- 스레드 ID
- 스레드가 생성될 때 운영체제에서 스레드에 할당하는 고유 식별자
- 스레드 상태
- 스레드가 시스템을 통해 진행됨에 따라 변경되는 스레드의 상태
- CPU 정보
- 스레드가 얼마나 진행되었는지, 어떤 데이터가 사용되고 있는지 등 OS가 알아야 하는 모든 정보가 포함스레드
- 우선 순위
- 스레드 스케줄러가 READY 대기열에서 다음에 선택해야 하는 스레드를 결정하는 데 도움이 되는 다른 스레드에 대한 스레드의 가중치(또는 우선 순위)
- PCB를 가리키는 포인터
- 이 스레드 생성을 트리거한 프로세스를 가리키는 포인터
- 이 스레드가 생성한 스레드를 가리키는 포인터
- stack 포인터
- 스레드가 함수 호출할때 저장하는 곳인 stack을 가리킨다.
유저 영역과 커널 영역
유저 영역
- 유저영역에는 text(code), data, stack, heap 영역이 존재
- 스레드를 구현하고 관리하는 것이 유저영역의 heap에서 한다.
- 스레드 관련 모든 동작이 사용자 영역에서 진행
커널 영역
- 커널에서 스레드 관련된 모든 작업(스케줄링, 실행) 을 관리한다.
- 사용자 스레드와 커널 스레드가 1:1 매핑이 되었있다.
- 커널이 전체 프로세스와 스레드 정보까지 유지한다.
- 스케줄링과 동기화를 위해 더 많은 자원 필요하다
- 스레드 교환에 커널 개입으로 사용자영역에서 커널 영역으로 전환 필요하다
출처
https://velog.io/@sweet_sumin/PCBTCB
https://velog.io/@yoonuk/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-PCB%EC%99%80-TCB