티스토리 뷰

컴퓨터 공학/운영체제

[운영체제]가상화

삼전동해커 2021. 1. 31. 22:22

프로세스의 개념

일반적으로 프로세스는 실행중인 프로그램으로 정의한다. 프로그램은 디스크 상에 존재하면 실행을 위한 명령어와 정적 데이터의 묶음이다. 이 명령어와 데이터 묶음을 읽고 실행하는 것이 운영체제이다.

 

사용자는 여러개의 프로그램을 동시에 실행하고 싶다. 게임을 켜놓고 웹 서핑을 하면서 노래를 듣는다. 동시에 수백개의 프로세스를 실행하는 것 처럼 보인다. 

 

어떻게 하면 CPU가 여러 개 존재하는 것 처럼 제공할 수 있을까?

가상화를 사용한다.

하나의 프로세스를 실행하고, 얼마 후 중단시키고 다른 프로세스를 실행하는 작업을 반복하면서 여러 개의 CPU가 존재하는 것 처럼 보이게 한다. 시분할이라 불리는 이 기법은 원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 한다.

시분할 기법은 CPU를 공유하기 때문에, 각 프로세스의 성능은 낮아진다.

 

시분할(ex : CPU)과 공간분할(ex : 디스크)은 반대의 개념이다.

 

메커니즘은 필요한 기능을 구현하는 방법이나 규칙을 의미한다. 예를 들어 CPU에서 프로그램 실행을 잠시 중단하고 다른 프로그램을 실행하느 것을 문맥 교환이라 한다.

 

정책은 운영체제 내에서 어떤 결정을 내리기 위한 알고리즘이다. 예를 들어 실행 가능한 여러 프로그램들이 있을 때, 운영체제는 어느 프로그램을 실행시켜야 하는지 스케쥴링 정책이 결정을 내린다.

 

프로세스실행중인 프로그램의 개념이다.

프로세스의 구성요소를 이해하기 위해서 하드웨어 상태를 이해해야 한다. 프로그램이 실행되는 동안 하드웨어 상태를 읽거나 갱신할 수 있다. 이 때 가장 중요한 구성 요소는 메모리이다. 명령어는 메모리에 저장된다.

 

레지스터도 하드웨어 상태를 구성하는 요소 중 하나이다. 레지스터 중에 특별한 레지스터들이 존재한다.

프로그램 카운터(PC)는 프로그램의 어느 명령어가 실행 중인지를 알려준다. 프로그램 카운터(PC)는 명령어 포인터(IP)라고도 불린다. 스택포인터(SP)프레임 포인터(FP)함수의 변수와 리턴 주소를 저장하는 스택을 관리할 때 사용하는 레지스터이다.

 

프로세스 API

생성 : 운영체제는 새로운 프로세스를 생성할 수 있는 방법을 제공해야 한다. 쉘에 명령어를 입력하거나, 아이콘을 더블클릭하여 프로그램을 실행시키면, 운영체제는 새로운 프로세스를 생성한다.

 

제거 : 운영체제는 프로세스를 강제로  제거할 수 있는 인터페이스를 제공해야 한다.

 

대기 : 어떤 프로세스의 실행 중지를 기다릴 필요가 있기 때문에 여러 종류의 대기 인터페이스가 제공된다.

 

각종 제어 : 일시정지, 재개 같은 기능을 제공한다.

 

상태 : 프로세스 상태 정보를 얻어내는 인터페이스가 제공된다.

 

eager loading : 모든 데이터를 가져와 메모리에 적재한 후 필요한걸 가져다 씀.

lazy loading : 필요한 코드의 일부분 메모리에 적재하고, 프로그램이 필요한건 디스크에서 그때그때 가져다 씀.

 

프로세스 생성

프로그램이 어떻게 프로세스로 변형될까?

프로그램을 실행하기 위해 운영체제가 첫번째로 하는 일은

프로그램 코드와 정적 데이터를 메모리, 프로세스의 주소공간에 탑재(load)하는 것이다.

프로그램은 디스크에 특정실행 파일 형식으로 존재한다. 탑재를 하기 위해서 운영체제는 디스크의 해당 바이트를 읽어서 메모리의 어딘가에 저장한다.

 

