티끌모아 태산

프로그램의 구조와 실행 본문

CS 지식/운영체제

프로그램의 구조와 실행

goldpig 2023. 7. 28. 12:26
728x90

프로그램의 구조

  우리가 사용하는 컴퓨터 프로그램은 일반적으로 함수들로 이루어져 있다. 프로그램은 이런 함수가 수행되는 중에 다른 함수를 호출하고, 호출된 함수의 수행이 완료되면 다시 원래 호출했던 함수의 위치로 돌아가 프로그램을 계속 실행하게 되는 원리로 동작하게 된다. 한편, 프로그램이 실행되기 위해서는 프로그램의 주소 영역이 메모리에 올라와 있어야하는데, 이때 프로그램의 주소 영역은 크게 코드(Code), 데이터(data), 스택(stack) 영역으로 구분된다. 

  • 코드: 우리가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 곳.
  • 데이터: 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
  • 스택: 함수가 호출 될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터임시로 저장하는 데에 사용되는 공간이다. 

  일반적으로 프로그램 내에서 발생하는 함수 호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 중 스택 영역에 임시로 보관된다. 하지만 인터럽트 때문에 CPU의 제어권이 넘어간 위치는 운영체제가 관리하는 프로세스 제어 블럭(PCB)에 저장된다. PCB는 인터럽트가 발생한 시점에서 그 프로그램의 어느 부분까지 수행했는지를 즉, 실행상태를 저장하며 인터럽트 처리 후 PCB에 저장된 주소로 복귀하여 원래 수행하던 일을 계속 진행한다. 

요약하면, 프로그램이 자기 자신의 코드내에서 함수호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 사용하고, 시스템 콜이나 인터럽트(CPU의 수행 주체가 운영체제로 바뀜) 등으로 운영체제의 코드가 실행되는 중에 함수호출이 발생할 경우 복귀 정보를 사용자 스택이 아닌 PCB에 저장된다.

⭐️시스템 콜

  사용자 프로그램 즉, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스 입니다. 시스템 콜은 함수 호출이지만 자신의 주소 공간에서 호출이 아닌 커널 영역의 함수 호출을 위해 사용한다. ex) 디스크 파일 입출력, 키보드 입출력 등. 시스템 콜은 프로세스 제어, 파일 조작, 장치 관리, 등 여러 유형이 있다.

한편, 프로그램이 CPU를 할당 받고 명령을 수행하다가 CPU의 제어권이 넘어가는 경우는 크게 다음과 같다

  • 타이머에 의해 인터럽트가 발생하는 경우: 타이머는 특정 프로그램이 CPU를 독점적으로 사용하는 것을 방지하기 위한 하드웨어로 CPU 할당 시간이 만료되면 인터럽트를 발생시킨다. 따라서 타이머는 여러 프로세스가 CPU를 나누어 사용하는 시분할 시스템을 위한 필수적인 요소이다.
  • 입출력 요청을 위해 시스템 콜을 하는 경우: 사용자 프로그램이 디스크에서 파일 데이터를 읽어오는 등의 입출력 요청을 위해 시스템 콜을 하는 경우, 시간이 오래 걸리는 입출력 작업이 완료되기까지 그 프로세스에게 CPU를 다시 할당하더라도 당장 다음명령을 수행하지 못하는 경우가 대부분이므로 다른 프로세스에게 CPU를 이양하게 된다. 

  하나의 프로세스가 시작되어 완료되기까지 프로세스 자신의 주소 공간에 있는 코드만 실행되는 것이 아니라 커널의 주소 공간에 있는 코드도 함께 번갈아 가면 실행된다. 이는 프로그램이 사용자 함수정의나 라이브러리 함수뿐만 아니라 입출력 시스템 콜 등을 통해 운영체제 커널의 함수도 호출하여 실행하기 때문이다. 따라서 프로세스는 일반적으로 두가지 실행상태를 갖게 된다.

  1. 사용자 모드(User mode): 사용자가 접근할 수 있는 영역, 유저 애플리케이션 코드가 실행
  2. 커널 모드(Kernel mode): 모든 하드웨어에 대한 접근 가능, 모든 주소 공간에 접근 가능, 프로세스 제어, 파일 조작, 장치(I/O, 타이머) 관리 등의 명령을 할 수 있다. 유저모드 보다 더 높은 권한이 필요함.

⭐️사용자 모드와 커널 모드로 나누는 이유? 시스템에 중요한 영향을 미치는 연산은 커널 모드에서만 실행 가능하도록 함으로써 하드웨어의 보안을 유지하기 위함.

 

요약하면, 프로그램이 시작되어 완료되기 까지 다양한 함수호출을 하며 실행되는데, 이를 사용자 모드와 커널 모드의 실행 상태로 구분 지을 수 있다. 프로그램이 사용자 정의 함수나 라이브러리 함수를 호출할 경우 모드의 변경 없이 사용자 모드에서 실행이 지속되고, 시스템 콜을 하는 경우에는 사용자 모드에서 커널모드로 진입해 커널의 주소 공간에 정의 된 함수를 실행하게 된다. 이때, 시스템 콜의 실행이 완료되면 다시 사용자 모드로 복귀해서 시스템 콜 이후의 명령들을 수행하게 된다. 프로그램의 실행이 끝날 때에는 커널 모드로 진입해 프로그램을 종료한다.

 

추가 내용

⭐️부팅이란? PC에 전원이 들어온 후 운영체제가 실행되기 전까지의 과정입니다. 리눅스 부팅 단계는 다음과 같습니다.

  1. 전원 공급
  2. BIOS 단계: ROM에 탑재된 BIOS가 키보드나 스크린의 부팅에 필요한 하드웨어의 각 장치들을 인식하고 초기화 하는 단계 즉, 외부 장치들이 부팅될 수 있도록 장치들을 인식하고 초기화 하는 단계
  3. 부트로더 단계
  4. 커널 로딩
  5. init 프로세스

⭐️파일 시스템이란? 컴퓨터에서 파일을 쉽게 접근할 수 있도록 관리하는 체제를 말합니다.

⭐️CISC(Complex)와 RISC(Reduced)의 차이는 무엇인가? CISC는 RISC에 비해 연산에 처리되는 복잡한 명령어들을 탑재하고 있기 때문에 전력 소모가 크고 속도가 느립니다. 반면 RISC는 CISC에 비해 하드웨어가 간단한 대신 명령어들을 조합하기 때문에 소프트웨어가 복잡해 질 수 있습니다. 그러면 RISC가 단순하고 빠른 구조인데 왜 CISC를 사용하는가? 이미 많은 프로세스가 CISC로 구축되어 있어서 모두 RISC로 변경하기에는 많은 이용이 소모되고 호환성이 RISC보다 높습니다. 

⭐️캐시와 레지스터의 차이점은 무엇인가? 캐시는 CPU와 별로로 있는 공간이며. 메인 메모리와 CPU간의 속도 차이를 극복하기 위한 것. 레지스터는 CPU 안에서 연산을 처리하기 위하여 데이터를 저장하는 공간.

728x90

'CS 지식 > 운영체제' 카테고리의 다른 글

프로세스(Process)(1)  (0) 2023.07.29
컴퓨터 시스템의 동작 원리  (0) 2023.07.26
운영체제 개요  (0) 2023.07.21