티스토리 뷰
이전에 프로세스는 프로그램이 실행 중이라면 process라고 칭한다 했다.
다시금 설명을 하자면,
프로세스란?
프로그램이 실행되기 전에는 보조 기억장치에 저장된 데이터로 두고,
해당 데이터(프로그램)가 메모리에 적재되어 CPU를 통해 실행되는 순간 프로세스가 된다.
프로세스는 크게 두가지로 나눠지는데,
프로그라운드 프로세스(forground process)와 백그라운드 프로세스(background process)가 있다.
프로그라운드 프로세스(forground process)의 경우
사용자가 보이는 앞에서 실행되는 프로세스이며
백그라운드 프로세스(background process)의 경우
사용자가 보지 못하는 편에서 실행되는 프로세스다.
사용자와 상호작용하지 않고 작업을 수행하는 백그라운드 프로세스도 있는데 이러한 프로세스를
유닉스에서는 데몬(deamon)이라고도 하며 윈도우에서는 서비스(service)라고도 한다.
이전 1장에서 CPU가 메모리에 적재된 프로세스들을 하나씩 밖에 수행할 수 없다고 했다.
그렇기에 하나 수행하고 저장 후 다른 프로세스를 실행시키고 다시 저장하고 본래 프로세스로 돌아오게되는데,
이전의 정보를 백업시키는 공간(PCB)이 필요하다.
프로세스 제어블록 PCB (Process Control Bloc)이란?
이러한 진행상황, 주소에 대한 값을 백업을 위해 저장하는 곳이 PCB다.
운영체제가 빠르게 번갈아 수행되는 프로세스의 실행순서를 관리하고 자원을 배분하기 위해 해당 PCB를 사용하는데
쉽게 얘기하자면 프로세스와 관련된 정보를 저장하는 자료구조라고 볼 수 있다.
PCB는 운영체제의 커널영역에 생성되며,
운영체제가 특정 프로세스의 식별과 처리에 필요한 정보를 찾아 판단하게 된다.
+ PCB는 프로세스 생성 시에 만들어지며 실행이 마치면 폐기된다.
그렇다면 PCB에는 정확히 어떤 정보가 담기는가?
프로세스 ID , 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리정보, 사용한 파일과 입출력 장치 목록 에 대한 정보를 갖고있다
- 프로세스 ID
특정 프로세스를 식별하기위해 부여한 고유번호다.
-레지스터 값
해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 값들이 담긴다. / 컴퓨터 구조에서 코드(명령어)를 실행하기위해서는 레지스터를 통해 연산과 저장등 다양한 일련의 과정이 이뤄지는데 해당 하드웨어적인 정보를 갖게되는 것이다.
-프로세스 상태
현재 프로세스가 실행되기 위해 기다리는(wait)상태인지, CPU를 이용하고 있는 상태인지에 대한 프로세스의 정보가 저장된다.
- CPU 스케줄링 정보
이전 1장에서 간략히 말한것을 참고하여 CPU가 다양한 프로세스들을 순서에 따라 실행하게 되는데 해당 순서에 따라 프로세스가 어떤 순서, 언제에 실행될지에 대해 기록된다.
-메모리 관리정보
프로세스가 메모리에 적재된 주소의 값은 유니크하다. 그렇기 때문에 해당 정보를 가진 프로세스가 어디 메모리 주소에 적재되있는 지에 대한 정보가 저장되어있다. (해당 정보는 PCB에 베이스 레지스터, 한계 레지스터값과 같은 정보다)
+페이지 테이블 정보도 담긴다
-사용한 파일과 입출력장치 목록
프로세스가 입출력에 대해 파일을 사용하면 PCB에 해당 내용을 명시한다.
PCB를 통해 프로세스의 정보를 백업으로 담아 다른 프로세스로 CPU를 할당하여 실행시킨다는 것은 알겠다.
그렇게 순서에 따라 다른 프로세스로 실행 순서가 넘어가게되어 다른 프로세스의 PCB정보를 읽게될 것이다.
PCB를 통해 실행 내용을 기록하고 다시 실행을 재개할 수 있게 하는 정보를 문맥(context)라한다.
그럼 이한 문맥을 읽어 다시 프로그램을 재개하는건 어떻게 할까?
정답은 문맥 교환이다.
문맥교환(Context Switching)이란?
하나의 프로세스 문맥은 해당 프로세스의 PCB에 저장되어 있다.
실행했던 문맥을 잘 기억해두면 다시 해당 프로세스의 실행을 재개하기 위해 편리해지며
예기치 못한 상황에 발생하여 인터럽트에 따른 PCB 문맥을 백업 및 복구를 실행한다.
이러한 자연스러운 과정을 통해 기존 프로세스의 문맥을 PCB에 백업하고
새로운 프로세스를 실행시키기위해 문맥을 PCB로 부터 복구하여 실행시키는 것을 문맥 교환이라고한다.
이러한 문맥교환은 정말 빠르게 번갈아가며 실행되어 우리들의 시각에는 한번에 즉, 동시에 일어나는 것처럼 보이게한다.
프로세스가 실행되어 메모리의 커널 영역에 PCB가 생성된다고 위에 말했다.
그럼 사용자 영역에는 어떤게 적재될까?
프로세스의 메모리 영역이란?
위 그림의 왼쪽은 메모리 영역을 커널 영역과 사용자 영역으로 이중모드로 나눠 보고 있으며 사용자 영역의 자세한 모습을 보여주고 있다.
사용자 영역은 코드,데이터,힙,스택 영역으로 나누어져 저장된다.
- 코드영역(code segment)은 텍스트 영역이라고도 하며 실행 시킬 코드가 기계어로 되어 명령어로써 저장된다.
해당 코드 영역에는 데이터가 아닌 명령어가 저장되어 있기 때문에 쓰기가 금지되어 있어, 읽기전용(read only)공간이다.
- 데이터 영역(data segment)는 캐시처럼 잠깐 저장했다가 지울 정보가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 들어갈 데이터로는 전역변수(global variable)가 대표적으로 있다.
위의 코드 영역과 데이터 영역의 경우 명령어와 명령어에 쓰이는 전역 변수의 정보가 담긴 공간으로 명령어가 read only로 되어 있어 수정되지 않기에 두 영역은 정적 할당 영역이라고도 한다. 반면 나머지 설명할 힙, 스택 영역의 경우 동적 할당 영역이라고 한다.
- 힙 영역(heap segment) 은 프로그램을 만드는 프로그래머가 직접 할당할 수 있는 저장공간이다. /만약 사용했다면 사용했던 공간을 반환해야한다 -> 하지 않으면 메모리 누수라고하여 메모리에 해당 데이터가 계속남아 낭비를 초래하게된다.
-스택 영역(stack segment) 은 데이터를 일시적으로 저장하는 공간이다. 데이터 영역에 담기는 값과는 다르게 잠깐 쓰고 버리는 값들이 저장되는 공간으로써 전역변수가 아닌 매개변수, 지역변수가 대표적이다.
프로세스를 간략하게 알아보고 PCB, 사용자 영역에 대해 알아봤다.
이제는 PCB에 저장한다 했던 프로세스의 상태와 프로세스의 계층구조에 대해 순차적으로 알아보자
우리가 평상시 컴퓨터를 하다보면 브라우저가 응답없음으로 뜨면서 멈추는 것을 경험한 적이있을 것이다.
이것은 현재 응답없음의 프로세스 상태를 보여주고 있는 것이다.
프로세스 상태에는 어떤 것이있을까
프로세스의 상태란?
운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리하는데 문맥교환과 프로세스의 생성 및 종료에 대해 다루게 된다. 프로세스의 상태는 대표적으로 생성, 준비, 실행, 대기, 종료가 있다.
- 생성 상태 NEW
프로세스를 생성 중인 상태로 이제 막 메모리에 적재되어 PCB도 할당 받은 상태다.
생성이후 준비 상태 -> 실행 상태 순으로 CPU 할당을 받게 된다.
- 준비 상태 READY
당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례를 기다리는 상태다. 이전에 말한 CPU 스케쥴링에 의해 CPU를 할당 받길 기다리는 상태라고 할 수 있다.
- 실행 상태 RUNNIG
CPU를 할당받아 실행 중인 상태를 의미한다. 실행 상태인 프로세스는 할당된 일정 시간내에만 CPU를 사용할 수 있으며 타이머를 통해 인터럽트가 걸려 중지되면 다시금 준비상태가 되거나, 입출력 장치를 사용하게되어 입출력 장치의 작업이 완료될 때 까지 대기 상태가 되기도 한다.
- 대기 상태 WAITING
프로세스 실행 중, 입출력 장치를 사용하여 입출력장치의 작업이 끝날 떄까지 기다리는 상태다. 작업이 완료되면 해당 프로세스는 다시 준비상태로 CPU의 할당을 기다린다.
- 종료 상태 TERMINATED
프로세스가 종료된 상태로 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층구조란?
프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있다. 이때 새로 생성한 프로세스를
부모 프로세스(parent process)라고하며
부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)라고한다.
부모와 자식 프로세스는 다른 PID를 가지며 자식 프로세스의 PCB에 부모 프로세스의 PPID가 기록되기도한다.
또한 부모 프로세스로부터 생성된 자식 프로세스의 실행과정에서 또 다른 자식프로세르를 가질 수도 있으며 이러한 프로세를 낳는 계층적인 구조를 프로세스는 갖는다.
이러한 구조를 통해 운영체제는 프로세스를 관리하며
컴퓨터 부팅시.
최초의 프로세스로부터 자식 프로세스들을 생성하는 형식으로 동시에 여러 프로세스가 실행되는 것이다.
아래와 같은 트리의 구조를 가지게되는데 이를 프로세스 계층 구조라고한다.
위에서 forkl라는 명령어가 궁금할 것이다. 어떻게 프로세스는 생성되는 것일까?
프로세스 생성 기법으로는 복제와 마치 옷갈아 입기와 같이 실행된다.
프로세스 생성기법이란?
부모 프로세스가 fork()를 통해 자신의 복사본으로 자식 프로세스를 생성해내고
만들어진 자식 프로세스는 exec()를 통해 자신의 메모리공간을 다른 프로그램으로 교체한다.
여기서 사용한 fork와 exec는 응용프로세스에서
커널 영역의 운영체제에게 도움을 요청하는 시스템 콜이다.
( 자기가 직접 자원을 다룰 수 없으니 부른다 )
fork는 부무 프로세스를 복사하는 명령어이며,
exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 명령어다.
여기서 새로운 프로그램으로 덮어쓴다는 것은 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화된다는 말이다.
그림참고)
https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system
'Operating System' 카테고리의 다른 글
6. Deadlock (0) | 2023.01.19 |
---|---|
5. Process Synchronization (0) | 2023.01.19 |
4. CPU Scheduling (0) | 2023.01.19 |
3. Thread (0) | 2023.01.16 |
1. Operating System (0) | 2023.01.15 |