- 프로세스란?
- “실행가능한” 프로그램이 CPU에게 특정한 자원할당 알고리즘(CPU스케쥴링)에 따라 자원을 할당받아 실행된 형태.
- 프로세스의 종류는 부모/자식 프로세스가 존재함
- 프로세스의 ID는 PID ( Process Identification )라 부름.
프로그램이 프로세스가 되는 과정??
https://cinrueom.tistory.com/40
- 메모리에 프로그램이 올라감.
- 메모리상에 존재하는 명령어를 cpu로 가져오는 작업을 한다
- 명령어를 CU가 해성함.
- 해석된 명령어를 ALU가 수행함.
- 그렇다면 부모와 자식 프로세스는 무슨 차이인가?
- 부모 프로세스는 fork() 명령을 통해 자식 프로세스를 생성함.
- 모든 프로세스는 1번 프로세스 ( init 프로세스 )가 fork() 명령어를 통해 생성됨. << 여기서 생성된 프로세스의 PPID는 1임 ( 부모의 PID를 가르킴 )
- init 프로세스에 의해 생성된 프로세스도 자식 프로세스를 생성할 수 있음. << 여기서 생성된 프로세스의 PPID는 부모 PID, 예를들면 119, 120 등 다양한 id가 존재하는 것을 볼 수 있음.
- 부모와 자식 프로세스는 병렬로 실행됨 // 당연한 말임
- 프로세스 간에는 직접적으로 영향을 주지 않으나, IPC를 통해 자원을 공유할 수 있음.
- PIPE, Named PIPE, MQ, Shared Memory 등.
여기서 부모 프로세스가 죽으면?
- 고아 프로세스가 됨. 부모가 없음.
- 고아 프로세스가 되면 PPID는 init 프로세스의 id가 됨(1)
- 고아 프로세스는 프로세스 자신이 시스템의 자원을 낭비할 수 있고, 시스템이 프로세스가 종료될 때까지 추적을 해야 하기 때문에 성능 저하의 원인이 됨
- 일반적으로 부모 프로세스는 자식 프로세스가 종료될때까지 기다림. 파이썬에서는 join이었는데 다른 언어에선 모르겠음.
좀비 프로세스.
- 프로그램이 종료됐는데, 부모 프로세스가 종료된 자식 프로세스의 자원을 회수하지 않은 형태.
- 좀비 프로세스는 자식의 정보가 담긴 최소한의 정보 ( PID, STATUS 등)만 남겨있음.
- 한정된 PID의 양을 갉아먹는 존재.
- 다른 프로세스 실행에 방해가 될 수 있다고 함.
쓰레드란?
- 프로세스의 실행 단위임.
- 프로세스의 쓰레드와 CPU의 코어의 쓰레드와 다른가?
개념은 비슷함. CPU에서는 하나의 코어에서 할 수 있는 작업의 개수를 의미하고, 프로세스에서는 프로세스에서 실행되는 작업의 단위를 의미함.
- 프로세스에서 작업을 실행하면 쓰레드가 생성되어 CPU 코어의 쓰레드라는 작업공간을 할당받아 실행됨.
프로세스의 메모리 구조는
Heap, stack, data, code로 이루어짐.
code : 작성한 코드가 들어있음. 읽기만 가능한 영역임. 자바에서는 method area가 같은 역할을 함
data : static, global 등 프로그램이 사용하는 데이터 공간
// BSS : 초기값 없는 global, static
heap : 동적으로 사용되는 영역이며, malloc으로 할당함.
프로그래머가 사용되는 공간임.
자바에서는 객체의 인스턴스가 만들어지면 여기 할당됨.
stack : primitive type의 변수, 함수의 수행의 마치고 복귀할 주소, 함수 인자 값 등이 저장됨. // 이것도 자바의 stack이랑 같음
프로세스는 PCB라는 블록에 상태 정보를 저장함.
https://dev-mystory.tistory.com/119
PCB에는 프로세스의 주소공간, PC, SP, 상태, ID 등 다양한 정보를 저장함.
PC ( 프로그램 카운터 ) : 다음 명령어의 주소를 저장하는 제어 레지스터임.
뭘 실행해야하는지
SP ( 스택 포인터 ) : 프로세스의 스택의 위치 정보를 나타내는 데이터 레지스터.
어디까지 실행됐는지…
- 레지스터는 cpu안에 존재하는 휘발성 메모리 공간임.
- 캐시보다 빠름. 레지스터 > 캐시 > 메모리 >>>>>디스크
캐시 VS 레지스터
공통점 : 명령이나 데이터를 저장함
차이
- 캐시는 램과 CPU간의 속도 차이를 완화시키기 위한 것
- 레지스터는 CPU 안에서 연산을 처리하기 위한 것.
PCB에 포함되는 정보
- (1) Process ID : 프로세스를 구분하는 ID
- (2) Process State : 각 State 들의 상태를 저장한다.
- (3) Program Counter : 다음 Instruction 의 주소를 저장하는 카운터. CPU는 이 값을 통해 Process 의 Instruction 을 수행한다.
- (4) Register : Accumulator, CPU Register, General Register 등을 포함한다.
- (5) CPU Scheduling Information : 우선 순위, 최종 실행시간, CPU 점유시간 등이 포함(*)**된다.
- (6) Memory Information : 해당 프로세스 주소공간(lower bound ~ upper bound) 정보를 저장.
- (7) Process Information(페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등)
- (8) Device I/O Status(프로세스에 할당된 입출력 장치 목록, 열린 팔린 목록 등)
- (9) Pointer : 부모/자식 프로세스에 대한 포인터, 자원에 대한 포인터 등
- (10) Open File List : 프로세스를 위해 열려있는 파일의 리스트
'운영체제' 카테고리의 다른 글
리눅스 운영체제 커널 파해치기 (1) (1) | 2022.12.25 |
---|---|
부모, 자식 프로세스, 쓰레드와 코어 (1) | 2022.11.21 |
캐시 종류 (0) | 2022.10.19 |
스토리지 (0) | 2022.10.18 |
리눅스/파일 디스크립터 (0) | 2022.10.14 |