운영체제 관련 글 순서
- 프로세스란
- 쓰레드
- CPU 스케줄링
- 동기화 툴
- 동시성 제어 예제
- 데드락
- 주 메모리
- 페이징과 스와핑
- 가상 메모리와 디맨드 페이징
- 페이지 교체 알고리즘(FIFO, OPT, LRU), 쓰레싱, working set
프로세스란
프로세스는 실행중인 프로그램을 의미
os가 해야하는 일 중에 하나가 프로세스를 관리하는 것이다.
프로그램 vs 프로세스
프로그램은 자체적인 생명이 없다. 프로그램은 보조 기억장치에 존재하는 명령어(코드)와 정적 데이터의 모음이다.
이러한 명령어와 데이터가 메모리에 적재되어 실행되면 프로세스가 된다.
프로세스가 필요한 자원(컴퓨터의 구성요소와 동일)
- cpu
- 메모리
- 리소스(파일이나 i/o divices)
리소스들을 메모리에 적재하고 cpu를 통해 처리한다.
프로세스는 메모리에 아래와 같은 영역으로 올라간다.
- 코드(text): 코드 자체를 구성하는 영역
- 데이터: 전역변수,정적변수 등
- 힙: 동적 할당 시 사용(new(), malloc() 등)
- 스택 : 매개변수, 지역변수, 리턴 값
프로세스의 생명주기
- New: 프로세스가 생성된 상태
- Running: cpu를 점유해서 프로세스를 실행하는 상태
- Waiting(sleep): cpu가 다른 작업을 끝낼 때까지 대기하고 있는 상태
- Ready: 준비작업을 끝내고 실행되기를 기다리고 있는 상태
- Terminated : 프로세스 종료한 상태
프로세스가 만들어지고(New), cpu를 획득하기위해 준비작업이 끝나면 ready상태가 된다.
이후 cheduler에 통해 running상태(실행)가 되고, i/o나 이벤트가 발생하면 Waiting상태가 되었다가, 다 끝나면 다시 ready -> running하게 된다.
이렇게 다 끝나면 terminated(종료) 상태가 된다.
PCB(Process Control Block)
: 프로세스를 관리하기 위해 프로세스에 필요한 정보를 저장한 것.(TCB라고도 불림 task)
PCB가 가지고 있는 정보
- PID: 프로세스 식별번호
- Process state: 프로세스의 상태
- Program counter: 다음으로 실행할 명령어를 가리키는 값.
- CPU registers: 프로세스가 실행상태에서 마지막으로 실행한 process의 register내용을 가지고 있음.
- 프로세스는 운영체제에 의해 계속 교체되면서 실행하는데, 기존에 어디까지 실행했는지 저장. 마치 연속적으로 실행된것처럼 보여짐.
- CPU-schecduling information: CPU에서 실행되는 순서
- Memory-management information: 메모리 정보
- Accounting information: 계정 정보(어떤 유저가 한건지)
- I/O status information: 파일 또는 자원에대한 정보
프로세스는 기본이 싱글 스레드 execution 패턴을 사용한다.
다수의 Thread가 작업을 해야할때, 동시에 작업하는게 아닌 한번에 하나의 Thread만 작업
이렇게 하게 되면 cpu를 덜 사용하게 되고, cpu의 사용률을 증가시키기 위해 나온 것이 멀티 쓰레드, 멀티 프로그래밍 등이 있다.
- 멀티 쓰레드: 하나의 프로그램에서 여러 Thread가 동시에 작업을 처리
- 멀티 프로세싱: 다수의 프로세서(CPU)가 서로 협렵적으로 일을 처리하는 것을 의미.(컴퓨터는 1대인데 여러 cpu core로 처리. 듀얼코어, 쿼드코어 등등 )
- 멀티 프로그래밍: 단일 프로세서(CPU) 상에서 여러 개의 프로세스가 동시에 실행되는 것.
- 시분할 시스템(Time sharing System): 실제로 동시에 실행되는게 아닌 매우 빠른속도로 교체하면서 실행
멀티 프로그래밍 vs 시분할 시스템
멀티 프로그래밍은
- 실행중인 프로세스A가 I/O함수를 실행했을때 장치에 데이터가 없는 경우 CPU를 이동해서 프로세스 B를 실행.
- 이후 기다리던 데이터가 들어오면 A는 준비상태에서 우선순위에따라 최우선순위가 되면 실행
- I/O 작업을 기다리지 않아도 되므로 cpu 이용률을 최대화함.
시분할 시스템은
- 기본은 멀티 프로그래밍과 동일
- 하지만 CPU가 각 프로세스를 일정 시간(time slice or time quantum)동안 번갈아 가면서 실행
- 프로세스를 일정 시간마다 번갈아가면서 실행되기때문에 멀티 프로그래밍에 비해 좀 더 빠른 응답시간을 가짐.
- 대화형 프로그램에서 많이 사용
동일조건상에서
CPU이용률은 멀티프로그래밍이 위.(CPU 스위칭이 없음)
응답시간은 Time Sharing이 위.(다른 프로세스가 끝나길 안기다려도 됨)
멀티 프로그래밍 vs 시분할 시스템
이 외에도 다양한 방식이 있음..
시분할 시스템 같이 실행되기 위해선 프로세스가 실행할 스케쥴링이 짜여져 있어야함.
스케쥴링은 queue의 형태로 되어 있음.
Scheduling Queues(ready queue)
: 여러 프로세스가 ready queue에 담겨 있다가 running상태로 가는것.
waiting상태는 waiting queue에 담겨있음.
waiting queue -> ready queue -> running
프로세스가 사용되어 있는 상태가 context(PCB)
Context Switching(문맥 교환)
인터럽트가 발생하거나 i/o 작업이 들어오면 running중인 프로세스의 context를 저장하고,
대기하고 있던 다음 순번의 프로세스 context를 복원하는 과정을 뜻함.
fork()
fork는 process를 복제하는 명령어이다.
멀티 태스킹(동시 처리)을 하기위해 쓰이는데,
첫번째 프로세스는 init 부모 프로세스. 복제된 프로세스를 자식 프로세스라고 한다.
실행 시에 순서에 따른 실행방법
- fork를 통해 자식 프로세스를 만들고 둘이 동시에 실행.
- wait방법. 자식이 끝나면 실행
address-space 측면에서도 두가지 방법
- 자식 프로세스가 동일한 일을 한다면, pcb만 별도로 만들고 메모리는 동일하게 사용.
- 다른 일을 한다면, 다른 메모리 사용.
프로세스의 종료
- 다 실행되면 종료
- exit()를 통해 종료
- os에선 메모리 종료 및 리소스 할당 종료
좀비 프로세스: 프로세스는 다 실행 후 exit() 시스템 콜을 호출하면서 종료된다.
자식 프로세스가 종료될때, 부모 프로세스는 wait()시스템 호출을 사용하여 자식 프로세스가 종료할때까지 기다리며 끝났을때 자식의 종료상태를 얻어내게 된다.
프로세스가 종료되면 관련된 메모리와 리소스 등이 운영체제로 반납되는데, 부모 클래스가 wait()를 호출하지 않으면 자식의 종료상태를 뜻하는 정보가 메모리에 남게되고, 이러한 상황에서의 자식 프로세스를 좀비 프로세스라고 합니다.
좀비 프로세스는 최소한의 정보로 큰 성능을 저하시키진 않지만, 운영체제는 한정된 pid를 가지고 있고 좀비 프로세스는 pid를 차지하게되어 다른 프로세스 실행을 방해하게 된다.
고아 프로세스: 부모 프로세스가 자식 프로세스보다 먼저 종료될 때, 자식 프로세스를 뜻함.
운영체제는 이러한 고아 프로세스를 허용하지 않고, 새로운 부모 프로세스로 init 프로세스를 설정함.
init프로세스는 자식 프로세스가 종료될때까지 기다린 후 wait 함수를 호출하여 종료 상태를 회수.(종비 프로세스가 되는것을 방지)
물론 고아 프로세스를 운영체제에서 이러한 방법으로 해결해주지만, 성능 저하를 방지하기 위해 부모 프로세스가 종료되기 전에 모든 자식 프로세스를 wait 해주는 것이 좋다.
참조
'CS > OS(운영체제)' 카테고리의 다른 글
데드락(Deadlock) (0) | 2022.01.05 |
---|---|
동시성 제어 예제(Bounded-Buffer, Readers-Writers (0) | 2022.01.05 |
동기화 툴(프로세스 동기화) (0) | 2022.01.05 |
CPU 스케줄링 (0) | 2022.01.05 |
쓰레드(Thread)란 (0) | 2022.01.05 |
댓글