● 도입
프로그램이란?
– 하드 디스크와 같은 저장 장치(HDD, SSD)에 저장된 문장 집합
– application, app이라고도 불리며, Window OS에서는 .exe 파일의 모습을 하고 있다.
프로세스란?
– 간단히 말하기 실행중인 프로그램
– 실행 중인 프로그램: 하드 디스크에 저장된 프로그램 메모리(RAM)로 올라갈 때 실행중인 프로그램이라고합니다.
– PC 관점에서 프로그램은 저장 장치만 사용 수동적인 존재이다.
– 프로세스는 메모리(RAM)도 사용하고, OS의 CPU 스케줄링 알고리즘에 의해 CPU도 사용해, 필요에 따라서 입출력을 하기 위해서 동적 존재라고 말할 수 있다.
– 이러한 프로세스는 CODE 영역, DATA 지역HEAP 지역STACK 영역 등으로 구성된다.
CODE 영역에는 자신을 실행하는 코드가 저장되어 있다.
DATA 영역에는 전역 변수와 정적(정적) 변수가 저장됩니다.
HEAP 영역은 프로그래머가 동적으로 메모리를 할당하는 데 사용됩니다.
C에서 malloc, free 함수를 호출하면 힙 영역의 리소스를 할당/해제할 수 있습니다.
STACK 영역에는 로컬 변수와 함수 호출에 필요한 정보가 저장됩니다.
● 프로세스가 되는 프로세스
– 개발자가 작성한 코드가 메모리에 올라 프로세스가 되는 과정을 살펴보자(C언어 기준으로 설명)
– 아래 코드는 두 개의 숫자를 추가하는 매우 간단한 코드입니다 (파일 이름 : test.c)
– C는 컴파일 언어이므로 컴파일을 필수로 하지 않으면 실행 가능하다.
– 위 소스 코드(test.c)가 컴파일되고 test.exe 프로그램으로 작성되는 프로세스는 다음과 같습니다.
1. 전처리를 거쳐서 매크로로 정의한 숫자를 치환해, 필요한 파일을 호출한다.
– 전처리를 거치면 파일의 확장자는 .i 된다.
2. 컴파일러하지만 컴파일을 해준다.
– 컴파일이 완료되면 높은 수준의 C 언어가 낮은 수준의 어셈블리 언어로 바뀝니다.
– 어셈블리어는 명령어와 기계어가 일대일 일치하므로 기계어에 가장 가까운 언어입니다.
– 컴파일러를 통과하면 파일 확장자는 .s 된다.
3. 어셈블러어셈블리어를 기계어로 바꿉니다.
– 이로 인해 해당 파일은 0과 1로 구성된 기계어로 구성된다.
– 기계어로 구성되어 있기 때문에 text editor에서 해당 파일을 열면 텍스트가 손상되어 보인다.
– 파일 확장자는 .o 된다.
4. 링커가 링킹을 한다.
– 다양한 라이브러리와 다른 소스 코드를 연결해 준다고 생각하면 된다.
5. 연결할 때까지 파일 확장자는 .exe 된다.
– 이제 파일을 두 번 클릭하면 하드 디스크에 있습니다.
test.exe 프로그램이 메모리에 오르고, 이렇게 올라간 프로그램은 프로세스라는 이름으로 불리게 된다.
– 지금 프로세스는 운영 체제(OS)에서 관리합니다.
된다.
cf) 어셈블리는 이렇게 생겼다.
– OS 전략에 따라 프로세스가 실행되지만 이것을 CPU 관점에서 살펴 보겠습니다.
– CPU는 0과 1과 같은 기계어만 실행합니다.
0과 1만 사용하여 CPU의 관점을 설명하기가 어렵기 때문에 기계어에 가장 가까운 어셈블리어를 사용하여 살펴보겠습니다.
1. CPU의 컨트롤러가 숫자 5와 7을 메모리에 저장합니다.
2. 메모리에 저장된 값을 edx, eax 레지스터로 가져옵니다.
3. 제어 장치가 레지스터에 저장된 5와 7을 추가하도록 명령하면 산술 논리 연산 장치는 두 개의 숫자를 더하고 결과는 eax 레지스터에 저장됩니다.
4. 다시 컨트롤러가 eax 레지스터에 저장된 값인 12를 얻고 메모리에 저장합니다.
cf)