[CSAPP] Chapter08.

Y_Y·2023년 6월 19일
0

CSAPP

목록 보기
4/4

CSAPP 8장

제어흐름 (Control Flow)

일반적인 컴퓨터는 프로그램이 시작하면 명령어들이 순차적으로 진행이 되고 끝나게 한다.
이러한 과정 속에서 CPU는 명령어를 한 번에 한 개씩 수행할 수 있는데 CPU의 Control Flow라고 한다.

  • Control Flow가 바뀌는 상황
    일반적으로 "점진적인"순서로 인스트럭션이 메모리에 나란히 있지 않은 경우 발생하는데, jump, call과 같은 명령어를 사용할 때 발생한다.

프로그램은 디스크로부터 데이터를 요청하며, 그 후에 데이터가 준비되었다는 통지를 받을 때까지 잠든 상태에 들어간다 Sleep list 자식 프로세스를 생성하는 부모 프로세스는 자신의 자식이 종료할 때 통지를 받아야 한다.
-> 자식 프로세스가 종료될 때까지 부모 프로세스는 대기상태

  • 예외적인 제어흐름(Exceptional Control Flow)

ECF은 컴퓨터 시스템의 모든 수준에서 발생한다. 예를 들어,
하드웨어 수준에서 검출되는 이벤트들은 예외 핸들러로 제어흐름을 발생시킨다.
운영체제 커널수준의 문맥전환(Context Switching)을 통해서 사용자 프로세스에서 다른 프로세스로 제어가 이동한다.
응용수준에서 프로세스는 시그널을 수신하는 곳에 있는 시그널 핸들러로 제어를 급격히 이동하는 다른 프로세스로 시그널을 보낼 수 있다.
ex) Running 중인 프로그램에 ctrl + c 종료 발생

Applicationsystem call이라고 알려진 ECF의 한 가지 형태를 사용해서 운영체제로부터 서비스를 요청한다.
ex) 데이터를 디스크에 쓰거나, 네트워크에서 데이터를 읽거나, 새로운 프로세스를 만들거나, 현재 프로세스를 종료시키는 일

ECF는 컴퓨터 시스템에서 동시성을 구현하는 기본 메커니즘이다.
ex) 응용프로그램의 실행을 가로채는 예외처리 핸들러, 실행을 가로채는 시그널 핸들러

Application이 운영체제와 상호작용 하는 것들은 모두 ECF를 중심으로 돌아간다.

interrupt, System call 참고

8.1 예외상황

예외상황은 어떤 프로세서 상태의 변화에 대한 대응으로, 제어흐름의 갑작스런 변화이다.

프로세서는 현재 어떤 명령어를 실행하고 있을 때 상태 변화가 일어나는데, 상태 변화는 이벤트라고 알려져있다.
이벤트는 가상메모리 페이지 오류, 산술 오버플로우, divide by zero와 같은 경우는 현재 인스트럭션과 관련이 있지만, 시스템 타이머가 정지하거나, I/O요청이 안료되는 경우는 그렇지 않다.

그림과 같이 예외가 발생할 경우 세가지 중의 한 가지가 발생한다.
1. 핸들러는 제어를 현재 인스트럭션으로 돌려준다. 이 인스트럭션은 이벤트가 발생했을 때 실행되고 있던 인스트럭션을 말한다.
2. 핸들러는 제어를 다음 인스트럭션으로 돌려주는데, 이인스트럭션은 예외상황이 발생하지 않았더라면 다음에 실행되었을 인스트럭션이다.
3. 핸들러는 중단된 프로그램을 종료한다.

8.1.1 예외처리

8.1.2 예외의 종류

4가지 : 인터럽트, 트랩(트랩과 시스템 콜), 오류, 중단


인터럽트, 트랩과 시스템 콜

  • 인터럽트 (interrupt)
    프로세서 외부에 있는 입출력 디바이스로부터의 시그널의 결과로 비동기적으로 발생한다.

  • 트랩 (trap)과 시스템 콜 (system call)
    트랩은 의도적인 예외상황으로 어떤 인스트럭션을 실행한 결과로 발생한다.
    트랩의 가장 중요한 사용시스템 콜이라고 알려진 사용자 프로그램과 커널 사이의 프로시저와 유사한 인터페이스를 제공하는 것이다.


오류, 중단

  • 오류 (fault와 error는 다르다.)
    오류는 핸들러가 정정할 수 있는 가능성이 있는 에러 조건으로부터 발생한다. 오류가 정정할 수 있다면 원인 인스트럭션으로 돌아가서 재실행 시킨다.
    만약 그렇지 않다면 abort루틴으로 리턴해서 응용프로그램을 종료시킨다.
  • 중단
    중단은 DRAM이나 SRAM이 고장날 때 발생하는 패리티 에러와 하드웨어 같은 복구할 수 없는 치명적인 에러에서 발생한다. 중단 핸들러는 바로 종료하는 중단루틴으로 넘겨준다.

