저번 시간에는 운영체제 구조에 대해서 간단히 알아봤습니다. 이번엔 Process에 대해서 간단히 알아보겠습니다.
프로세스란 간단히 말해서 실행되고있는 프로그램이라고 말할수 있습니다. 문서 파일을 확인하기위해서 Word 프로그램을 실행시키면 문서 파일을 확인하는 행위 자체가 Process가 구동됐다고 말씀드릴수있겠습니다. Process에 대해서 더 자세히 알아볼까요?
프로세스의개념

간단하게 프로세스 구조에대해서 그림으로 나타내고 있습니다. 그럼 그림을 하나하나씩 모든걸 파헤쳐보겠습니다
프로세스 문맥을 먼저 한번 확인해볼까요?
프로세스 문맥이란 프로그램이 실행되고 종료되는 시점 그 중간 지점에서 도대체 프로그램이 어떻게 실행 됐는지 현재 어떤 상태인지 나타내기 위해서 사용되는것을 나타내기 위함입니다. 결국은 프로세스가 어느정도까지 진행됐는지 규명하는 부분이 프로세스 문맥입니다.
그렇다면 프로세스의 문맥안에 있는중 Program Counter는 무엇일까요?
특정시점을 놓고봤을때 프로그램이 실행된다면 프로세스는 독자적인 주소공간을 형성이 됩니다. -> stack,data,code 형성
프로세스가 CPU를 잡게되면 Program Counter Register가 Process Code의 어느 부분을 가리키고 있고, 매순간 기계어를 하나씩 읽어들여 CPU안에 불러들입니다. 즉, 산술연산처리를하여 레지스터에 저장하거나 메모리에 저장 하는 역할을 맡게됩니다.
간단하게 Program Counter와 프로세스 문맥의 정의에대해서 말씀드렸습니다. 결국 우리는 Program Counter가 어딜 가리키고있는가? 코드의 어느부분까지 실행됐는가? 스택에 어떤 내용이 쌓여있는가? 기계어를 어디까지 실행했는가? 등 이 모든 요소를 알아야지만 프로세스의 현재상태를 알아낼수있습니다. 그 현재사탱을 나타내는지 필요한 모든 요소를 프로세스 문맥이라고 다시 말씀드릴수있겠습니다. [뒤죽박죽이여도 이해바랍니다]
그럼 프로세스의 문맥을 좀더 자세하게 이야기 드려보겠습니다
프로세스 문맥의 구조
CPU와 관련된 하드웨어 문맥
프로세스 라는것은 CPU를 잡고 매순간 기계어를 실행하는 존재입니다. 현재시점에 프로세스가 기계어를 어디까지 실행했는가? 를 알기위해서 Register의 중요도가 높아지는데요, 다른 Register가 어떤 값을 넣고있는지 필요하고 PC Register가 어떤값을 넣고있는건지 필요합니다. 그것이 바로 CPU와 관련된 하드웨어 문맥입니다.
프로세스의 주소 공간
Code,Data,Stack의 어떤 내용이 들어있는가에 따라 프로세스의 현재 상태를 알수 있습니다.
프로세스 관련 커널 자료 구조
운영체제 역할중의 하나가 지금 컴퓨터안에서 돌아가고있는 프로세스들을 관리하는 역할을 하고있습니다. 프로세스가 하나 생길때마다 운영체제는 그 프로세스를 관리하기위해서 자신의 Data영역에 자료구조를 하나 두고있습니다 => 이를 PCB라고 일컫습니다.
프로세스가 하나 실행될때마다 운영체제는 PCB를 하나씩ㄷ 두고있고, 모든 요소를 관리하는 역할을 하고있습니다. 그렇기때문에 현재 상태를 알려면 CPU와 메모리상태를 알아야하지만 운영체제가 프로세스에 대해서 어떻게 평가하고있는지 알아야합니다.
Kernel Stack은 각 프로세스가 자기 자신의 코드를 실행중일때 (=함수호출) 본인의 스택에 함수를 호출 및 return하고 관련된 정보를 갖고오지만 본인이 할수없는일을 운영체제 에게 대신해달라고 요청할수있습니다. (=System Call) 그럼 Program Register는 커널 주소공간의 Code를 실행하게됩니다.
프로세스의 문맥에 대해 이해도가 좀 높아졌다면 이제 프로세스의 상태에대해서 말씀드려보겠습니다.
프로세스의 상태

