<개인공부>/[Operating System]

[운영체제] 프로세스란? (스케줄링, 메모리구조, 상태변화)

사용자 BlockDMask 2017. 7. 7. 13:13
반응형

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를 통한 멀티 스레드가.. 상대적으로 버그를 찾을때, 쉽긴합니다.... 개인적인 의견이었습니다..)

**학교에서 학습한 것과, 참고서적 및 구글링을 통해 공부하면서 정리한 내용입니다.

내용이 이상하거나 지적할 사항들은 말씀해주시면 수정하겠습니다.
**참고 서적 : 윤성우, 『뇌를 자극하는 윈도우즈 시스템 프로그래밍』, 한빛미디어, 2007.03.30


반응형