애플리케이션 프로그래밍과 시스템 프로그래밍
애플리케이션 프로그래밍과 시스템 프로그래밍
개요
웹 브라우저를 활용하지 않고 프로그래밍을 하면 어떤 과정을 거쳐야 하는지에 대해 살펴보자
HTML과 자바스크립트 프로그램
브라우저는 고수준 가상 머신으로 하부 구조를 감추면서 빠르고 쉽게 프로그램을 작성할 수 있다.
애플리케이션 수준의 뼈대
- HTML은 웹 페이지의 기본 구조와 뼈대를 형성한다.
- 즉, 웹 문서의 구성 요소 정의 및 배치를 담당한다.
웹 페이지 본문
- 웹 페이지의 실질적인 내용이 들어가는
<body>
요소 내에 위치한다. - 사용자에게 직접 보여지는 컨텐츠다.
자바스크립트
- 웹 페이지에 동적 기능을 추가한다.
- 사용자 입력 처리, 계산, 웹 페이지 동적 제어, 통신 등
CSS
- HTML 요소에 디자인과 레이아웃을 추가한다.
C 프로그램
반면에 C로 작성하면 브라우저가 숨겨주던 더 기초적인 동작이 드러난다.
터미널과 명령줄
- 터미널은 명령줄 인터페이스(CLI)를 제공한다.
- 이를 통해 사용자가 텍스트 기반 명령어를 입력하고 결과를 출력 받을 수 있다.
프로그램 빌드
- C언어는 컴파일 언어라 실행 전에 소스 코드를 기계어로 변환해야 한다.
- 소스 파일로 기계어 파일을 생성하는 과정을 빌드라고 한다.
- 출력된 파일을 사용해 프로그램을 실행할 수 있다.
터미널과 장치 드라이버
- 터미널은 I/O 장치다.
- 운영체제가 사용자와 터미널의 중간에서 통신을 중재한다.
문맥 전환
- 운영체제는 한 번에 사용자 프로그램을 하나 이상 실행할 수 있다.
- 하지만 컴퓨터는 레지스터 집합이 하나뿐이다.
- 그래서 사용자 프로그램을 바꿀 때마다 레지스터를 저장하고 복구해야 한다.
- 이때 저장하고 복구해야 하는 모든 내용을 프로세스 문맥이라고 한다.
- 문맥은 크기가 크기 때문에 문맥 전환은 비용이 비싸다.
- 문맥 전환을 최소화하기 위해 사용자가 엔터를 누를 때에만 사용자 프로그램을 깨운다.
- 이때 엔터를 누르기 전까지 터미널에 들어오는 문자를 버퍼에 저장한다.
- 버퍼는 선입선출 구조다.
- 에코는 사용자 입력을 즉시 화면에 표시한다.
- 버퍼링이 꺼져 있는 경우를 Raw, 켜진 경우를 Cooked Mode라고 한다.
표준 I/O
- 장치 드라이버에서 버퍼링 처리를 해도 사용자 프로그램에서 계속 시스템 콜을 하면 의미가 없다.
- 이러한 문제를 해결하기 위해 표준 입출력 라이브러리가 만들어졌다.
- 입력 시에는 버퍼가 빌 때까지 입력 문자를 얻고 버퍼가 소진되면 다시 시스템 콜을 통해 입력을 가져온다.
- 출력 시에는 버퍼가 꽉차거나 줄바꿈 문자가 출력될 때까지 버퍼에 들어간다.
- 사용자 프로그램은 터미널 장치 드라이버와 연결하기 위해 open/close 시스템 콜과 대응되는 fopen/fclose 함수를 제공한다.
원형 버퍼
- in/out 두 개의 포인터를 사용해 데이터를 관리한다.
- 원형 버퍼, 원형 큐, 링 버퍼가 있다.
추상화를 활용한 코드 개선
- 프로그램을 시작할 때마다 이전 정보가 사라진다.
- C에서는 파일 추상화를 사용해 이를 저장할 수 있다.
- C는 파일에서 입력을 받는 코드를 장치에서 입력을 받는 부분에 쓸 수 있다.
- 하지만 자바스크립트는 다른 인터페이스의 다른 코드를 사용해야 한다.
- 즉, 자바스크립트는 개발자에게 추상화를 넘기지 않는다.
런타임 라이브러리와 표준 입출력
- C 프로그램을 실행하려면 컴파일 후에 코드에서 사용하는 다른 코드를 링크해야 한다.
- 파일 디스크립터 : 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
- 파일 포인터 : 버퍼링이나 파일 관리에 필요한 데이터 구조를 가리킨다.
- stdio는 표준 입력, 출력, 오류 출력 3가지 파일 포인터를 제공한다.
- 표준 오류 출력 같은 경우에는 버퍼를 사용하지 않는다.
- 버퍼는 내보내지 않는한 프로그램 종료될 때까지도 표시되지 않을 수도 있기 때문이다.
버퍼 오버플로
- 버퍼에는 한 글자와 문자열 끝을 표현하는 NUL 터미네이터 문자가 저장될 공간이 있다.
- 버퍼는 고정 길이지만 버퍼가 보유할 수 있는 것보다 더 많은 데이터를 쓰는 경우 인접한 메모리 공간으로 넘쳐서, 그 곳의 데이터를 덮어쓰거나 프로그램 충돌 혹은 악용 가능한 상태를 유발할 수 있다.
- C에서는 버퍼 경계를 검사하는 fgets 함수를 추가했다.
C 프로그램
- 프로그램에서 필요한 라이브러리를 가져온다.
- 자바스크립트 버전에서는
div
를 사용했지만, C에서는 구조체를 사용한다. - 메모리 할당을 돕는 함수를 정의한다.
This post is licensed under CC BY 4.0 by the author.