Program | Process |
---|---|
저장장치 (HDD, SSD)에 저장된 명령문의 집합체 (App/ Application, .exe ) | 실행 중인 프로그램 = 하드디스크에 저장된 프로그램이 메모리 (RAM)에 올라갔을 때 |
“수동적 존재” = 하드디스크/저장장치만 사용 | “능동적 존재 “ = - 메모리 사용 - OS의 CPU 스케줄링 알고리즘에 따라 CPU도 사용 - 필요에 따라 입출력 작업 |
malloc()
free()
#include <stdio.h>
void main()
{
int a = 1;
int b = 2;
int c = a + b
}
.c
file → 컴파일c언어는 compile언어이므로 컴파일이 되어야 실행가능
전처리기 : 매크로로 정의한 숫자를 치환, 필요한 파일 로딩
⇒ 파일 확장자 : .i
컴파일러 : compile - C언어 ⇒ assembly language (명령어 : 기계어 = 1: 1)
⇒ 파일 확장자 : .s
Assembler : Assembly language ⇒ machine language(0,1)
⇒ 파일 확장자 : .o
Linker : linking - 여러 library나 다른 source code들 연결
⇒ 파일 확장자 : .exe
exe.
파일 실행 → 하드 디스크에 있는 해당 파일이 메모리에 올라감 ⇒ “Process”**edx
, eax
Register**로 가져옴eax
Register에 저장eax
Register에 저장된 12를 가져와 memory에 저장Uni-Programming | Multi-Programming | Multi-Processing |
---|---|---|
1 process on memory | multiple process on memory | CPU managing multiple processes |
pov of memory | pov of memory | pov of CPU |
Time sharing process | ||
PCB | 저장 데이터 |
---|---|
Pointer | - 부모와 자식 process에 대한 pointer, 할당된 자원에 대한 pointer 등 - process의 한 상태에서 다른 상태로 전환될 때 저장하는 pointer 보유 ( for 효율적인 접근) |
Process State | 현재 process의 5가지 상태 (생성, 준비, 실행, 대기, 완료) |
PID (Process ID) | Process를 식별하기 위한 숫자 |
Program Counter | 다음에 실행될 명령어의 주소를 포함하는 Program Counter 시분할 처리로 여러 프로세스를 짧은 시간씩 번갈아 실행하기 때문에, 해당 프로세스로 다시 전환됐을 때 실행할 명렁어를 알아둬야 함) |
Registers | process가 실행될 때 사용했던 Register 값들이 저장 (Program Counter와 마찬가지로 CPU를 뺏기고 다시 시작할 때 이전에 사용하던 값을 복구하기 위한 용도) |
Memory Limits | process가 memory에 있는 위치 정보, memory 침범을 막기 위한 경계 register값 등 |
Open File Lists | =CPU 스케쥴링 정보 : 우선순위, 최종 실행시간, CPU 점유시간 등이 저장 |
출처 : https://medium.com/@sohailk1999/five-state-process-model-6e83d7428c8c
status | 설명 |
---|---|
생성/ New | PCB 생성 후 memory에 program 적재를 요쳥한 상태 (적재 승인 후 준비 상태) |
준비 / Ready | CPU를 사용하기 위해 기다리는 상태 |
실행 / Running | - 준비 상태의 process가 cpu scheduler에 의해 CPU 할당 받아 실행 중인 상태 - 실행 상태의 process의 수 == CPU 개수 - 부여된 시간 초과시 CPU scheduler가 할당된 CPU 탈환 → 다시 준비 상태 |
대기 / Waiting | - process가 입출력 요청 시 완료될 때까지 기다리는 상태 - 입출력 작업 완료 시 대기 상태에 있던 process에게 CPU 할당 기회 부여 |
완료 / Terminated | - Process가 종료된 상태 - Process가 사용했던 data & PCB 메모리에서 제거 |
Process를 실행하는 중에 다른 process를 실행하기 위해 실행 중인 process의 상태를 저장하고 다른 process의 상태 값으로 교체하는 작업
cause of Context switching
if) Process A → Process B
Process state
, Program Counter
, Registers
, Memory Limits
실행중인 process의 작업 내용을 PCB에 저장
실행될 process의 PCB 값으로 CPU가 다시 세팅
.exe
파일 실행⇒ 나머지 프로세스는 새로 생성하지 않고 0번 process를 복사해서 사용 : fork()
함수 이용
∵ process 복사하여 이용하는 것이 생성하는 것보다 빠름
0번 process를 복사 ⇒ 부모 process(0번) & 자식 process
exec()
)함수 이용** ⇒ 부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어씀
#include <stdio.h>
#include <unistd.h>
int main()
{
int pid;
pid = fork(); // 자식 process에게는 0, 부모 process에게는 0이 아닌 값 반환
// 이 후 2개의 process는 cpu scheduling에 따라 실행,
//어느 것이 먼저 실행될지는 OS의 결정에 따름
if (pid == 0) // 자식 process
{
// InternetBrowser 프로그램에서 코드와 데이터 영역을 가져와 자식 process를 덮어씀
execlp("InternetBrowser", "0", NULL);
exit(0); // InternetBrowser 프로그램 실행에 실패하면 exit()함수 호출 후 종료
}
else // 부모 process
{
wait(NULL);// 자식 process에게서 exit()신호를 받으면 자식 process를 완전히 종료 시킴
printf("인터넷 브라우저 닫힘");
exit(0);
}
}
execlp()
: 인자로 들어온 프로그램에서 코드와 데이터 영역을 가져와 자식 process를 덮어씀 (from parent’s copied data to the program’s data)wait()
: context switching을 거쳐 부모 process에게 cpu가 할당되어도 자식 process에게서 exit()신호가 올 때까지 다른 코드를 실행하지 않고 기다리는 system 함수exit()
: 자식 process가 부모 process에게 정상종료를 알리는 함수exit()
신호를 주지 못해서 exit status
를 읽지 못함Main thread : Process 내 존재하는 최소 1개 thread
독자적인 Stack memory & register 보유
Code, Data, Heap 공유
Process 내의 주소공간/자원들 공유
TCB (Thread Control Block) 로 관리
1 thread가 process 자원을 변경하면 다른 sibling thread(이웃 thread)도 그 변경 결과를 즉시 볼 수 있다
memory를 공유하기 때문에 동기화 , deadlock 등의 문제 발생 가능
관련 library : POSIX Pthreads
, Windows threads
, Java threads
Process | Thread | |
---|---|---|
정의 | 실행 중인 program | Process의 실행 단위 |
생성/종료시간 | 많은 시간 소요 | 적은 시간 소요 |
Context Switching | 많은 시간 소요 | 적은 시간 소요 |
상호작용 | IPC 사용 | 공유 memory 사용 |
자원소모 | 많음 | 적음 |
메모리 내 독립성 | 각각 독립적 | |
안정성 굳! | 프로세스 내 stack/register 독립적, 이외 공유 |
Multi - Processing | Multi - Threading | |
---|---|---|
정의 | 응용 프로그램 1 = 여러 개의 process | 응용 프로그램 1 = 여러 개의 thread |
장점 | process에 문제가 발생하면 그것의 자식 proecss만 죽음 (다른 영향 x) | 1. System 자원 소모 감소 (자원 효율성 증대) (process를 생성하여 자원 할당하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있음) 2. System 처리량 증가 (처리 비용 감소) ( Thread 간 data 교환이 간단해지고 system 자원 소모 감소, Thread 사이 작업량이 작아 Context switching이 빠름) 3. Program 응답 시간 단축 (Process 내 stack 이외 모든 memory를 공유하므로 통신의 부담 적음) |
단점 | 1. Context Switching 과정에서 cache memory 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드 발생 - process 사이에 공유하는 memory가 없음 → Context Switching발생 시 cache에 있는 모든 data를 모두 reset하고 다시 cache 정보를 불러와야 함 2. Process 간 IPC 통신할 때, process 간 변수 공유 불가 - process가 각각 독립된 memory 영역을 할당받았기 때문 | 1. 주의 깊은 설계 필요 2. 까다로운 디버깅 3. single process system 은 큰 효과 X 4. process 밖에서 thread 각각 제어 불가 5. 자원 공유의 문제 발생 (동기화 문제) 6. Thread 1개의 문제가 전체 Process에 영향 |
context switching과 시분할 시스템에 대해서 설명하시오.
시분할 시스템은, 입출력 처리가 끝날 때까지 대기해야 했던 cpu의 사용률을 높일 수 있도록 고안된 시스템
Process를 실행하는 중에 다른 process를 실행하기 위해 실행 중인 process의 상태를 저장하고 다른 process의 상태 값으로 교체하는 작업을 context switching이라고 함
좀비 프로세스가 생기는 이유에 대해서 설명하시오
글 잘 봤습니다, 감사합니다.