: 실행중인 프로그램
목차
1.
2.
3.
4.
Process의 구조
: 다음과 같이 실행을 위한 자원들이 필요함
•
CPU
◦
PC, SP와 같은 레지스터들
•
Memory
◦
Text 영역 : 프로그램 코드
◦
Data 영역 : 전역 변수
◦
Heap 영역 : 동적할당된 변수
◦
Stack 영역 : 지역 변수, 매개변수
•
I/O 정보
◦
장치를 포함한 open된 파일들
Process API
: 프로그램은 어떻게 실행되는가
1.
메모리 영역에 Load : 주소공간에 코드와 static data를 삽입
2.
동적 할당 : Stack, Parameter 초기화, 필요 시 Heap 사용
3.
초기화
4.
entry point로 점프
프로세스의 상태와 정의
•
new : 프로세스가 이제 막 만들어진 상태, 메모리 영역에 Load 되기 전
•
ready : 프로세스가 메모리로 올라간 상태, CPU에 Load 되기 전
•
running
: ready 상태에서 dispatch가 되어 CPU를 할당받아 실제 수행되고 있는 상태
: 프로세스 하나가 CPU를 독점하는 것을 방지하기 위해 timeout을 이용해 강제로 다시 ready 상태에 적재할 수 있음
•
waiting : I/O 또는 이벤트로 인해 잠시 대기상태로 전환된 상태, 이벤트가 종료되면 프로세스는 다시 ready 상태
•
termiated : running 상태인 프로그램이 종료된 상태
•
suspned
: reday 상태나 waiting 상태인 프로세스를 메모리에서 내리는 것
: running 상태에선 suspend 시킬 수 없고 ready가 suspend되면 suspend-ready라 하며 waiting 상태가 suspend되면 suspend-way
•
resume : suspend 상태에서 다시 메모리로 올라가는 것
PCB (Process Control Block)
: 프로세스를 관리하기 위해서 하나의 자료구조가 만들어지고 거기에 프로세스의 정보가 담겨있는 것이 생기는데 이를 PCB라 함
: 프로세스의 상태, pid, PC(Program Counter), CPU 스케쥴링 정보 등을 가지고 있음
Process 관련 system call
•
fork()
: 새로운 프로세스를 생성, 생성된 프로세스의 id를 반환, 부모 프로세스가 먼저 호출될 지, 자식 프로세스가 먼저 실행될 지 알 수 없음, 즉 Non-deterministic함
•
wait()
: 자식 프로세스가 끝날 때까지 wait을 호출한 이후의 작업을 실행시키지 않는 system call, 즉 fork 함수를 deterministic하게 바꿔줌, 죽은 자식의 pid를 반환
•
exec()
: 코드와 static data를 Load 및 덮어쓰기하고 stack과 heap을 초기화한 후 실행, 사용자가 원하는 프로그램을 실행할 수 있음
◦
exec과 fork를 분리한 이유 : 자식 프로세스가 끝나기 전의 상태에서 실행시키고 싶을 수 있기 때문
•
getpid()
: pid를 획득
소스코드
// C program to demonstrate working of wait()
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
int main()
{
pid_t cpid;
if (fork()== 0)
exit(0);
else
cpid = wait(NULL);
printf("Parent pid = %d\n", getpid());
printf("Child pid = %d\n", cpid);
return 0;
}
C
복사
실행결과
Parent pid = 12345678
Child pid = 89546848
Plain Text
복사
Time sharing
: 프로세서들이 자원을 공유할 수 있도록 하는 시스템, CPU를 독점하는 것처럼 보여줌
: CPU의 시간을 작게 분할해 여러 작업을 돌아가면서 수행하는 것, CPU를 가상화하는 핵심 테크닉
Issues
•
성능 : 가상화 오버헤드를 어떻게 최소화시킬 것인가?
•
제어 : 중간에 인터럽트가 발생할때마다 OS는 어떻게 제어하는 가?
Solutions
•
Direct Execution
: 운영체제를 거치지 않고 직접 수행, 효율적이지만 제어할 수 없다. 프로세스는 무한히 돌고 자원을 독점해버릴 것임
Direct Execution의 절차
1.
OS에서 프로세스 리스트에 엔트리를 생성
2.
OS에서 프로그램 메모리 할당
3.
OS에서 메모리로 로드
4.
OS에서 argc/argv를 사용해서 스택 설정
5.
OS에서 레지스터 클리어 후 main문 실행
6.
프로그램에서 main문 실행
7.
OS에서 프로세스 메모리 해제 및 프로세스 리스트에서 제거
•
Direct Execution Solution
: Direct Execution의 단점을 해결할 두 가지 해결방안이 있다.
1.
자원과 관련된 요청이 오면 OS가 개입한다.(system call을 통해)
2.
유저모드와 커널모드를 구분한다. 모드를 변경할 때 trap 명령을 사용한다.
•