4장 프로그램의 구조와 실행 [운영체제와 정보기술의 원리]

이태혁·2020년 10월 10일
0
post-custom-banner

🦊 1. 프로그램의 구조와 인터럽트

  • 컴퓨터 프로그램의 내부 구조는 함수들로 구성되어 있음
  • 프로그램의 주소 영역은 3가지
    • 코드 영역 : 작성한 함수들의 코드가 CPU에서 수행할 수 있는 기계어(machine instruction) 형태로 변환되어 저장되는 부분
    • 데이터 영역 : 전역 변수등 프로그램이 사용하는 데이터를 저장하는 부분
    • 스택 영역 : 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 데에 사용되는 공간
      • 예를들어 메인함수를 처리하다가 A함수를 만나서 처리하러 갔다가 다시 메인함수로 돌아와야 되는데 이 정보가 스택에 저장되어 있음
  • 인터럽트의 동작 원리도 함수의 호출과 비슷하다

🦊 2. 컴퓨터 시스템의 작동 개요

  • 프로그램 카운터(Program Counter: PC): CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터
  • 프로그램 카운터가 메모리 주소 중 운영체제가 존재하는 부분을 가르키면 -> 커널모드
  • 프로그램 카운터가 메모리 주소 중 사용자 프로그램을 가르키면 -> 유저모드

🦊 3. 프로그램의 실행(뒷부분 다시 읽기)

  • 프로그램이 실행되고 있다.
    1 디스크에 존재하던 실행파일이 메모리에 적재된다
    2 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태다

  • 운영체제도 프로그램처럼 각각 스택, 데이터, 코드역영이 존재한다.
  • 커널의 코드 영역: CPU, 메모리 자원관리, 편리한 인터페이스 제공, 시스템 콜, 인터럽트 처리에 관한 코드들이 저장
  • 커널의 데이터 영역: 각종 자원을 관리하기 위한 자료구조가 저장
  • 커널의 스택 영역: 함소호출시 복귀 주소 저장용으로 사용함
    • 차이점은 수행 중인 프로세스마다 별도의 스택을 두어 관리한다.
    • 프로그램에서 시스템콜로 운영체제에서 CPU를 사용한뒤에 프로그램으로 돌아가는 것이 아니라
      커널 내의 주소가 되기 때문에

      다만 여기서 한 가지 유의할 점은 프로그램 내의 함수호출 시 해당 프로그램의 스택에 복귀 주소를 저장하지만, 시스템 콜이나 인터 럽트 발생으로 CPU의 수행 주체가 운영체제로 바뀌는 순간에는 직전에 수행되던 프로그램의 복귀 정보를 스택이 아닌 PCB 에 저장한다는점이다 이때 커널 역시 함수구조로이루어져 있으므로, 커널의 코드가 수행되는 도중에 이루어지는 함수호출은 커널스택을 사용하게 되는 것
      이다 한편 커널스택은 프로세스마다 별도로 두고 있어 , 커널 내에서 이루어지는 함수호출은 직전에 CPU를 가지고 있던 프로세스의 커널스택을 사용하게된다.

🦊 4. 사용자 프로그램이 사용하는 함수

  • 프로그램이 사용하는 함수

    • 사용자 정의함수 : 사용자가 만든 함수
    • 라이브러리 함수 : 누군가 작성해놓은 함수
    • 커널 함수 : 운영체제 커널 코드에 정의된 함수
  • 사용자 정의함수와 라이브러리 함수는 모두 그 프로그램의 코드 영역에 기계어 명령 형태로 저장

    • 해당 프로세스의 주소 공간에 포함

    • 함수호출 시에도 자신의 주소공간에 있는 스택을 사용

    • 커널함수 = 시스템 콜 함수(운영체제 서비스 요청) + 인터럽트 처리 함수

🦊 5. 인터럽트

  • 원칙적으로 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 않는다
    • 먼저 발생한 인터럽트가 데이터를 변경 중인데 뒤따라오는 인터럽트가 데이터를 또 변경해버리면 첫번째 인터럽트에 결괏값이 의도하지 않은대로 바뀔 수 있기 때문에
  • 시급한 인터럽트의 경우 예외에 있을 수 있음(우선순위가 높은 인터럽트를 먼저 처리)

🦊 6. 시스템 콜

  • 모든 프로그램은 독자적인 주소공간(메모리)를 갖고 있으며 함수를 호출하는 경우 자신의 주소 공간내에서 호출이 이루어짐
  • 시스템 콜은 그 공간밖을 호출함
    예)
  1. 사용자 프로그램이 CPU에서 명령을 수행하던 중 입출력이 필요해서 시스템 콜로 커널의 함수를 호출
  2. 이때 CPU에게 제어권을 넘기기 위해 인터럽트 라인이 세팅
  3. CPU는 다음 ㅁ여령전에 인터럽트가 발생했는지 점검
  4. 인터럽트 인지, 수행중인 사용자 프로그램을 잠시 멈춘후 CPU의 제어권을 운영체제로 이양
  5. CPU는 인터럽트 라인에 의해 입출력요청 인터럽트임을 인지
  6. 해당 서비스루틴으로 이동해 작업 수행
  7. CPU는 디스크 컨트롤러에게 파일 입출력 지시
  8. CPU는 다른 프로세스에게 CPU 제어권을 넘김
  9. 다른 CPU명령 실행중에 입출력 작업이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜서 입출력작업완료를 알려줌
  10. 이때 발생한 인터럽트는 하드웨어 인터럽트임
  11. 디스크에서 로컬버퍼로 읽어온 처리내용을 컴퓨터 메모리로 복사한 해줌
  12. CPU는 해당 프로세스를 큐에 넣고 CPU의 제어권은 다시 인터럽트 당한 프로세스로 넘어가 하던 작업을 계속 수행(여기 살짝 애매함)

🦊 7. 프로세스의 두 가지 실행 상태

  • 프로세스에서 시스템콜로 커널의 코드를 실행하더라도 이를 프로세스의 실행 상태라고 함(커널의 실행상태라고 하지 않음)
    • 첫 시작은 프로세스에서 시작됐기 때문에
    • 정확히 말하면 '프로세스가 커널모드에서 실행중'이라고 함
profile
back-end, cloud, docker, web의 관심이 있는 예비개발자입니다.
post-custom-banner

0개의 댓글