한 마디로 프로세스란? 실행중인 프로그램
program, process, processor 혼용해서 사용하기도
(+) processor : 프로세싱하는 주체 (CPU)
- Stack : 지역변수, 매개변수 호출 시
- Heap : 동적 메모리 할당 (C언어의 malloc)
- Data : static (전역 변수, 상수)
- Text : 프로그램 코드
이거 진짜 시험 단골 문제인 듯
OS는 PCB(Process Control Block)으로 프로세스 관련 정보를 struct(구조체) 형태로 저장해서 관리한다!
: 프로세스 정보를 데이터 구조화 해서 리스트로 관리를 한다.
구조체 형태로 저장함
struct{
int pid
int state
.
.
// 이런 형태로
}
New
Running : CPU에 실행 중
Wait : event 발생 기다릴 때, I/O request 기다릴 때
Ready : 일 끝나고 CPU 쓸 수 있는 상태 (CPU 준비)
Terminated : 종료
Q) 레지스터는 왜 기억하고 그대로 복사하는가?
A) 변수는 메모리에 저장된다. CPU 쓰다가 쫓겨나면 쓰던 값으로 복사해야 다시 running할 때 다시 계속 실행할 수 있다
계속 하던 일 계속하게!
쫓겨날 때(interrupt or system call)copy하고 다시 불려오면 복붙(reload)한다. Memory는 항상 그대로, CPU는 지워진다. 메모리에서 CPU로 명령어를 가져와서 실행, 그 다음 명령어 가져와서 실행,,, (무한 반복)
이 PCB를 저장하고 로드 하는 과정이 바로 Context Switch
++ CPU 안에 레지스터 있다.
OS도 프로그램임을 잊지 말자.
Q) interrupt는 왜 발생하는가?
A) 스케쥴링 방식에 따르다. CPU 쓰고 있다가도 못 쓰게 되는 상황이 온다.
Running -> Waiting은 주로 값 요청하고 그 값 기다릴 경우가 많다.
멈추고 프로세스를 교체한다.
실행되던 상태를 PCB에 저장하고 이제 실행할 프로세스의 상태를 CPU에 넘긴다(로드).
이 프로세스 교체는 공짜인가?
전혀 아니다! 항상 교체할 때는 교체 시간인 오버헤드(Overhead)가 발생한다! PCB를 저장하고 로드하는데 시간이 필요하다는 뜻.
++ fork해서 반환되는 pid의 값이 음수면 실패한 것이다
Unix에서의 예시
fork() : 프로세스 생성
fork()가 실행되면 해당 프로세스 0(Parent Process)의 PCB0가 고대로 복사해서 새로운 자식 프로세스 1(Child Process)과 PCB1을 만든다.
그리고 fork 다음부터 기존 프로세스 0과 동일하게 쭉 동작한다!
exec() : 현재 실행할 프로세스를 바꾼다 (= execlp() )
실행하는 순간 코드 영역을 지우고 execlp 안의 프로그램을 카피해서 로드한다.
과제로 프로세스 4개를 구현해보라는 과제가 나왔는데 fork를 2번만 하면 되었다.
8번은 fork가 3번이면 된다.fork되는 순간 프로세스는 복제되어 그 다음부터 똑같이 복제되어 같이 실행된다. 그러니까 fork를 한 번 부르면 2개, 다음 fork에서 2개의 프로세스가 fork를 만나 2개로 늘어난다.
1 -> 2 -> 4 -> 8 -> 16 -> ...
프로세스 A와 B가 값을 공유하는 방식
IPC라고도 한다.
IPC (Inter Process Communication)
프로세스 간의 통신
(a) : Message Passing
편지 주고 받는 것 처럼 Send하고 Receive하며 값을 주고받으며 사용한다.
(b) : Shared Memory (공유 메모리)
공유 메모리를 같이 접근하여 값을 사용한다.
두 프로세스가 통신하는 방법이다.
굉장히 원시적으로 단방향이다. 쓰기만 하고, 읽기만 하고.
그래서 양방향으로 쓰려면 파이프를 2개 사용하여야한다.