가상화
- 운영체제는 하나의 프로세스를 실행한 후, 얼마 후 중단시키고 다른 프로세스를 실행하는 작업을 반복하면서 여러 개의 가상 CPU가 존재하는 것처럼 보이게 한다. 이를
시분할 기법(time sharing)
이라고도 부른다.
- CPU를 공유할수록 각 프로세스의 성능은 낮아진다.
가상화 구현
- 가상화를 잘 구현하기 위해서 운영체제는
저수준 도구
와 고차원의 지능
이 필요하다.
- 저수준 도구를
메커니즘(mechanism)
이라 한다.
- 메커니즘은
필요한 기능을 구현하는 방법이나 규칙
을 의미한다.
- ex) 문맥 교환(context switch)
- 운영체제의 지능은
정책(policy)
형태로 표현된다.
- 정책이란
어떤 결정을 내리기 위한 알고리즘
이다.
- ex) 스케줄링 정책(scheduling policy)
프로세스
프로세스 개념
- 프로세스(process)란
실행 중인 프로그램
을 말한다.
- 프로그램이 실행되는 동안 하드웨어 상태를 읽거나 갱신할 수 있다.
- 프로세스의 구성 요소를 이해하기 위해서는
하드웨어 상태(machine state)
를 이해해야 한다.
- 메모리(memory): 명령어는 메모리에 저장된다.
- 레지스터(register): 많은 명령어들이 레지스터를 직접 읽거나 갱신한다.
프로그램 카운터(program counter, PC)
: 프로그램의 어느 명렁어가 실행 중인지를 알려준다.
스택 포인터(stack pointer), 프레임 포인터(frame pointer)
: 함수의 변수와 리턴 주소를 저장하는 스택을 관리할 때 사용하는 레지스터이다.
- 영구저장장치(disk)
프로세스 API
- 생성(Create): 운영체제는 새로운 프로세스를 생성할 수 있는 방법을 제공한다.
- 제거(Destroy): 프로세스를 강제로 제거할 수 있는 인터페이스를 제공해야 한다.
- 대기(Wait): 때론 어떤 프로세스의 실행 중지를 기다릴 필요가 있기에 여러 종류의 대기 인터페이스가 제공된다.
- 각종 제어(Miscellaneous Control): 프로세스를 일시 정지하거나 재개하는 기능을 제공한다.
- ex) pause(), sleep(), kill(), …
- 상태(Status): 프로세스 상태 정보를 얻어내는 인터페이스도 제공된다.
프로그램이 어떻게 프로세스로 변형되는가?
- 운영체제는 프로그램
코드(code)
와 정적 데이터(static data)
를 메모리, 프로세스의 주소 공간에 탑재(load)
하는 것이다.
- 초기 운영체제는 프로그램 실행 전 모두 메모리에 탑재하였지만, 최근 운영체제는 이 작업을 늦추고, 필요한 부분만 메모리에 탑재한다.
- 페이징(paging)과 스와핑(swapping)동작의 이해가 필요하다.
- 운영체제는 일정량의 메모리를 프로그램의
실행시간 스택(run-time stack, 스택)
용도로 할당시킨다. 운영체제는 스택을 주어진 인자로 초기화한다. argc, argv 벡터를 사용하여 초기화한다.
- 운영체제는
힙(heap)
을 위한 메모리 영역을 할당한다.
- 운영체제는
입출력
과 관계된 초기화 작업을 수행한다. Unix 시스템에서 각 프로세스는 표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러(STDERR) 장치에 해당하는 세 개의 파일 디스크립터(file descriptor)
를 갖는다.
- 운영체제는 프로그램의 시작 지점(entry point), main()에서부터 실행을 시작한다.
프로세스 상태

- 실행(Running): 프로세스는 프로세서에서 실행 중이다. 명령어를 실행하고 있다.
- 준비(Ready): 프로세스는 실행할 준비가 되어 있지만 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기 중이다.
- 대기(Blocked): 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산이다. ex) 프로세스는 입출력 요청을 하였을 때 입출력이 완료될 때까지 대기 상태가 되고, 다른 프로세스가 실행 상태로 될 수 있다.
자료구조(Process Control Block, PCB)

- process control block은 어디에 있는 걸까?
- xv6 kernel
- 프로세스 상태(
process state
)
- 프로세스 식별자(
process id
)
레지스터 컨텍스트
(register context)
- 프로세스가 중단되었을 때 해당 프로세스의 레지스터값들을 저장한다. 이후 이를 복원하여 재개할 수 있다.
- 레지스터(
program counter, stack pointer
…)
프로세스의 시작 주소
- 프로세스
커널 스택의 바닥 주소
- 프로세스
컨텍스트
정보
부모 프로세스에 대한 포인터
struct context {
int eip;
int esp;
int ebx;
int ecx;
int edx;
int esi
int edi;
int ebp;
}
enum proc_state { UNUSED, EMBRYO, SLEEPING,
RUNNABLE, RUNNING, ZOMBIE };
struct proc {
char *mem; // 프로세스 메모리 시작 주소
uint sz; // 프로세스 메모리의 크기
char *kstack; // 프로세스의 커널 스택의 바닥 주소
enum proc_state state; // 프로세스의 상태
int pid; // 프로세스 ID
struct proc *parent; // 부모 프로세스
void *chan; // 0이 아니면 chan에서 수면
int killed; // 0이 아니면 종료됨
struct file *ofile[NOFILE]; // 열린 파일
struct inode *cwd; // 현재 디렉터리
struct context context; // 프로세스를 실행시키려면 여기로 교환
struct trapframe *tf; // 현재 인터럽트에 해당하는 트랩 프레임
}
참고 자료
- 운영체제(공룡책)
- kocw 반효경, 운영체제와 정보기술의 원리
- 운영체제: 아주 쉬운 세 가지 이야기