프로세스 : 보조기억장치의 프로그램을 메모리에 적재해서 실행한 것
포그래운드 프로세스, 백그라운드 프로세스
백그라운드 프로세스 중 사용자와 상호작용 없이 주어진 작업만 수행하는 것을 데몬이나 서비스라고 부른다
작업관리자의 서비스 탭에서 확인 가능
• PCB
PCB를 이용해서 번갈아가면서 수행되는 프로세스의 실행 순서를 관리하고 자원을 배분
- PCB의 구성
PID
레지스터 값
프로세스 상태
CPU 스케줄링 정보
메모리 관리 정보
파일, IO목록
• 컨텍스트 스위칭
프로세스 A에서 프로세스 B로 실행 순서가 넘어갈때 A의 지금까지의 정보를 PCB에 백업하고
실행할 프로세스 B의 PCB로 부터 정보를 가져온다
• 프로세스의 메모리 영역 <- 중요, 면접에서 물어보더라..
크게 4가지 영역으로 나뉘어서 저장된다
코드, 데이터, 힙, 스택 영역이 있다
- 코드 영역
실행되는 코드, 기계어로 이루어진 명령어가 저장된 읽기 전용 공간
- 데이터 영역
전역변수 등 프로그램 실행동안 유지할 데이터가 저장된다
- 힙 영역
사용자가 메모리에 할당하고 반환하는 공간, NEW나 MALLOC 등으로 할당한 객체, 동적 자료구조 등은 힙 영역에 할당
-스택 영역
데이터를 일시적으로 저장, 지역변수, 매개변수 등의 함수의 실행이 끝나면 사라질 데이터가 할당된다
힙은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택은 높은 주소에서 낮은 주소로 할당되어 서로 겹치지 않게 유지한다
코드 영역과 데이터 영역은 크기가 고정된 정적 할당 영역이고 힙과 스택은 동적으로 할당된다
• 프로세스 상태
생성 상태 - 메모리에 적재되어 PCB를 할당 받은 상태
준비 상태 - CPU가 할당되기를 기다리는 것, 준비 -> 실행상태로 전환되는걸 디스패치라고 한다
실행 상태 - CPU를 할당받아 실행 중인 상태, 실행 중 인터럽트가 발생하면 준비나 대기 상태로 전이
대기 상태 - IO 인터럽트가 발생하면 IO가 끝날때까지 대기
종료 상태 - 프로세스가 종료되어 PCB와 메모리 반환
• 프로세스 계층 구조
프로세스는 실행 중 시스템 콜로 다른 프로세스를 호출 가능하다
생성한거 - 부모 프로세스, 생성된거 - 자식 프로세스
이런 식으로 계층적으로 프로세스가 생성된다
• 프로세스 생성 기법
부모 프로세스가 FORK를 통해 자신을 복사해서 자식을 만들어내고
자식은 EXEC를 통해 자신의 메모리 공간을 다른 프로그램으로 교체, 코드와 데이터 영역이 변경되고 힙과 스택 초기화
• 실습
01 #include <stdio.h>
02 #include <unistd.h>
03
04 void foo() {
05 printf("execute foo\n");
06 }
07
08 void bar() {
09 printf("execute bar\n");
10 }
11
12 void baz() {
13 printf("execute baz\n");
14 }
15
16 int main()
17 {
18 if (fork() == 0) {
19 if (fork() == 0) {
20 foo();
21 }
22 else {
23 bar();
24 }
25 }
26 else {
27 baz();
28 }
29
30 return 0;
31 }
실행 순서
1. 부모 프로세스 실행 중 fork
2. fork 로 생성된 자식이 다시 fork
맨 처음 부모는 baz, fork로 생성된 자식은 bar, 그 자식의 자식이 foo 실행