프로세스
-> 메인 메모리에 이동하여 실행중인 프로그램 (일반적인 정의)
범위 는 메모리구조 + 레지스터 이다.
메모리 구조
[Code영역][Data영역][Heap영역 ~ Stack영역] 이렇게 낮은주소~높은주소 순서로 되어있다.
- code : 명령어집합
- data : 전역변수, static변수
- heap : 동적으로 프로그래머가 할당
- stack : 지역변수, 함수인자
운영체제별로 다른데, 가상메모리를 4gb 정도 할당받는다. 4gb 가 메모리에 다 올라가는 것이 아니라, 페이징기법으로 사용하는 공간만 올라간다고 한다.
Context switching
A, B 프로세스가 동시에 실행될 때 A가 먼저 우선순위를 B 에게 건네줄 때, context switching 이 일어난다. 레지스터셋을 저장해놨다가 (메모리) B에게 양보해야한다. 이때 B 는 READY -> RUNNING, A 는 RUNNING -> READY 상태로 바뀐다. context switching 은 고속으로, 한자리수 넘게 일어난다. CPU 성능에 따라.
성능을 향상시키기 위해 프로세스마다 각각의 레지스터셋을 할당하는 방법도 있다고 한다.
프로세스 스케줄러
-> 둘 이상의 프로세스가 적절히 실행되도록 컨트롤해준다.
프로세스 스케줄러는 SoftWare 이다. 프로세스 스케줄러도 프로세스로 실행되므로, 스케줄링을 원하는대로 하면서 스케줄러를 적게 실행시키는 OS 가 좋은 OS 라고 할 수 있다.
방법
알고리즘에 따라 다양하다.
대충
이렇게. core 수 넘게 프로세스가 실행되면(2라고 가정), 스케줄러에서 스케줄링알고리즘 대로 context switching 을 해준다. 이렇게 A,B,C 프로세스가 같이 실행될 수 있는 것이다. 요즘은 CPU 성능이 거의 다 좋아서, 동시에 실행되는 것처럼 보인다.
작업표시줄 빈공간을 우클릭 하고 작업관리자 - 자세히보기 를 눌러보자. 목록에 있는게 전부 프로세스이다.
얼마나 많은 context switching 이 일어나는지 짐작할 수 있을것이다.
프로세스의 상태
CPU 에 의존적인 ALU 연산과 그렇지 않은 I/O 연산 (그래픽,파일,네트워크 등) 은 분리해서 실행이 가능하다
프로세스 여러개가 실행되면서(START) READY, RUNNING 상태를 스케줄러에 의해 넘나들게 된다.
CPU 에 의존적인 ALU 연산을 하다가, I/O 연산을 할 때에는 RUNNING -> BLOCKED -> (I/O 연산 끝) -> READY 이 순서로 진행이 된다. 이 때 다른 프로세스가 RUNNING 상태가 되고.
#윤성우 윈도우 시스템 프로그래밍 기반으로 제작되었습니다.