1. 프로세스(process)란?
- 프로세스(process)란 실행중에 있는 프로그램(Program)을 의미한다.
- 스케줄링의 대상이 되는 작업(task)과 같은 의미로 쓰인다.
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고있는데, 실제로는 스레드(thread)단위로 스케줄링을 한다.
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
2. 프로세스(process)의 메모리 구조 (프로세스 하나당 하나씩 존재한다.)
+ 손으로 그린.... 메모리 구조.. (똥손입니다.)
Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
(쉽게 말하면 소스코드가 올라간다고 생각하면 됨)Data 영역 : 전역변수, static 변수의 할당.
Heap 영역 : 동적할당을 위한 메모리 영역.
- C언어 : malloc & free // C++ : new & delete // JAVA : new & (java에서 메모리 해제는..가비지컬렉터가 알아서해주는거로 앎..아니면 객체 null)Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역.
3. 프로세스 스케줄링 (Process Scheduling)
- CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개?????
-> CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다. - 스케줄링(Scheduling)
- CPU 할당 순서 및 방법을 결정하는 일. (어떤 프로세스를 running 상태로 보낼까?)
- 일정한 기준 : scheduling algorithm 을 통해서.
**대부분의 OS에서는 우선순위(Priority algorithm) 알고리즘과 라운드 로빈(Round Robin) 알고리즘을 혼합해서 스케줄링 하는것으로 알고있습니다.
**스케줄링의 디테일은 다음 글에서 진행하겠습니다.
4. 프로세스 상태변화
- 프로세스의 상태는 ready, blocked, running 상태가 있습니다.
+ 똥손으로 그린 그림을 보시죠..
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 - 프로세스 종료.
** ready, blocked 상태에는 여러 프로세스가 존재할수 있습니다.
** 하지만, 싱글코어CPU에서, running 상태의 프로세스는 단 하나만 존재합니다.
+) 스레드(Thread)
프로세스라는 것이 사실은 큰 의미? 통? 같은 것이고 실제로 상태변화를 하거나 컴퓨터에서 task로 사용하는 단위는 Thread 입니다.
간단히 말하자면 스레드(Thread)는 프로세스 내부의 작업의 흐름, 단위입니다.
스레드(thread)는 한 프로세스(process)내부에 적어도 하나 존재합니다.
스레드(thread)가 여러개 존재하는것을 멀티스레드(Mulitread)라고 합니다.
멀티스레드(Multitread)에서 각 스레드끼리는 프로세스의 일정 메모리 영역을 공유합니다.
일정 메모리 영역을 공유 하기 때문에 동일한 프로세스 내부의 스레드 간 문맥전환(context switching) 할때가, 프로세스 끼리 문맥전환(context switching)을 할때보다빠릅니다. 상대적으로 스위치 해야 할 메모리 영역이 적기 때문입니다.
(하지만 멀티 스레드를 잘못 이용하면,,,,, 버그 찾기가 쉽지 않습니다....... 학교에서 과제할때 그래서 고생....했다는..... fork를 통한 멀티 스레드가.. 상대적으로 버그를 찾을때, 쉽긴합니다.... 개인적인 의견이었습니다..)
**학교에서 학습한 것과, 참고서적 및 구글링을 통해 공부하면서 정리한 내용입니다.
'<개인공부> > [Operating System]' 카테고리의 다른 글
[운영체제] Banker's algorithm(은행원 알고리즘) 구현 - Deadlock (0) | 2017.11.24 |
---|---|
[운영체제] Deadlock(교착상태)에 대해서 (0) | 2017.11.24 |
[운영체제] 유저모드와 커널모드에 대해서. (3) | 2017.07.19 |
[운영체제] 스케줄링 알고리즘 (4) | 2017.07.08 |
[운영체제] OS의 정의와 컴퓨터 구조 (2) | 2017.07.06 |