그림을 좀더 이해하기 쉽게 알기위해서 설명을 좀더 드려보도록 하겠습니다
예를들어 컴퓨터안에 싱글 CPU라고 가정한다면 CPU를 잡고있는 프로세스는 Running이라고 부릅니다. CPU가 하나밖에 없기때문에 CPU를 기다리는 프로세스들은 Ready라고 말할수 있습니다. 그다음 CPU를 할당해봤자 기계어를 못읽는 프로세스들이 존재한다고 가정한다면 (I/O 작업을하고있는) 당장 실행이 불가능한 프로세스를 Blocked라고 말할수 있습니다.
좀 더 자세하게 그림으로 볼까요?
프로세스 상태도 자세한 설명

무엇인가 더 많아졌죠? 말씀드려보겠습니다
new => Process가 새로 태어난 상태 (할당받지못하거나 가만히있는)
ready => 메모리 조건 CPU 실행조건을 맞췄지만 아직 Ready queue에 존재하는 CPU를 할당받지못한 상태
running => CPU를 할당받아 프로세스의 역할을 해낼수있음
watiting => 자진해서 CPU를 내놓고, I/O 작업을 하기위해서 CPU를 일부러 버리는 행위 (I/O or even wait)
interrupt => Timer Interrupt이 일어나서 CPU를 강제적으로 뺏기는 상황
I/O or event completion => waiting 된 프로세스가 I/O작업이 끝났거나 event를 종료했다면 ready로 들어갑니다
scheduler dispatch => OS의 scheduling으로 인해서 다시 ready queue에있던 프로세스가 running으로 바뀝니다.
terminated=> 프로세스가 종료되는 상황을 일컫습니다.
좀 더 자세하게 상태도를 말씀드려보겠습니다.

CPU는 굉장히 빠르고 여럿이 공유하는 자원입니다. 그렇기때문에 하나의 프로세스만 사용할수있는데요,
프로세스 흐름도를 말씀드려보겠습니다. 하나의 프로세스는 프로세스가 I/O 작업이 생긴다면 프로세스 상태는 Running에서 Blocked로 바뀌고 Disk I/O Queue 로 들어가게됩니다 순서대로 일이 진행되면 Disk contoller 에서 CPU에게 Interrupt를 걸어 CPU는 interrupt로 인해 잠시 작업을 멈추고 CPU 제어권이 운영체제 커널로 넘어가고, 운영체제 커널은 I/O을 요청했던 프로세스의 메모리 영역에 해당하는 데이터를 넘겨주거나 프로세스의 상태를 Blocked를 Ready로 바꾸어 CPU를 사용하는 자격을 부여합니다.
꼭 하드웨어에있는 어떤 서비스를 기다려서 줄서는 경우가 있지만, 자원중에는 소프트자원도 있습니다. 예를들어 공유가 데이터가 있고, 여러 프로세스가 동시에 접근하는 도중에 CPU를 뺏겨 다른 프로세스가 또 공유데이터를 접근하게되면 일관성이 깨지는 문제가 존재합니다. 어떤 프로세스가 이미 공유데이터에 접근하고있으면 다른 프로세스가 접근하러왔을때 접근을 막아주는 경우가 필요한데, 이미 사용하고있는 프로세스가 CPU를 내어놓지않으면 문제가 발생하기때문에 해당 프로세스는 Blocked 상태가됩니다.
결국 우리는 놀이동산에서 줄서고 타는것과 똑같다고 보시면될것 같습니다.
Queue라는것은 운영체제 커널이 본인의 data 영역에 자료구조 queue를 만들어놓고, 프로세스 상태를 바꿔가면서 ready 상태에있는 친구중에 CPU를 주고 blocked 친구들한텐 CPU를 안주는 운영을 하는것입니다.
다음은 PCB에 대해서 알아보겠습니다.
PCB의 구조

PCB는 OS가 관리상 사용하는 정보입니다. 프로세스 하나당 PCB가 존재하는것이죠.(구조체로 유지) PCB는 프로세스의 상태를 알려주는 역할을합니다. Process State, Process ID or Scheduling inforamation, Pointer등.. 운영체제는 Process ID를 관리합니다.
또한 Program Counter, Register등 프로세스 문맥을 표시하기위한 정보들을 존재합니다 => CPU에 어떤 Register 값을 넣어서 실행하고있는가?를 알려주기위함
문맥 교환

