프로그램(Program)과 프로세스(Process) 차이
프로그램(Program)
- 하드 디스크, SSD같은 보조기억장치에 저장되어있는 실행 코드를 의미
(실행 코드가 실행 파일(.exe)만 의미하는 것은 아님)
프로세스(Process)
- 프로세스는 프로그램이 메모리에 상주해 있는 상태를 의미(즉, 주기억장치에 있는 상태를 의미)
- 일반적으로 수행 중인 프로그램의 인스턴스라고 정의함
프로세스 구성요소
프로세스 커널 오브젝트
- 프로세스 관리 목적으로 운영체제가 사용하는 커널 오브젝트
- 시스템은 프로세스에 대한 가종 정보를 프로세스 커널 오브젝트에 저장하기도 함
주소 공간
- 실행 모듈이나 DLL(Dynamic-Link Library)의 코드와 데이터를 수용하는 주소공간
- 이러한 주소 공간은 스레드 스택이나 힙 할당과 같은 동적 메모리 할당에 사용되는 공간도 포함함
스레드
- 프로세스의 작업 실행 흐름의 단위를 의미
- 프로세스는 자력으로 수행이 될 수 없음
- 프로세스가 어떤 일을 처리하기 위해서는 프로세스의 컨텍스트(Context) 에 스레드(Thread)가 있어야 함
- 스레드는 프로세스의 주소 공간상에 존재하는 코드를 수행함
- 하나의 프로세스는 다수의 스레드를 가질 수 있음
(여러 스레드들은 프로세스 주소 공간내에서 동시에 코드를 처리함, 때문에 스레드들은 자신만의 CPU레지스터 집합과 스택을 가지고 있다)
- 프로세스는 프로세스 주소 공간 내의 코드를 수행 하기위해서 반드시 하나 이상의 스레드를 가지고 있어야한다
(스레드가 하나면 - 단일 스레드(Single thread), 두개이상이면 - 다중 스레드(Multi thread)
- 프로세스 생성시 시스템이 첫 번째 스레드를 만들어 준다
(주 스레드(Primary Thread)라고 부른다)
- 주 스레드로 여러 스레드를 추가로 생성할 수 있고, 이렇게 만들어진 스레드를 통해서도 또다른 스레드를 생성할 수 있다
- 시스템은 프로세스의 주소공간에 코드를 수행할 스레드가 존재하지 않을 경우 자동적으로 프로세스와 프로세스 주소 공간을 파괴한다
스케줄링
- 모든 스레드가 동시에 작업하는 것처럼 보이기 위해서 운영체제는 각스레드에 CPU점유 시간을 조금씩 나누어줌
- 각 스레드들은 라운드 로빈(Round-Robin) 방식으로 주어지는 단위 시간(Quantum)만큼만 CPU를 점유할 수 있다
(동시는 아니지만 빠른 순환을 통해 마치 동시에 작업을 하는것처럼 보인다)
- 윈도우 운영체제에서는 스레드에 대한 모든 관리와 스케줄링을 윈도우 커널이 담당
- 여러개의 CPU를 가진 머신을 최대한 활용하기위해서는 어플리케이션의 알고리즘을 적절하게 수정하는 것이 불가피하다
흐름
- 보조기억장치에 있는 프로그램 실행 - 주기억장치에 프로그램을 포함한 프로그램과 관련된 정보를 로드함
(DLL도 이 때 로드함)
로더(Loader)
- 운영체제의 내부 프로그램을 의미
- 프로그램을 프로세스로 만들어 주는 작업을 담당
(프로그램을 메모리로 불러오는 작업, 로더가 불러오는 시간을 로드 타임(Load Time)이라고 함)
런타임(Run-Time)
- 프로그램이 실행되는 동안의 시간을 의미
커널(Kernel)
- 운영체제의 핵심 부분을 의미
- 무분별한 하드웨어의 조작을 막기위해 존재(여러 이유가 존재함)
- 유저 모드에서 커널 모드에 요청하는 것을 시스템 콜(System Call)이라고 한다.
바인딩(Binding)
- 속성과 개체 사이의 또는 연산과 기호 사이와 같은 연관(Association)
바인딩 타임(Binding Time)
- 프로그램에서 변수들이 갖는 속성이나 값이 완전히 결정되는 시간
- 이름에 속성이 연결되는 시간을 의미
바인딩 타임의 종류
1. 언어 정의 시간(Language Definition Time)
- 자료구조나 프로그램 구조를 등을 확정
(int를 정수형으로 나타낸다고 정의)
2. 언어 구현 시간(Language Implementation Time)
- 언어를 정의할 때 이루어지는 형태
(표현 자리수, 범위, 크기 등을 정함)
- 렉싱(Lexing) : 키워드를 문법대로 분리하는 것
(int num 을 4바이트로 결정, int, char 등 사전에 정의된 키워드를 렉싱한다고 함)
3. 컴파일 시간(Compile Time)
- 프로그램을 번역할 때 이루어짐
(Data, Stack 등 메모리에 들어갈 변수가 정해짐)
- 정적 바인딩
- 변수의 이름, 자료형과 프로그램 문장 구조 결정
- 고급 언어를 Binary File, Obj 파일로 변환
- 코드를 파싱(Parsing)하여 Obj 파일로 변환하는 과정에서 문법에 어긋나지 않는지 확인
4. 링크시간(Link Time)
- 프로그램을 라이브러리와 링크할 때
- 라이브러리와 모듈을 합침
5. 적재 시간(Load Time)
- 변수를 메모리로 적재할 때
(메모리 주소 결정)
- 시스템이 메모리로 프로그램을 상주시켜 실행할 때
6. 실행 시간(Run Time)
- 프로그램을 실행 할 때
(변수값이 확정됨)
- 변수의 메모리 장소 할당
- 프로그램 실행 시점부터 종료 시점까지 변수값을 바인딩
정적 바인딩(Static Binding)
- 실행 시간(Run Time)전에 일어나 실행 중에 변하지 않는 상태로 유지되는 바인딩을 의미
(int num, num을 정수 타입(Integer Type)으로 바인딩)
동적 바인딩(Dynamic Binding)
- 실행 시간(Run Time)중에 발생하거나 프로그램을 실행하는 과정 에서 변경되는 것을 의미
(정적 바인딩된 변수들이 실행 중에 변결되면 동적 바인딩으로 볼 수 있다)
(int *ptr = malloc(sizeof(int) * 10); // int(4byte_시스템에 따라 다를 수 있음) * 10 = 40byte의 메모리 동적 할당
할당(Allocation)
- 기억장소 할당(변수에 메모리 공간을 바인딩하는 과정)
정적 할당(Static Allocation)
- 메모리에 적재될 크기를 미리 아는 것
(int num = 4; // num에 int(4byte_시스템에 따라 다를 수 있음)만큼 메모리 공간 할당)
- 실행 시간(Run Time)에 각 자료형에 맞는 메모리 영역(Segment)에 할당
동적 할당(Dynamic Allocation)
- 프로그램 실행중에 유저에 의해 변화하여 크기를 미리 알 수 없는 것
- 유저의 명령에 의해 실행되는 할당
- 동적할당하여 가리키게 되는 공간은 힙 영역(Heap Segment)
- 포인터 또는 참조 변수를 통해 접근 가능
'공부 > IT' 카테고리의 다른 글
IT_진법 변환 (0) | 2023.03.20 |
---|---|
IT_ASCII(아스키) (0) | 2023.03.18 |
IT_프로그램 실행 (0) | 2023.03.13 |
IT_실행파일이 만들어지기 까지 (0) | 2023.03.07 |
IT_Visual Studio 폴더 시스템 (0) | 2023.03.05 |