이 부분은 프로그램 개발자들에게 공통적으로 필요한 기반 지식이예요.
직접적으로 프로그래밍 작성 능력과 관련있는 내용은 아니예요.
하지만 전산 엔지니어로써 기본적으로 알면 여러 분야에서 도움이 되는 내용이예요.
이 책에서는 깊은 내용까지 들어가지 않고 간단히 소개하기로 할게요.
프로그램 생명 주기
실행 상태의 프로그램을 프로세스라 불러요.
따라서 프로그램 생명 주기보다는 프로세스 생명 주기라는 말이 더 적당할거예요.
편의상 프로그램 생명 주기라 할게요.
프로그램은 수행해야 할 코드를 메모리에 로딩(loading)하는 것에서 출발하죠.
로딩은 하드 디스크나 CD 등의 저장 장치에 있는 데이터를 프로그램의 메모리에 옮기는 작업을 말해요.
또한 프로그램전체 영역에서 사용할 수 있는 전역 변수를 위한 메모리를 할당하고 초기화 작업을 수행해요.
그리고 프로그램 시작에 필요한 다른 초기 작업을 수행한 후에 개발자가 정의한 main 함수부터 시작한답니다.
콘솔 응용 프로그램은 시작하면서 표준 입력(stdin)과 표준 출력(stdout)을 여는 작업도 수행해요.
printf 함수를 호출하여 콘솔 화면에 데이터를 출력할 수 있는 이유도 시작하면서 표준 출력을 열어주기 때문이죠.
아시는 것처럼 개발자가 작성한 코드 중에서 제일 먼저 수행하는 코드가 main 함수예요.
이러한 이유로 main 함수를 진입점이라 부르죠.
프로그램은 기본적으로 하나의 코드를 수행하고 난 후에 바로 뒤에 있는 코드를 수행해요.
그런데 함수를 호출하면 호출한 함수를 정의한 코드를 수행하고 수행 후에는 호출한 코드 바로 뒤에 있는 코드를 수행한답니다.
이와 같이 동작이 가능한 이유는 함수를 호출하는 코드를 만나면 다음 수행 코드를 스택에 저장해 두었다가 피호출 함수가 끝나면 스택에 저장해 두었던 코드를 꺼내와서 그 위치부터 수행하기 때문이예요.
참고로 스택은은 LIFO(Last In First Out) 방식으로 자료를 보관하는 저장소예요.
스택은 LIFO 방식이어서 최근에 저장한 데이터를 먼저 꺼내줘요.
프로그램은 main 함수의 return 문이나 main 함수의 종료 블록 }을 만나면 끝나요.
물론 프로그램 중간에 종료하는 exit 함수를 호출하거나 비정상적인 상황이 발생하여 끝날 수도 있어요.
콘솔 응용 프로그램은 프로그램이 정상적으로 끝날 때 열려져 있는 모든 파일을 닫아주는 등의 후처리 작업을 수행해요.
자세한 사항은 Unix System Programming에 관한 책을 통해 학습해 보세요.