1) 요청 발생 : 인터럽트나 트렙에 의해서 컨텍스트를 바꿔야 한다는 요청이 들어옴
ex) I/O 입출력, 예외, 시스템 콜 등
2) PCB 에 프로세스 정보 저장 : 기존에 실행중이던 프로세스 P0 와 관련된 정보들을 PCB0 에 저장함
running → waiting
3) CPU 새롭게 할당 운영체제는 새롭게 실행할 프로세스 P1 에 대한 정보를 해당 PCB 에서 가져와 CPU 레지스터에 적재함
4) 요청 발생 : 인터럽트나 트렙에 의해서 컨텍스트를 바꿔야 한다는 요청이 들어옴 - P1의 상태를 PCB1에 저장
5) PCB0에 저장된 P0의 상태를 불러와 복구한다.
6) P0 실행
운영체제가 프로세스를 제어하기 위해 정보(CPU 레지스터 값들)를 저장해 놓는 곳으로 프로세스의 상태 정보를 저장하는 구조체
운영체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스
각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
프로세스는 CPU를 점유하여 작업을 처리하다가도 상태가 전이되면, 진행하던 작업 내용들을 모두 정리하고 CPU를 반환해야 하는데, 이때 진행하던 작업들을 모두 저장하지 않으면 다음에 자신의 순서가 왔을 때 어떠한 작업을 해야하는지 알 수 없는 사태가 발생한다.
-> 프로세스는 CPU가 처리하던 작업의 내용들을 자신의 PCB에 저장하고, 다음에 다시 CPU를 점유하여 작업을 수행해야 할 때 PCB로부터 해당 정보들을 CPU에 넘겨와서 계속해서 하던 작업을 진행할 수 있게 된다.
PCB 는 프로세스의 중요한 정보들을 담고 있으므로 일반 사용자는 접근하지 못하는 보호된 메모리 영역에 존재
PCB에 저장되어 있는 정보
1) 프로세스 식별자(Process ID) : 프로세스 고유 번호
2) 프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated)
3) 프로그램 계수기(Program Counter) : 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
4) CPU 레지스터 및 일반 레지스터 : CPU(Central Processing Unit)가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치
5) CPU 스케줄링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
6) 메모리 관리 정보 : 해당 프로세스의 주소 공간 등
7) 프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
8) 입출력 상태 정보 : 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등
9) 포인터 : 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등. 프로세스가 준비상태나 대기 상태일 경우에 큐로 운영이 되는데, 프로세스 제어 블록을 연결 시 큐로 구현하기 위해 포인터를 사용한다.
운영체제는 빠르게 PCB에 접근하기 위해 프로세스 테이블을 사용하여 각 프로세스의 PCB를 관리한다
프로세스는 각각의 프로세스 이미지를 가진다. 프로세스 이미지는 데이터, 프로그램, 스택, PCB를 가진다.
TCB는 PCB보다 적은 데이터를 가지는 자료구조이다.
참고) 스레드끼리는 사용자 수준 문맥의 text 영역과 data 영역은 공유, stack 영역은 따로 갖는다
구조
1) 스레드 ID : 스레드가 생성될 때 운영 체제에서 스레드에 할당하는 고유 식별자
2) 스레드 상태: 스레드가 시스템을 통해 진행됨에 따라 변경되는 스레드의 상태
3) CPU 정보: 스레드가 얼마나 진행되었는지, 어떤 데이터가 사용되고 있는지 등 OS가 알아야 하는 모든 정보가 포함스레드
4) 우선 순위: 스레드 스케줄러가 READY 대기열에서 다음에 선택해야 하는 스레드를 결정하는 데 도움이 되는 다른 스레드에 대한 스레드의 가중치(또는 우선 순위)
5) PCB를 가리키는 포인터 : 이 스레드 생성을 트리거한 프로세스를 가리키는 포인터
6) 이 스레드가 생성한 스레드를 가리키는 포인터
7) stack 포인터 ( stack : 스레드가 함수 호출할때 저장하는 곳)
메모리영역 중 PCB는 커널 영역TCB는 유저영역과 커널 영역에 둘다 있을 수 있다.
(1) 유저 영역 → 요즘은 거의 유저 영역은 거의 사용안함.
유저영역에 text, data, stack, heap 영역
스레드를 구현하고 관리하는 것이 유저영역에 heap에서 한다.
스레드 관련 모든 동작이 사용자 영역
(2) 커널 영역
커널에서 스레드 관련된 모든 작업(스케줄링, 실행) 을 관리한다.
사용자 스레드와 커널 스레드가 1:1 매핑이 되었있다.
커널이 전체 프로세스와 스레드 정보까지 유지한다.
스케줄링과 동기화를 위해 더 많은 자원 필요하다
스레드 교환에 커널 개입으로 사용자영역에서 커널 영역으로 전환 필요하다
잘 봤습니다. 좋은 글 감사합니다.