일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- static import문
- 인스턴스 메서드
- 명예의전당(1)
- webview_flutter
- this()와 참조변수 this 차이점
- 이것이코딩테스트다
- 객체 배열
- stateful widget 생명주기
- FLUTTER
- 오버라이딩과 오버로딩 차이점
- 프로그래머스
- 운영체제의 분류
- stateful widget
- object클래스
- stateless widget
- this()
- static 메서드
- 기본형 매개변수
- 운영체제란 무엇인가
- 운영체제의 예
- 초기화 순서
- 운영체제의 목적
- 참조형 반환타입
- 운영체제의 구조
- 참조형 매개변수
- 조상의 생성자
- 오버로딩
- 클래스 변수
- 호출스택
- PriorityQueue
- Today
- Total
Coram Deo
[이론/기본] 컴퓨터 구조와 프로그램의 실행 본문
1.1 컴퓨터의 구조와 프로그램의 실행
컴퓨터는 하드웨어와 소프트웨어로 구성된다.
소프트웨어에 의해 하드웨어가 작동한다.
소프트웨어는 운영체제(OS)와 응용 프로그램(Application Program)으로 구분할 수 있다.
컴퓨터의 기본 구조
- 하드웨어의 주요 기능
입력장치 → 중앙처리장치(CPU) / 주기억장치 → 출력장치
↑
보조기억장치
CPU (중앙처리장치)
CPU는 크게 제어장치(Control Unit)와 산술논리 연산장치(ALU) 그리고 레지스터들로 구성된다.
- 제어장치 : 메인메모리(주기억장치)로부터 프로그램의 명령문(instruction)을 가져와 해독하고, 연산에 필요한 데이터를 가져와 ALU나 다른 장치에게 알맞은 연산을 지시한다.
- 산술논리 연산장치 : 제어장치로부터 신호를 받아 사칙연산과 같은 산술연산이나 값의 비교, 논리합, 논리곱, 논리부정과 같은 논리연산을 실행한다.
- 레지스터들 : CPU 내에는 주기억장치와는 별도로 레지스터라는 작은 기억장치가 있는데 주기억장치에 비해 읽고 쓰는 속도가 빠르나 가격이 비싸다. 레지스터는 제어장치나 ALU가 임시로 데이터를 보관할 때 사용하며, C 프로그램 상에서 명령문을 통해 일부 레지스터를 직접 사용할 수 있다.
Main Memory (주기억장치)
- 주기억장치는 프로그램이나 데이터를 기억하는 장치
- CPU는 항상 주기억장치에 있는 내용만을 처리한다.
- C 코드를 작성하면 하드디스크에 파일로 저장되지만 실행될 때는 주기억장치에 load되어 실행된다.
- 주기억장치에는 항상 운영체제의 핵심 부분이 상주하고 있으며 그 외의 영역에 우리가 작성한 응용 프로그램이 로드된다.
- 주기억장치에는 주소(address, 번지)가 부여되어 있다.
* 주소란?
주기억장치는 물리적인 집적회로이므로 주소가 없다면 데이터 처리 및 구분이 어렵다. 따라서 CPU가 주기억장치에 저장된 데이터를 구분할 수 있도록 도입된 개념이다.
프로그램의 실행 과정
1. fetch : Control Unit이 Main Memory에서 명령문(instruction)을 하나 가져온다.
이 과정에서 명령문을 임시 보관하기 위해 레지스터가 사용되며 주기억장치의 어느 위치에 있는 명령문을 가져올 것인지를 구분하기 위해 주소가 사용된다.
2. decode : Control Unit이 가져온 명령문(instruction)을 해독(decode)하여 ALU에게 연산을 지시하고, 연산에 필요한 데이터를 주기억장치에서 가져와 ALU에게 전달한다.
이 과정에서 Main Memory의 어느 위치에 있는 값인지를 구분하기 위해 주소가 사용된다.
3. execute : ALU는 지시받은 연산을 실행한다.
이 과정에서 계산의 중간 결과나 값을 저장하기 위해 레지스터가 사용된다.
4. write back : 연산을 마치면 ALU가 최종 결과를 Main Memory에 기록한다.
메인 메모리에 기록하는 경우 메인 메모리 내의 기록할 위치를 구분하기 위해 주소가 사용된다.
1.2 프로그램의 작성과 실행
원시 프로그램 → 컴파일러 → 목적 프로그램 → 링커 → 실행 프로그램 → 로더
파일명.c 컴파일 파일명.obj 링크 파일명.exe 로딩
컴파일 작업
컴퓨터는 기계어(2진수)만을 이해하기 때문에 프로그래머가 c나 Java등으로 쓴 원시 프로그램(Source Program)을 이해할 수 없다. 따라서 이러한 원시 프로그램을 기계어로 바꾸어야 하는데, 이 과정을 "컴파일"이라고 한다.
컴파일은 "컴파일러"라는 시스템 프로그램에 의해 실행된다.
이처럼 컴파일 후 기계어로 변환된 프로그램을 목적 프로그램(Object Program)이라고 한다.
컴파일러
원시 프로그램 → 전처리기(preprocessor) → 기계어 → 목적 프로그램
컴파일 작업은 2개로 나누어진다.
1. 전처리 : 컴파일하기 전의 처리라는 의미로 프로그래머가 미리 작성해둔 파일이나 시스템이 제공하는 파일을 추가하여 처리하는 것을 말한다.
2. 기계어변환 : 전처리 작업이 끝난 후, 기계어로 변환한다.
링크 작업
목적 프로그램이 실행되려면 "링크(link)"라는 과정을 거쳐야 한다.
실제로 원시 프로그램이 실행되기 위해서는 시스템에서 제공하는 다양한 라이브러리 프로그램(Library Program)이 연결되어야 한다.
예를 들어, 프로그램 상에서 화면(모니터)에 어떤 내용을 표시하려면 모니터라는 하드웨어에 대한 지식이 필요하다. 그렇게 시스템이나 하드웨어와 관련된 전문적인 처리를 해주는 프로그램은 시스템 라이브러리에 제공되며, 원시 프로그램을 실행하는데 필요한 라이브러리 프로그램이 목적 프로그램에 연결(링크)된다. 이런 링크 작업을 해주는 시스템 프로그램을 링커(linker)라고 한다.
----링커 (Linker)----
| 라이브러리 프로그램들 + 목적 프로그램 | = 실행 프로그램
로딩 작업
링크 작업까지 끝난 실행 프로그램은 이제 CPU가 실행할 수 있는 완전한 상태가 된 것이다.
CPU는 주기억장치(메인 메모리)에 있는 내용만 처리하기 때문에 마지막으로 로더(loader)라는 시스템 프로그램이 하드디스크에 있던 실행 프로그램을 주기억장치에 로드(load)한다. 이후 CPU가 프로그램을 실행하여 결과를 출력한다.
주기억장치에는 항상 운영체제의 핵심 부분이 상주하고 있으며, 그 외에 영역에 우리가 작성한 응용 프로그램이 로드된다. CPU는 동시에 여러개의 프로그램을 처리하는 멀티프로세싱(Multi Processing) 능력이 있기 때문에 주기억장치에는 여러 개의 응용 프로그램이 로드되어 있고, 운영체제가 정해놓은 CPU의 스케줄에 따라 응용 프로그램들을 실행한다.
* 멀티프로세싱과 스케줄링에 대해서는 운영체제 카테고리 글에서 더 자세히 설명함.
1.3 C언어의 특징
1. 하드웨어 제어 기능을 제공한다.
→ C언어는 주기억장치를 직접 접근할 수 있으며, 운영체제와 교신 할 수도 있다.
2. 프로그램이 작고 실행속도가 빠르다.
3. 다양한 자료형과 연산자를 제공한다.
4. 운영체제 간의 이식성(portability)이 높다.
→ 윈도우에서 개발한 C 프로그램을 유닉스와 같은 다른 운영체제에서 사용할 때 약간의 수정만 거치면 그대로 실행될 수 있어 이식성이 좋다.
5. 구조적인 프로그래밍이 가능하다.
출처 : C프로그래밍 기초 (김대응 이면섭 홍창수 지음)