CPU는 굉장히 빠른 자원이기때문에 어떤 프로세스가 CPU를 장악해서 계속적으로 쓰는것이 아닌 짧은 시간 간격으로 CPU를 얻고 뺏는 과정이 많습니다. 그렇기때문에 CPU를 뺏겼던 프로세스가 다시 얻으면 처음부터 시작하는것이 아닌 마지막으로 실행됐던 과정에서부터 다시 시작을해야 효율적인 흐름을 도출해내야 합니다. 그것이 문맥교환의 역할이라고 말씀드릴수 있겠습니다.
문맥교환시 어떤 작업이 필요할까요? 프로세스 A가 CPU에 실행중이라면 PC(Program Counter)가 어떤 값을 가리키고있고, Register의 어떤 값들을 넣어서 실행하고있고, 메모리의 위치정보 Memory Map이 실행되고 있던 상황에서 CPU를 뺏길때 정보를 지우는것이 아닌 프로세스 A에 CPU의 Register에 저장되어있던 값을 PCB에 저장하면서 자연스럽게 Program Counter, Memory Map에 저장하게끔 하는 작업이 필요합니다. 좀더 자세히 알아볼까요?

프로세스가 본인이 필요해서 운영체제에게 요구하는 System Call, 컨트롤러같은 장치가 CPU한테 정보를 주기위한 Interrupt이 존재할수도있습니다. 이 이야기를 왜하냐구요? 설명드리겠습니다.
1번을 보게되시면 사용자 프로세스 A는 Interrupt혹은 System Call이 일어나면 CPU 제어권이 운영체제에게 넘어가게되지만 프로세스 본인이 필요한 일을 위해서 OS에게 운영권이 넘어가게되니 문맥교환없이 User mode로 복귀하면서 다시 사용자 프로세스 A에게 제어권이 넘어가게됩니다.
이를 통해 System call이나 Interrupt 발생시 반드시 문맥교환은 일어나는건 아닙니다. (하지만 PCB에 context의 일부를 save 해야함)
하지만 2번을 보게되시면 Timer Interrupt나 I/O 요청 System call을 통해서 문맥교환이 일어나 사용자 프로세스 B로 넘어가게됩니다. 이를 통해 문맥교환이라고 말할수있습니다.
이제는 프로세스를 스케줄링하기 위한 큐와 스케줄러를 짧게 설명해드리겠습니다.
프로세스 큐의 종류
Job Queue => 현재 시스템 내에 있는 모든 프로세스의 집합
Ready Queue => 현재 메모리 내에 잇으면서 CPU를 잡아 실행되기를 기다리는 프로세스의 집합
Device Queues => I/O Device의 처리를 기다리는 프로세스의 집합
스케줄러의 종류
Long-Term schduler (장기 스케줄러 or Job Scheduler)
시작 프로세스 중 어떤 것들을 Ready queue로 보내질 결정합니다. 디스크에서 하나의 프로그램을 가져와 커널에 등록하면 프로세스가 되는데, 이때 디스크에서 어떤 프로그램을 가져와 커널에 등록할지(준비큐에 등록할지) 결정합니다.
장기 스케줄러는 수분단위로 가끔 호출하는 녀석이기때문에 속도가 느린것이 허용됩니다. 또한 메모리에 동시에 올라가있는 프로세스의 수를 조절하는 역할을 합니다 ( degree of multiprogramming)
그러나 현대의 시분할 시스템에서 운영체제는 장기 스케줄러를 두지않는 경우가 대부분입니다 (잘안쓰임) 과거에는 적의양의 메모리를 많은 프로세스들에게 할당하면 프로세스당 메모리 보유량이 적어져 장기 스케줄러가 이를 조절하였지만. 현대는 장기 스케줄러없이 바로 프로세스에 메모리를 할당하여 준비큐에 넣어주게 됩니다.
Short-term scheduler (CPU Scheduler)
준비 상태의 프로세스 중에서 어떤 프로세스를 다음번에 실행상태로 만들것인지 결정합니다. 시분할 시스템에서 Timer Interrupt가 발생하면 단기 스케줄러가 호출도비니다. 단기 스케줄러는 미리 정한 스케줄링 알고리즘에 따라 CPU를 할당 할 프로세스를 선택합니다. milisecond 단위로 호출하기때문에 충분히 빨라야하는 부분이 존재합니다.
Medium term scheduler
메모리에 적재된 프로세스 수를 관리하는 스케줄러입니다. 너무 많은 프로세스에게 메모리를 할당하여서 시스템의 성능이 저하되는 경우, 이를 해결하기위해서 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러입니다.
만약 메모리에 많읜 수의 프로세스가 적재되어 프로세스 당 보유하고있는 메모리량이 극도로 적어지게되면 CPU 수행에 당장 필요한 프로세스의 주소 공간조차도 메모리에 올려놓기 어려운 상황이 발생합니다. 이런 경우 메모리에 올라와 있는 프로세스 중 일부러 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장해둡니다 => Swap out
1. 디스크로 Swap out해야하는 경우, 봉쇄상태에있는 프로세스들을 첫번쨰로 Swap out => 당장 CPU를 획득할 가능성이 없음
2. 문제가 해결되지 않는경우 Timer interrupt를 발생해 Ready queue로 이동하는 process를 추가적으로 Swap out
중기스케줄러 등장이후 프로세스의 상태에는 중지(Susupendened, Stopped) 상태가 추가되었으며, 중지상태의 프로세스는 메모리를 통쨰로 빼앗기고 Disk로 Swap out합니다. 중지상태는 중지 준비 상태와 봉쇄 중지 상태가 존재합니다.
중지 준비 상태 : 준비 상태의 프로세스가 중기 스케줄러에 의해 Disk로 Swap out
봉쇄 중지 상태 : 봉쇄 상태의 프로세스가 중기 스케줄러에 의해 Disk로 swap out
중지 봉쇄 상태이너 프로세스가 봉쇄 되었던 조건을 만족하게 되면 이 프로세스의 상태는 중지 준비 상태로 바뀌게되면서 중지 상태에 있던 프로세스들은 관계없이 메모리를 보유하지않고 Disk에 Swap out상태로 존재하게 된다.
정보를 더 알았으니 프로세스의 상태를 더 확인해보겠습니다.
자세한 프로세스의 상태

