Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프로그래머스
- TF-IDF
- 파이썬
- Python
- 코테
- 백준
- wordcloud
- 추천시스템
- 머신러닝
- Cosine-similarity
- coursera
- 딥러닝
- selenium
- 코딩테스트
- 추천 시스템
- 데이터 엔지니어링
- Tensor
- codingtest
- 웹크롤링
- 협업 필터링
- 분산 시스템
- 시각화
- pytorch
- 데이터
- 부스트캠프
- 웹스크래핑
- SGD
- Overfitting
- 알고리즘
- recommendation system
Archives
- Today
- Total
개발자식
[운영체제] 프로세스 상태, 프로세스 스케줄러, 프로세스 시스템 콜 본문
프로세스란?
프로세스 : 프로그램을 메모리 상에서 실행중인 작업, 실행중인 프로그램, 스케줄링의 대상이 되는 작업
→ 즉 디스크에 있던 프로그램이 메모리에 적재되면 프로세스, 현대의 컴퓨팅 시스템에서 작업(task)의 단위
→ 그래서 오늘날의 운영체제는 “멀티 프로세스 운영체제”
→ 프로세스는 각각 별도의 주소공간 할당 (독립적, 프로세스 하나당 하나씩 존재)
프로그램과 프로세스
- 프로그램: 실행되기 전 상태의 명령어, 코드 및 정적인 데이터의 묶음, 메모리에 올라가 있지 않은 정적인 상태
- 실행 파일 클릭 → 실행을 위한 메모리 할당 → 메모리 공간으로 바이너리 코드 올라감 → 그 순간부터 프로그램은 프로세스라고 불림 → CPU 스케줄러에 따라 CPU가 프로세스 실행
Dispatcher
- OS 프로그램 일부로, 실행중인 프로그램을 중단하고 다른 프로그램을 실행시키도록 하는 프로그램이다.
- Interrupt(timeout, I/O request)가 발생하거나 종료된 프로세스로부터 준비 중인 프로세스를 수행 상태로 만들 때 항상 Dispatcher가 수행된다.
2-State Process Model
- 가장 간단한 모델로, Not Running과 Running 상태 두 가지로 나뉜다.
- Not Running : 실행 대기 중인 상태
- Running : 현재 실행 중인 상태
5-State Process Model
- 프로세스는 상태(state)가 변경되며 수행된다.
- Running
- CPU를 잡고 instruction을 수행중인 상태
- 오직 하나의 프로세스만이 실행된다.
- Ready
- CPU를 기다리는 상태(메모리 등 다른 모든 조건을 만족하고)
- Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- 프로세스 자신이 요청한 event(ex I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- 디스크에서 파일을 읽어와야 하는 경우
- New
- 프로세스가 생성중인 상태
- Terminated
- 수행이 끝난 상태(정리할게 남아있음)
- 4,5번은 프로세스 상태에 필수로 넣진 않음
- ready, blocked 상태에는 여러 프로세스가 존재할 수 있지만, (싱글코어 cpu에서) running 상태의 프로세스는 단 하나만 존재한다.
- Ready vs Waiting: 둘다 어떤 상태의 변화를 기다리고 있지만 Waiting은 다른 이벤트가 발생하기를 기다리는 것이고 Ready는 실행 준비가 다 된 상태에서 CPU를 기다린다.
프로세스 상태 과정 설명
- new -> ready new 상태에서 프로세스가 생성되게 되면 OS 커널에 존재하는 Ready Queue에 올라가게된다.
- ready -> running - Ready Queue에 있는 프로세스들을 OS가 위에서 말한 프로세스 스케줄링 알고리즘에 의해서 Running 상태로 가야할 프로세스를 CPU로 할당하게 된다. 그러면 프로세스가 Running 상태가 된다.
- running -> ready 현재 running 상태에 있는 프로세스A 보다 Ready Queue에서 대기하고 있는 프로세스 B가 우선순위가 높으면, preemptive schedule(선점형)인 경우 프로세스A는 Ready 상태로 오게되고 프로세스B가 running 상태로 가서 CPU를 할당 받게된다.
- running -> blocked - 현재 running 상태에 있는 프로세스A에서 입출력(I/O) 이벤트가 발생했을때 프로세스A가 blocked 상태로 가게된다.
- blocked -> ready 입출력(I/O)이벤트가 종료된 프로세스는 다시 Ready상태로 오게된다.
- running -> terminate - 프로세스 종료.
프로세스를 스케줄링 하기 위한 큐
- 여러개의 프로세스들을 관리하기 위한 자료구조가 필요하다.
→ CPU를 할당받을 준비하고 있는 여러개의 프로세스들을 저장,관리할 자료구조가 필요하다.
- 작업 큐(Job Queue), 준비 큐(Ready Queue), 장치 큐(Device Queue)가 있다.
- 작업 큐: 현재 시스템 내에 있는 모든 프로세스의 집합, 그러므로 작업 큐에 있다고 해서 메모리를 가지고 있는 것은 아님
- 준비 큐: 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- 장치 큐: I/O 디바이스의 처리를 기다리는 프로세스의 집합
→ 프로세스들은 각 큐들을 오가며 수행된다.
프로세스 스케줄러
스케줄러란?: 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 모듈
- 프로세스 스케줄러: 여러 프로세스, 프로그램의 실행을 관리하는 모든 측면 포괄하는 용어
- CPU 스케줄링: CPU 시간 할당을 특별히 다루는 특정 유형의 프로세스 스케줄링이다. 프로세스 스케줄러 중 하나
- 스케줄러에는 장기, 단기, 중기 스케줄러가 있다.
- 장기 스케줄러(Job scheduler): 어떤 프로세스를 준비큐에 넣을 것인가?
- 프로세스에 메모리를 주는 문제로, 시작 프로세스 중 어떤 것들을 준비큐로 보낼지 결정한다. 그리고 메모리에 올라가 있는 프로세스의 수(degree of Multiprogramming)를 조절하는 역할을 한다. 하지만 지금의 시스템에서는 장기 스케줄러 없이 바로 메모리를 할당해 준비 큐에 넣는다.
- 단기 스케줄러(CPU scheduler): 어떤 프로세스에게 CPU를 할당해 줄 것인가?
- 준비 상태의 프로세스 중에서 어떤 프로세스를 다음 번에 실행(running) 상태로 만들 것인지 결정한다. ms 이하의 시간 단위로 매우 빈번하게 호출되어 수행 속도가 빨라야 한다.
- 중기 스케줄러(Swapper): 메모리에 적재된 프로세스 수 관리
- 프로세스에게 메모리를 뺏는 문제로, 여유 공간을 마련하기 위해 프로세스를 통째로 메모리에서 디스크의 스왑 영역에 저장한다(이런 행위를 swapout). 장기 스케줄러와 마찬가지로 degree of Multiprogramming를 제어한다.
Seven-State Process Model
- 배경: 중기 스케줄러로 인한 추가된 프로세스 상태
- suspended(stopped): 외부적인 이유로 프로세스의 수행이 정지된 상태, 메모리를 잃어버림
- 중지 준비(suspenden ready) : 준비 상태의 프로세스가 중기 스케줄러에 의해 디스크로 swap out
- 봉쇄 중지(suspenden block) : 봉쇄 상태의 프로세스가 중기 스케줄러에 의해 디스크로 swap out
- Blocked vs Suspeded: blocked은 잠시 중단되어있다 끝나면 ready로 돌아오지만 suspended는 잠시 중지되어 있다 누군가가 재기시켜줘야 ready 상태로 돌아옴
프로세스 생성
- 프로세스 생성은 부모 프로세스(1개)가 연산을 통해 자식 프로세스를 만들어낸다. 생성된 자식 프로세스 또한 새로운 자식 프로세스를 만들 수 있어 트리(계층 구조)를 형성한다.
- 프로세스는 각자 고유의 PID를 갖는다.(데몬 프로세스 값: 1)
- 프로세스는 자원을 필요로 함
- 운영체제로부터 받음
- 부모와 공유할 수 있다.
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유되지 않는 모델
- 수행(Excution)
- 부모와 자식은 공존하며 수행되는 모델 (멀티 프로세싱 환경)
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
프로세스 시스템콜
- fork(): 자식 프로세스를 생성하는
- exec(): 새로운 프로그램으로 덮어씌우는
- wait(): 자식 프로세스가 끝날때까지 기다리는
- exit(): 모든 리소스를 반납하고 종료하는
fork() 시스템 콜
- 사용자 프로그램이 새로운 프로세스를 만드는 시스템 콜 함수
- 생성된 자식 프로세스는 부모 프로세스의 데이터와 프로그램이 완전 복사 되어 똑같은 프로그램을 수행하는 프로세스가 된다.
- 자식 프로세스는 fork() 실행된 후 부터 실행한다, program count를 복제하기 때문에
- 자식과 부모를 구분한다. fork()의 return 값이 다름. 자식: pid==0, 부모 pid>0 (프로세스 ID가 다름)
int main()
{
int pid;
pid = fork(); #자식 프로세스 생성
if(pid == 0) #자식 프로세스가 실행
{
printf("\n Hello, i am child!");
}
else if(pid > 0)
printf("\n Hello, i am parent!");
}
exec() 시스템 콜
- 프로세스를 새로운 프로그램을 실행하는 프로세스로 대체하는 시스템 콜 함수이다.
- fork()와 다르게 자식 자식 프로세스를 생성하는 것이 아닌 현재 프로세스의 프로그램 코드를 새로운 프로그램 코드로 바꿔줍니다. 이로 인하여 프로그램 코드, 메모리, 파일 등 프로세스 자원이 새로 바뀌게 된다.
int main()
{
int pid;
pid = fork();
if(pid == 0)
{
printf("\n Hello, i am child!");
execlp("/bin/date") #새로운 프로그램
}
else if(pid > 0)
printf("\n Hello, i am parent!");
}
-> 자식 프로세스를 만든 후 자식 프로세스는 새로운 프로그램 실행하는 방식
int main()
{
printf("\n Hello, i am child!");
execlp("/bin/date") #새로운 프로그램
printf("\n Hello, i am parent!"); #여기는 실행안됨, 새로운 프로그램을 만들었기 때문에
}
→ 위 코드처럼 fork()를 실행하지 않고 자식 프로그램을 만들어도 된다.
wait() 시스템 콜
- 자식 프로세스가 종료될 때까지 현재 프로세스의 동작을 멈추는 시스템 콜 함수이다.
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다 (block 상태)
- child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
exit() 시스템 콜
- 프로세스 종료
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
Comments