OS에서 프로세스는 하나의 작업 단위를 말한다. 사용자가 프로그램을 실행하면 HDD 또는 SDD 저장장치에서 프로그램 코드를 메모리로 가져오게 되면서(Fetch) 하나의 작업이 생성된다. 이러한 작업들은 CPU를 할당받아 처리되어진다.
프로그램은 명령어, 코드 및 정적 데이터들의 묶음이라 보면 된다.
Process
실행 중인 프로그램을 말하며, 원초적으로는 하나의 쓰레드만을 가지고 있는 단일 스레드 프로세스를 의미한다.
프로세스가 생성되는 과정
1. 사용자에 의해 프로그램이 실행되어진다.
2. 프로그램 실행에 필요한 코드와 자원들을 메모리로 옮긴다(Fetch).
3. 해당 프로세스의 정보를 가지고 있는 PCB(Process Control Block)가 같이 생성된다.
4. 해당 프로세스는 준비 큐에 들어가 CPU 할당을 기다린다.
Process Control Block
어떤 프로그램이 프로세스가 되었다는 것은 OS로부터 PCB를 받았다는 것이다.
PCB는 커널 영역에 만들어지고 프로세스 테이블을 사용하여 관리되어진다.
- Pointer : 프로세스의 현재 위치를 저장하는 포인터 정보
- Process State : 프로세스의 상태를 저장(생성, 준비, 실행, 대기, 종료)
- Process ID : 여러 프로세스를 구별하기 위해 고유한ID값이 할당됨
- Program Counter : 다음에 실행될 명령어의 주소를 포함하는 카운터의 값을 저장
- Register's : 누산기(accumulator), 베이스, 색인 레지스터(index register), 스택 포인터와 같은 레지스터 값 저장
- Memory Limits : 메모리 위치정보, 메모리 보호에 사용되는 경계레지스터(Boundary Register)와 한계레지스터(Limit Register)에 대한 정보 포함, 그 외에 세그먼트 테이블, 페이지 테이블 정보도 포함
- Accounting : 계정 번호, CPU 할당시간, CPU 사용 시간 데이터가 저장
- Open File Lists : 프로세스를 위해 열린 파일 목록 정보 포함
- PPID, CPID : 부모 프로세스를 가리키는 PPID(Parent Process ID)와 자식 프로세스를 가리키는 CPID(Child Process ID)가 포함
프로세스 상태 변화
- 프로세스 생성 : 메모리로부터 코드를 가져와 실행. 어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 프로세스 제어블록(PCB)를 받았다는 의미이다.
- Running State : CPU를 할당받아 작업 진행 중에 있는 상태
- 프로세스를 마치거나 컨텍스트 스위칭에 의해 Blocked(Wait)상태 혹은 Ready 상태로 돌아간다.
- Preemption : Running →Ready로 가는 단계를 말하며 타임 슬라이스나 더 높은 우선순위로 인해 언제든 Running 상태로 갈수 있음을 의미한다.
- Ready state : CPU를 할당받기 위해 기다리는 상태(자원이 있는 상태)
- dispatch : 준비상태에 있는 프로세스를 하나 골라 CPU를 할당하는 작업
- Block(Wait) state : 입출력 작업을 하기 위해 이동하는 상태(자원이 없는 상태)
- wakeup : 필요한 자원을 갖게 되면 ready로 갈 수 있다는 신호
- Terminated state : 메모리에 있던 프로세스가 종료되어 해제되는 상태
Context Switching
CPU는 하나의 프로세스만을 담당하면 낭비가 심하다. CPU의 사용 효율을 극대화하기위해 Switching을 하며 여러 프로세스를 관리한다.
실행상태에서 하나의 프로세스가 나가고 새로운 프로세스가 들어오는 상황으로 타임슬라이스나 더 높은 우선순위로 인해 발생한다.
동작 순서
- 기존의 프로세스 정보를 pcb에 저장후 커널 스택에 저장
- 다음 프로세스 정보 불러오기
- 실행
프로세스의 생성과 복사
앞서 본 것처럼 프로그램을 실행시켜 프로세스를 생성하기도 하지만 fork() 시스템 호출을 통해서 프로세스를 복사하기도 한다.
1. fork()
실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수로 이전에 실행되던 프로세스는 부모 프로세스, 이전 프로세스에 의해 생성된 프로세스는 자식 프로세스로 부모- 자식 관계가 된다.
특징
- fork()를 호출하게 되면 기존 프로세스의 메모리 내용을 그대로 복사하여 자식 프로세스에서 사용한다. 따라서 처음 프로세스를 생성할 때보다 생성 속도가 빠르다.
- 부모-자식 관계이기 때문에 자식 프로세스를 부모가 관리할 수 있다. wait() 시스템 호출을 통해 자식 프로세스가 종료된 이후 부모 프로세스가 자식 프로세스가 사용했던 메모리를 정리 할 수 있다.
좀비 프로세스
부모 프로세스가 기다리지 않아 자원이 회수되지 못하고 계속 살아 있는 프로세스
부모가 자식의 pid를 받아와 헤제함으로써 좀비 프로세스 삭제. 부모가 거두지 않을 경우 init프로세스가 해제.
부모 프로세스가 자식 프로세스 보다 먼저 끝나고 날라가면 자식은 Orphan state라고 한다.
2. exec()
프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출. 현재의 프로세스가 메모리 데이터를 지운 채 메모리의 구조제 정보만을 재활용해 사용한다.
참고하면 좋은 사이트
'CS > 운영체제' 카테고리의 다른 글
Dead Lock (0) | 2022.08.11 |
---|---|
동기화 문제의 해결 (0) | 2022.08.11 |
Multi-Process VS Multi-Thread (0) | 2022.08.03 |
Thread란 (0) | 2022.08.03 |
OSI 7 Layer와 TCP/IP 4 Layer (0) | 2022.05.08 |