중기 스케줄러때문에 Memory를 빼앗긴 프로세스상태를 알기위해서 나온것이 Suspeneded
Blocked는 본인이 CPU를 잡고 실행하다 I/O 작업을 하기위해서 다른 queue로 빠지는 행위

확인을 더해보자면 Running이 2가지로 또 나뉘어집니다.
프로세스가 CPU를 가지고 있으면서 본인의코드를 실행중인 상태가 Usermode
본인이 일을 할수없어 CPU에게(System call) 일을 시키면 Monitor mode라고 말할수있습니다.
프로세스의 상태도에서 운영체제가 관리상 사용자의 Process 상태를 나타낸것입니다. 프로세스가 자기코드를 실행하다가 System call 을해서 운영체제가 코드가 실행중일때 이때에도 그 사용자 프로세스가 커널모드에서 running 하고있다는 표현을 사용합니다. 운영체제가 Running 중이라고 말하지않습니다. Interrupt가 들어왔을때 운영체제의 커널이 실행되고있는것이고, Interrupt는 프로그램 때문에 실행되는게 아닌 monitor mode에서 running하고 잇다고 간주합니다.

점선의 아랫부분은 외부적인 이유로 프로세스가 완전히 얼어붙은 상태입니다 (inactive) 외부에서 Process를 정지시켰으면 다시 외부에서 재개를 해줘야만 Active 상태가 됩니다. 그럼에도 불구하고 I/O 가 오래걸리는 작업을한다면 Suspended Blocked에서 Suspended Ready상태로 변하기도 합니다. Suspended는 기본적으로 메모리를 완전히 잃어버리는 상황이기때문에 CPU에서 아무것도 못하지만 I/O 같은 작업은 계속 진행될수있습니다.
이렇게 Process 의 기본구조에 대해서 알아봤습니다. 다음은 Process를 이용한 자세한 구조를 더 파악해보겠습니다.
'💻Computer Science > 운영체제' 카테고리의 다른 글
| [운영체제] Process 2 [비동기,동기식 입출력과 Scheduling Queue, Thread] (0) | 2024.07.17 |
|---|---|
| [운영체제] 운영체제 구조 - 2 (0) | 2024.07.10 |
| [운영체제] 운영체제 구조 (시스템 구조를 먼저 알아보자)- 1 (0) | 2024.07.04 |