코드와 데이터가 메모리에 탑재된 후, 일정량의 메모리가 프로그램의 실행시간 스택용도로 할당되어야 한다. C언어의 경우 지역변수, 함수 인자, 리턴 주소 등을 저장하기 위해 스택을 사용한다.

운영체제는 스택을 주어진 인자로 초기화한다. main함수의 argc와 argv벡터를 사용하여 스택을 초기화한다.

 

힙은 동적으로 할당된 데이터를 저장하기 위해 사용된다. 프로그램이 실행되면 malloc()라이브러리 API를 호출하여 메모리를 요청하고, 운영체제가 이를 충족하도록 메모리를 할당한다.

 

운영체제는 입출력과 관련된 초기화 작업을 수행한다. 각 프로세스는 입력(STDIN), 출력(STDOUT),에러(STDERR)에 해당하는 세 개의 파일 디스크립터를 갖는다. 이 디스크립터들을 사용하여 프로그램을 터미널로 부터 입력을 읽고 화면에 출력을 프린트한다. 

 

코드와 정적 데이터를 메모리에 탑재,

스택과 힙을 생성,초기화하고,

입출력 설정을 완료하면 운영체제는 준비를 마친다.

이제 main함수부터 프로그램 실행을 준비한다. main을 실행함으로써 운영체제는 CPU를 새로 생성된 프로세스에게 넘기고 프로그램 실행이 시작된다.

 

프로세스 상태

실행(running) : 프로세스는 명령어를 실행하고 있다.

 

준비(ready) : 준비 상태에서 프로세스는 실행할 준비가 되어 있지만 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기중.

 

대기(blocked) : 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산. 예를 들어 프로세스가 디스크에 대한 입출력 요청을 하였을 때, 프로세스느 입출력이 완료될 때까지 대기 상태, 다른 프로세스가 실행 상태로 될 수도 있다.

 

ready와 blocked의 차이점?

ready는 언제든 실행할 준비가 되어있다. 그래서 현재 프로세스가 blocked상태가 되었을 때(I/O를 기다릴 때), ready프로세서는 곧 바로 running 상태가 된다. 

 

실행->준비 : 프로세스가 나중에 다시 스케줄 될 수 있는 상태가 되었다는 것을 의미.

프로세스가 I/O 등의 이유로 대기 상태가 되면 요청 완료가 될 때 까지 대기 상태로 유지한다. I/O가 완료되면 다시 준비상태가 된다.

 

 

 

process0이 실행상태에서 I/O로 인해 4시간에서 대기 상태가 된다. 동시에 process1은 준비상태에서 실행상태가 된다.

7시간에서 process0의 I/O이 종료되면서 준비상태가 된다. 8시간에서 process1이 종료되면서 process0은 실행상태가 된다. CPU의 이용률을 높히기 위해 process0이 사용되지 않는 대기 상태일 때 process1을 동작시키는 것이다.

 

 

자료구조

운영체제도 일종의 프로그램이다. 다른 프로그램들과 같이 다양한 정보를 유지하기 위한 자료구조를 가지고 있다.

예를 들어, 프로세스 상태를 파악하기 위해 준비 상태의 프로세스들을 위한 프로세스 리스트와 같은 자료 구조를 유지한다.

 

레지스터 문맥 자료구조는 프로세스가 중단되었을 때 해당 프로세스의 레지스터값들을 저장한다. 이 레지스터 값들을 복원하여 운영체제는 프로세스 실행을 재개한다.

 

실행,준비,대기 외에 다른 프로세스 상태를 알아보자.

프로세스가 생성되는 동안에는 초기 상태에 머무른다.

프로세스가 종료되었 지만 메모리에 남아있는 상태인 최종 상태(좀비). 이 상태는 프로세스가 성공적으로 종료되었는지 부모 프로세스가 검사해야 한다.(wait함수 사용)

좀비 상태가 필요한 이유는 부모 프로세스가 리턴 프로세스를 체크해서 잘 종료 되었는지 확인하기 위해서이다. 좀비 상태라는건 잘 안끝났다는 의미, 사라진 상태면 잘 종료되었다는 의미이다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함