인스트럭션은 컴퓨터에서 실행되는 명령어들을 나타내며 프로세서에게 수행해야할 작업을 지시한다. 프로세서(CPU)는 인스트럭션을 해석하고 실행하는 역할을 수행하는데, 트랩은 프로세서의 실행 결과(인스트럭션->프로세서)로 인해 발생하며, 커널 내부 및 인터럽트 처리 루틴으로 제어를 전달한다. 시스템 콜은 커널모드에서 돌아가며 프로세스가 운영체제의 서비스를 요청하기 위해 사용하는 인터페이스이다.

8.2 프로세스

프로세서의 고전적인 정의는 실행 프로그램의 인스턴스이다.

시스템 내의 각 프로그램은 어떤 프로세스의 문맥(context)에서 돌아간다.
문맥은 프로그램이 정확하게 돌아가기 위해서 필요한 상태로 구성된다.
ex) 메모리에 저장된 프로그램 코드와 데이터, 스택, 범용 레지스터의 내용 등등

프로세스가 application에 제공하는 주요 추상화 2가지

  • 우리의 프로개름이 프로세서를 혼자서 사용한다는 착각을 제공하는 독립적 논리 제어 흐름
  • 우리의 프로개름이 혼자서 메모리 시스템을 가진다는 착각을 제공하는 사적 주소공간

8.2.1 논리적인 제어흐름

프로세스는 시스템에 서로 다른 여러 프로그램들이 동시적으로 동작하고 있지만, 프로세서를 혼자서 사용한다는 착각을 느끼게 한다.
인스트럭션들에게 일련의 프로그램 카운터(PC) 값들이 대응된다는 것을 관찰할 수 있는데 이러한 PC값들의 배열을 논리적 제어흐름, 논리흐름이라고 부른다.

각 수직 방향의 시간 막대는 프로세스에 대한 논리적 제어흐름의 부분을 나타낸다.

하나의 프로세서를 사용해서 여러 프로세스들이 교대로 돌아간다.

이 프로세서의 하나의 물리적 제어흐름은 각 프로세스에 대해서 한 개씩 세 개의 논리흐름으로 나누어진다.
각 프로세스는 자신의 흐름의 일부분을 실행하고 나서 다른 프로세스들로 순서를 바꾸어 실행하는 동안 선점된다.

8.2.2 동시성 흐름

논리흐름은 여러가지 다른 형태를 갖는다
ex) 예외 핸들러, 프로세스, 시그널 핸들러 등등

자신의 실행시간이 다른 흐름과 겹치는 논리흐름을 동시성 흐름이라고 부르며, 이 두 흐름은 동시에 실행한다고 말한다.
ex) 위 그림에서 (A, B), (A, C)가 그렇다.

프로세스가 다른 프로세스들과 교대로 실행된다는 개념은 멀티태스킹이라고 말하고 타임슬라이싱 이라고도 부른다.
ex) 위 그림에서 A는 두 개의 타임 슬라이스로 구성된다.

만약 두 흐름이 시간상으로 중첩되면, 동일한 프로세서에서 돌아가고 있더라도 이들은 동시적이다 라고 할 수 있다. 하지만 서로 다른 프로세서 코어나 컴퓨터에서 동시에 돌아가고 있다면, 병렬흐름이다.

8.2.3 사적 주소공간

프로세스는 각 프로그램에 자신의 시스템의 주소공간을 혼자서 사용한다는 착각을 불러 일으킨다. 프로세스는 각 프로그램에 자신만의 사적 주소공간을 제공한다.
-> 이 공간의 특정 주소에 연결된 메모리의 한 개의 바이트가 일반적으로 다른 프로세스에 의해서 읽히거나 쓰일 수 없다는 의미로 이 공간은 사적이다.

8.2.4 사용자 및 커널 모드

모드 비트

프로세스가 사용자 모드에서 커널 모드로 진입하는 유일한 방법은 인터럽트, 오류, 트랩 시스템 콜 같은 예외를 통해서이다.

8.2.5 문맥전환(Context Switching)

  1. 현재 실행중인 프로세스의 상태 저장 : 현재 프로세스의 상태 저장
  2. 다음 실행할 프로세스의 상태 복원 : 스케줄링에 따라 실행할 프로세스를 선택하고 저장된 상태를 복원한다. 중단된 지점에서 실행을 계속 할 수 있도록한다.
  3. 제어권 이전 : 선택된 프로세스에세 프로세서의 제어권이 이전된다.

두 개의 프로세스 A, B에 대해서 문맥전환이 일어나는 그림

프로세스 A는 read 시스템 콜을 실행해서 커널에 트랩을 걸 때까지는 사용자 모드로 돌고 있다. 커널의 트랩 핸들러는 디스크 컨트롤러에게 DMA 전송을 요청하며, 디스크 컨트롤러가 데이터를 디스크에서 메모리로 전송을 완료한 후에 프로세서에 인터럽트를 걸도록 디스크를 제어한다.

그래서 중간에 아무것도 안하는 대신에 커널은 프로세스 A에서 B로 문맥전환을 수행한다. 커널은 전환 이전에 프로세스 A를 대신해서 사용자 모드에서 인스트럭션들을 실행하고 있었다는 점을 주의해야 한다.(즉, 별도의 커널 프로세스는 없다.)

profile
남을 위해(나를 위해) 글을 쓰는 Velog

0개의 댓글