프로세스의 정의와 프로세스 상태에 대한 이해를 기반으로 하고 있습니다. 헷갈리시는 분은 이전 포스팅 보고 오기
프로세스를 조금 어렵게(?) 이렇게 표현하기도 해요
프로세스는 프로세서에 의해 수행되는 프로그램 단위로 현재 실행 중이거나 곧 실행 가능한 PCB(Process Control Block)을 가진 프로그램이다.
음.. PCB가 프로세스와 관련된 건 알겠는데 PCB는 무엇을 의미할까요?
PCB (Process Control Block)란?
♣ 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 구조체이다.
♣ 프로세스 상태 관리와 문맥교환(Context Switching)을 위해 필요하다.
♣ PCB는 프로세스 생성 시 만들어지며 주기억장치에 유지된다.
음 무슨말인가 싶죠
여러분 지금 인터넷 하고 있죠??
인터넷 하면서 음악도 듣고, 채팅도 할 수 있어요. 어떻게 컴퓨터는 이 많은 일을 동시에 할 수 있는걸까요??
사실 컴퓨터는 이를 동시에 처리하지 않아요 TIME SHARING이라고 해서 짧은 시간동안 왔다갔다 번갈아서 재빨리빨리 처리해주는건데 그 방법이 아주 효율적이고 빨라서 우리가 제대로 느끼지 못할뿐! 머 이게 가능한 이유가 바로 운영체제라는 프로그램 덕분이죠 ㅎㅎ
이렇게 프로세스들이 교체되어 수행되고 나면 다시 다른 프로세스를 불러와야 하는데,
이 말은 이전 작업에 대한 내용을 기억하고 있다는 얘기가 되겠죠!! 프로세스 단위로 정보를 저장해주는 BLOCK이 있는데 이게 바로 PCB입니다.
여러분 운영체제는 하드웨어가 효율적으로 동작할 수 있도록 관리해주는 결국 소프트웨어! 프로그램! 입니다
따라서 운영체제라는 프로그램이 프로세스를 하나 만들어서 실행을 하려면 그 프로세스와 관련된 데이터 구조가 당연히 있어야겠죠. 그 프로세스가 뭔지 알아야! 정말 기본적인 정보들은 어딘가에 저장이 되어 있어야 할 것 아니예요
그것을 PCB라고 부르는 것입니다. 즉 프로세스가 만들어지면 그 프로세스에 저장되어야 할 데이터들을 하나의 structure로 만들어 놓은 것을 뜻해요! 이런 블럭들이 있어서 스위칭 되어도 기억을 하고 이어서 실행할 수 있어요.
PCB란 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓을 수 있는 저장 장소를 뜻합니다
Each process is represented in the operating system by a process control block - also called a task control block. A PCB contains many pieces of information associated with a specific process.
예를 들어, CPU에 급한 프로세스가 처리해달라고 긴급 요청이 왔을 때 기존에 작업하던 프로세스를 어딘가에 임시 저장을 해놓아야 급한 애를 빨리 처리한 후에 다시 불러올 수 있겠죠. 즉 프로세스 관한 정보들을 저장할 어딘가의 공간이 필요해요. 고것이 PCB!
아까 인터럽트 걸려서 ready상태가 됐다가 긴급한 프로세스가 다 끝나고 나면 얘가 다시 스케쥴 돼서 실행이 돼요. 그러면 아까 중단된 시점부터 다시 실행이 되야하겠죠! 아까 중단된 시점에서 이어서 시작하려면, CPU 레지스터들의 집합에다가 원래 수행되었던 것을 그대로~~ 갔다가 집어 넣어 실행시키면 아까 실행된 것부터 이어서 실행이 될거예요. 원래는 CPU 레지스터 안에 있는 것들이 계속 바뀌면서 수행이 되야 하는데 일단 잠시 중단하는 시점에 있는 내용을 저장을 하고 나중에 그대로 복원을 해서 실행시키면 아까 중단한 이후부터 수행이 되는 원리를 이용한 거죠
요 개념 안에 Context Switching과 PCB 개념이 다 들어가 있습니다. 밑에서 또 반복할거예요.
2.4대 버전의 리눅스에서는 이 PCB를 task_struct라고 하는 struct keyword로 만들었고 실제로 1456바이트였다고 합니다. 물론 지금은 더욱 커졌겠죠!
PCB 저장 정보
자 그럼 PCB가 실제 어떠한 정보들을 저장하고 있는지 볼까요?
-------PCB에서 유지되는 정보----------
● PID : 프로세스의 고유 번호
● 상태 : 준비, 대기, 실행 등의 상태
● 포인터 : 다음 실행될 프로세스의 포인터
● Register save area : 레지스터 관련 정보
● Priority : 스케줄링 및 프로세스 우선순위
● 할당된 자원 정보
● Account : CPU 사용시간, 실제 사용된 시간
● 입출력 상태 정보
-------------------------------------------
● PID : 프로세스의 고유 번호
이전에 프로세스와 프로그램의 차이를 설명하면서 프로세스를 PID로 관리한다고 언급했었죠?
PCB는 프로세스의 정보를 담기 위한 저장소이기 때문에 역시 PID 정보를 담고 있는 것을 확인할 수 있습니다
● 상태 : 준비, 대기, 실행 등의 상태
앗 PID 아래에 배웠던 프로세스 상태 정보도 보이네요!
좀 더 컨텍스트 스위칭의 수행 과정과 PCB의 역할에 대해 자세히 알아보기 전에
↓ 꾸준히 방문할 수 있는 블로그가 되겠습니다
Context Switching의 수행 과정과 PCB의 역할
좀 더 확실한 이해를 위해 CPU내의 프로세스가 작동되는 과정을 자세히 살펴볼게요~
이 과정에서 운영체제 선행과정으로 필요한 컴퓨터 구조의 개념이 들어갑니다
컴퓨터 구조에서 레지스터의 개념이 모르시는 분은 공부하고 오시면 이해가 수월해져요
프로그램 카운터, 스택 포인터, 레지스터 이런 것들이 CPU안에 있는 레지스터였던 것까지는 기억하고 계시나요?
이렇게 레지스터들이 CPU 자체에 있으니 수행 중인(running 상태의) 프로세스 정보는
(ex 이 프로세스는 지금 어떤 일에 관한 프로세스인데 어느 명령어를 수행하고 있는 중이야~ 와 같은 정보! 이 프로세스의 ID는 블라블라야 등등)
CPU 내부, 즉 레지스터에서 저장하고 있습니다. (여기까지는 정보를 담는 저장소 레지스터가 있으니 PCB라는 저장공간이 따로 필요 노노~)
process P0가 지금 수행이 되고 있어요. CPU에 있는 레지스터들은 P0의 상태로 수행이 되고 있는 것. 그러다가 interrupt가 걸렸네요. 그럼 운영체제가 수행이 되야 하는데, 인터럽트가 걸리면 지금 수행되는 것을 먼저 저장합니다.
프로세스 상태에서 배웠듯이, waiting 상태로 변하게 되면 CPU가 다른 프로세스를 running으로 바꿔 올려버려요. (인터럽트가 걸렸다는 것은 지금 내가 running하는 프로세스를 잠깐 내려놓고 다른 프로세스를 실행하는 동안 기다리게 한다는 뜻이죠!) 레지스터의 저장 값이 앞으로 수행할 프로세스에 관한 정보로 교체될 거예요. CPU는 레지스터에 있는 정보를 보고 처리작업을 수행하니까 당연히 새 프로세스 실행을 위해 기존 프로세스 정보는 다른데로 가야겠죠? 즉 CPU의 레지스터들의 값이 다른 것로 바뀌기 전에 어딘가에 저장을 하고 나가야해요.
이때 PCB에 CPU에서 수행되던 레지스터 값들이 저장이 됩니다. 내가 수행하던 프로세스가 어디까지 수행됐는지(프로그램 카운터), stack pointer의 위치가 어디인지, 그 외 register들의 집합 정보들을 잠시 저장한다는거죠. 어디에? PCB에!
그림을 보면 executing되다가 다른 프로세스 P1)을 수행시키기 위해 PCB0에다가 P0프로세스 정보를 저장하네요. 그리고 레지스터에 PCB1에 저장되어있던 process 1 정보를 가져와 P1을 수행시킵니다.
이런 저장 공간을 PCB라고 하고
사실 이렇게 수행중인 프로세스를 변경할 때 레지스터에 프로세스의 정보가 바뀌는 것을 Context Switching 문맥교환이라고 합니다.
Context Switching 문맥교환 이란 CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정을 말합니다.
나중에 좀 더 자세히 배울텐데 문맥교환은 인터럽트가 발생하거나 (급한 프로세스 먼저 처리해줘야하니까 수행 프로세스를 바꿔줘야겠죠?)
실행 중인 프로세스가 CPU사용을 허가받은 시간(Time Quantum)을 모두 소모하거나 (추후 배울 RR알고리즘을 참고해보세요~)
I/O 입출력을 위해 대기해야 하는 경우에 발생합니다. (키보드로부터 입력받는 동안 비싼 CPU를 놀리면 안되니까 I/O작업이 끝날 때까지 다른 프로세스를 돌리고 있을 거예요 -> 기존 프로세스를 내리고 새 프로세스를 올리니 문맥교환이 당연히 발생!)
즉 프로세스가 준비 -> 실행, 실행 -> 준비, 실행 -> 대기 등으로 상태 변경될 때 발생합니다.
문맥교환의 Overhead ?
여기에서 한 가지 더 설명할 게 Administrative overhead라는 말인데
overhead라는 말은 컴퓨터용어에서 많이 쓰이기 때문에 꼭 알고 있어야 합니다.
Overhead는 좀 부정적인 의미죠
정확하게 번역하기는 힘들지만 과부하? 부하? 수수료? 정도로 이해하면 됩니다.
지금 P0가 수행이 되다가 P1이 수행이 되다가 P0가 수행이 되는거죠. 이렇게 되면 지금 현재 수행되는 것을 메모리에다가 저장을 해야 하고. 그 다음에 메모리에 있는 것을 다시 CPU에 넣어야 하잖아요. 이 작업이 사실은 얘에서 얘로 안바꾸면 할 필요 없는 일인데 왜 이렇게 시간이 더 많이 드는 일을 할까요?
그냥 P0 쭈우우욱 수행하고 P1 수행하지 뭐하러 바꿨다 돌려놨다 굳이 번거롭게 작업을 하는 걸까요?
프로세스가 수행하다가 I/O이벤트가 디스크에다가 명령을 내렸는데 개가 끝날때까지 기다려야 하는데 다른 프로세스로 안바꾸고 그냥 CPU가 가만히 있으면 CPU가 낭비되는거잖아요. 그러니까 차라리 조금 수고스럽지만 다른 프로세스로 바꾸면서까지 CPU를 써먹는게 더 이익이라는 얘기예요. 이 정도의 overhead를 치르면서도 기존 프로세스를 새 프로세스로 바꾸는 것이 더 낫다~!
전체적으로 봤을 때 더 이익이 되니까 이런 overhead를 감수하더라도 context switching을 하는거고 그래서 운영체제가 CPU를 관리하는 거예요 CPU가 놀지 않게, 사용자가 너무 기다리지 않게 관리하기 위해서 반드시 해줘야 하는게 context switching이고
이것이 대표적으로 운영체제가 하는 CPU관리 입니다. ㅎㅎ
'별걸다하는 IT > 운영체제 OS' 카테고리의 다른 글
[운영체제]동기화 Synchronization 문제, Race Condition (2) | 2019.01.31 |
---|---|
[운영체제]FIFO/FCFS (피포/first come first served)정의와 문제 & Convey Effect (1) | 2019.01.31 |
[운영체제]Process Address Space 메모리내 프로세스 구조 (Code segment, static data 등) (4) | 2019.01.31 |
운영체제_컴퓨터구조, device controller(장치 제어기) (6) | 2019.01.30 |
[운영체제]시스템에 따른 스케줄링의 목표 (Scheduling goals) (0) | 2019.01.30 |
최신 댓글