티스토리 뷰
https://radderveloper.tistory.com/108
#5 프로그램과 프로세스
● 도입 프로그램이란? - 하드디스크와 같은 저장 장치(HDD, SSD)에 저장된 명령문의 집합체 - application, app 이라고도 불리고 Window OS에서는 .exe 파일의 모습을 하고있다. 프로세스란? - 간단히 말해
radderveloper.tistory.com
- 위의 글을 먼저 읽어보자
● 프로그래밍 언어의 종류와 프로세스 메모리 구조
1) 프로그래밍 언어의 종류
- 프로그래밍 언어는 컴파일 언어와 인터프리터 언어로 구분할 수 있다.
1. 컴파일 언어
- 개발자가 코드를 작성하고 컴파일 과정을 거쳐 0과 1로된 기계어로 실행파일을 만든다.
- 컴파일 과정에서 문법 오류가 있는지 검사하고 CPU에서 처리가능한 기계어로 실행 파일을 만들어 놓기 때문에 속도가 빠르다.
- C, C++. C# 등이 컴파일 언어에 속한다.
2. 인터프리터 언어
- 개발자가 작성한 코드를 미리 기계어로 만들지 않고 실행 시 코드를 한 줄씩 해석해 실해하는 언어이다.
- 미리 검사를 하지 않기 때문에 실행 시 오류가 발생할 수도 있고 컴파일 언어에 비하면 속도도 느리다.
- JavaScript, Python, Ruby 등이 인터프리터 언어에 속한다.
2) 프로세스 메모리 구조
- 프로세스의 메모리 구조를 알아보자
- 프로세스는 CODE, DATA, HEAP, STACK 영역으로 나뉜다.
1. CODE : 실행해야 할 코드가 들어가는 영역
2. DATA : 전역변수나 배열이 들어가는 영역
- HEAP과 STACK은 프로세스가 실행될 때 할당되는 메모리이다.
3. HEAP : 실행중에 메모리 공간을 할당할 수 있는 동적인 공간
4. STACK : 지역변수, 함수 관련 값들이 들어가는 영역
● 컴파일과 프로세스
- 컴파일 언어로 작성된 파일이 어떻게 프로세스가 되는지 알아보자
- 50과 100을 더해 출력해주는 프로그램을 C언어로 작성했다.
- 10번 라인에 있는 printf 함수를 이용하기 위해 2번 라인에 #include 문을 추가했다.
- 4번 라인에서는 숫자 100을 MY_NUMBER로 치환시켰다.(이를 매크로라고 부른다.)
- 6번 라인에서 프로그램 실행 시 자동으로 실행되는 main 함수를 선언했다.
- 프로그램을 다 만들었으니 컴파일을 해서 실행파일(exe)로 만들어보자
- 개발자가 작성한 코드는 컴파일러를 거쳐서 실행파일이 되는데 컴파일 과정은 아래와 같다.
1.
개발자가 코드를 작성한 후 test.c 라는 파일로 저장했다. 이제 컴파일러를 실행시키면 가장 먼저 전처리 단계를 밟는다.
2.
전처리기는 test.c 파일을 훑어보고 전처리 구문을 처리해준다.
2-1. 여기서 전처리 구문은 # 으로 시작하는 부분인데 위의 코드에서는 #include와 #define이 해당된다.
2-2. 전처리기를 거치면 2번 라인의 #include를 통해 stdio.h의 내용이 들어오게되고 4번 라인에서 선언한 매크로 MY_NUMBER 값은 전부 100으로 치환된다.
2-3. 또한 코드에 있는 모든 주석 부분은 제거된다. 전처리기 작업 결과는 아래와 같다.
- 10번 라인에 printf 함수의 원형을 가져온 부분이 있다.
- 17번 라인에서 MY_NUMBER가 100으로 치환됐으며 뒤에 있던 주석도 사라졌다.
- 이제 해당 파일은 test.i 가 됐다.
3.
- 전처리기를 거친 파일은 컴파일러가 처리한다.
- 컴파일러는 C언어로 작성된 해당 파일을 기계어에 가까운 어셈블리어로 변환시킨다.
4.
- 어셈블리어로 바뀌었다면 어셈블러를 통해 오브젝트 파일로 변하게 된다.(test.o)
- 오브젝트 파일은 0과 1로된 기계어로 구성돼있기 때문에 text editor에서 열면 아래와 같이 글씨가 깨져보인다.
(실행되는데에는 문제가 없다.)
- 오브젝트 파일은 코드 영역과 데이터 영역이 나뉘어져있다.
5.
- 오브젝트 파일이 실행 파일이 되기 위해서는 링커를 거쳐줘야한다.
- 링커는 모든 오브젝트 파일을 하나의 코드영역과 데이터 영역으로 묶는 역할을 한다.(webpack이랑 비슷한 듯?)
- 그리고 실제로 실행될 주소를 매핑해준다.
6.
- 링커까지 거쳤다면 exe 실행 파일이 만들어진다.
- 해당 exe 파일은 완벽한 상태의 코드영역과 데이터영역으로 구성되어있다.
7.
- 사용자가 exe 파일을 실행시키면 OS(운영체제)가 프로세스를 만든다.
- OS는 exe 파일에 있는 코드영역과 데이터영역을 가져와 프로세스의 코드영역과 데이터영역에 넣어주고 비어있는 상태의 HEAP과 STACK을 할당한다.
- 그리고 PCB를 만들어 관리가 가능하도록 만들고 프로그램 카운터(PC) 즉, 다음 실행할 명령어의 주소를 생성한 프로세스의 코드영역의 첫번째 주소로 설정한다.
- 이후 OS의 CPU 스케줄링에 따라 프로세스가 실행되다가 작업을 마친다.
cf) 전처리기에 대한 좋은 글
https://blog.naver.com/ndb796/221046613546
C언어 전처리기(Preprocessor) 개념 정리 및 실습하기
전처리기(Preprocessor): 컴퓨터의 처리에 있어서 중심적인 처리를 수행하는 부분을 위해 사전 준비...
blog.naver.com
'CS > 운영체제' 카테고리의 다른 글
#27 메모리 - 메모리와 주소 (0) | 2023.05.29 |
---|---|
#26 메모리 - 메모리 종류 (1) | 2023.05.28 |
#24 데드락 해결 by 은행원 알고리즘(Banker's algorithm) (0) | 2023.05.21 |
#23 데드락(deadlock, 교착상태) by 공유자원 (0) | 2023.05.15 |
#22 프로세스 동기화 - 모니터(컴퓨터 모니터 아님) / synchronized (0) | 2023.05.11 |
- Total
- Today
- Yesterday
- MongoDB
- MySQL
- 프로세스
- 코테
- 프로그래머스
- 빅데이터 분석기사
- 운영체제
- node.js
- SpringBoot
- Spring Boot
- SQL
- nosql
- git
- 빅데이터
- OS
- Java8
- db
- 알고리즘
- java
- Stream
- Phaser3
- jpa
- Advanced Stream
- DART
- Phaser
- API
- 코딩테스트
- spring
- 자료구조
- 메모리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |