컴퓨터 시스템과 운영체제 (명품_운영체제 Ch 02)
컴퓨터 시스템
-
컴퓨터 시스템은
응용소프트웨어 층,운영체제 층,컴퓨터 하드웨어 층으로 3가지 요소로 이루어져 있다 - 컴퓨터 하드웨어
- CPU(Central Processing Unit)
- 기계 명령을 실행하는 중앙처리 장치, 메모리에 적재된 프로그램을 실행
- 메모리(Memory)
- CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간
- 캐시 메모리(Cache Memory)
- 현대 컴퓨터에서 CPU 내부에 존재하는 메모리(온 칩 캐시(on-chip cache))로 실행될 데이터를 메모리에서 복사하여 CPU가 읽어 실행할 수 있게 함
- CPU와 메모리의 처리속도 차이로 인해 발생하는 CPU의 대기시간을 줄이기 위함
- 용량이 매우 작기 때문에 복사되는 데이터는 극히 일부분임
- 기타 장치들(Device)
- 입출력 장치(키보드, 마우스, 네트워크 장치 등)와 저장 장치(디스크,SSD 등)들이 있음
- 버스(Bus)
- 컴퓨터 하드웨어들이 데이터를 주고받기 위해 디지털 신호가 지나다니는 통로
- 목적에 따라 시스템, 입출력 버스로 나뉜다
- 지나가는 신호에 따라 주소, 데이터, 제어 버스로 나뉜다ㅈ
- 시스템 버스(System bus)
- CPU, 캐시 메모리, 메모리 등 빠른 H/W 사이의 신호를 전송하기 위한 버스
- 입출력 버스(I/O bus)
- 상대적으로 느린 입출력 장치들로의 입출력 데이터를 전송하기 위한 버스
- CPU(Central Processing Unit)
- 컴퓨터 시스템의 구성

@ 현대에는 CPU에 NorthBridge의 기능이 내장되고 PCH가 SouthBrige의 역할을 대체하면서 사라짐
CPU와 메모리 관계
- CPU와 메모리 사이의 동작 방식
- 특정 주소에서의 데이터 처리가 필요함
-> CPU가 주소 버스를 통해 메모리에게 주소 전달하고 제어 버스를 통해 해당 작업의 종류에 따라 지시(읽기,쓰기)
-> 메모리는 주소를 전달받고 지시에 따라 데이터 버스를 활용해 CPU에게 데이터 전달 혹은 새로운 데이터 저장
- 특정 주소에서의 데이터 처리가 필요함
-> CPU가 주소 버스를 통해 메모리에게 주소 전달하고 제어 버스를 통해 해당 작업의 종류에 따라 지시(읽기,쓰기)
- 32비트 CPU란?
- 32개의 주소선을 가진 CPU(각 1비트)
- CPU가 액세스 할 수 있는 메모리의 범위는?
- n = 주소선 갯수 일 때, 2^n 바이트
- 2^32 바이트 = 4GB (2^32개의 주소 공간, 공간 하나당 1바이트, 2^30 바이트 = 1GB, 1GB x 2^2 = 4GB)
CPU의 레지스터(Register)
- PC(Program Counter) : 다음에 실행할 기계 명령의 메모리 주소를 저장하는 레지스터
- IR(Instruction Register) : 실행하기 위해 메모리에서 읽어 온 명령이 저장된 레지스터
- SP(Stack Pointer) : 스택 영역의 꼭대기 메모리 주소를 저장하는 레지스터
스택(Stack)
- 운영체제는 프로그램 실행 시 4개의 공간을 제공 (메모리 영역)
- 코드공간
- 프로그램 코드가 적재되는 메모리 공간
- 데이터 공간
- 전역 변수 적재
- 힙(heap) 공간
- 실행 중 동적 저장 데이터를 위함
- 스택(stack) 공간
- 함수 호출 시 매개변수, 지역 변수, 함수의 복귀 주소 등 저장
- 코드공간
컨텍스트(Context)
- 프로세스의 실행 상태를 나타내는 CPU 레지스터들의 값
- PC, SP, 범용 레지스터 등
컨텍스트 스위칭(Context Switching)
- 실행중인 프로그램의 컨텍스트를 저장해두고 다른 프로그램의 컨텍스트를 CPU로 옮기는 것
- 컨텍스트 정보들은 PCB에 저장되어있음

운영체제
하드웨어 자원을 관리하고, 응용 프로그램와 하드웨어 사이를 중재하는 인터페이스
- 컴퓨터 시스템의 계층 구조

- 계층 간의 독립성
- 각각의 계층에서 작업이 진행될 때 다른 계층의 영향을 받지 않기 위해
- 운영체제가 하드웨어를 독점적으로 관리하지 않으면
- 응용프로그램이 다른 응용프로그램이 적재된 메모리를 덮어쓰거나, 생성한 파일을 삭제하거나, 커널이 적재된 메모리를 엑세스하거나.. 등등의 문제가 발생
- 기능
- 프로세스와 스레드 관리
- 메모리 관리
- 파일, 파일 시스템 관리
- 장치 관리
- 사용자 인터페이스
- 네트워킹
- 보호 및 보안
- 구성 요소
- 커널(Kernel)
- 프로세스 관리, 메모리 관리, 저장장치 관리 등 운영체제의 핵심적인 기능을 모아놓은 부분
- 부팅 후 메모리에 적재
- 시스템 콜을 통해 응용프로그램과 상호작용
- 인터페이스(Interface)
- 대표적으로 GUI와 CLI가 있음
- GUI
- 그래픽 요소를 이용한 시스템과의 상호작용
- ex) 아이콘, 파일탐색기, 제어판 등
- CLI
- 명령어를 통한 시스템과의 상호작용
- CMD, Terminal 등
- 시스템 콜(System call)
- 커널과 응용프로그램 사이의 인터페이스
- 응용프로그램에서 커널 코드를 직접 호출하는 것이 아닌 시스템 호출 함수를 통해 요청 ex) fork(), exit(), open(), write() 등
- 인터럽트(Interrupt)
- 커널과 하드웨어 사이의 인터페이스
- 입/출력 장치 혹은 다른 예외황이 발생하여 처리가 필요할 때, CPU에게 알려 요청을 처리하는 코드(인터럽트 서비스 루틴(ISR))를 실행하도록 한다
- 드라이버(Driver)
- 운영체제와 하드웨어들과의 통신을 위한 인터페이스를 담당하는 소프트웨어
- 커널 코드가 장치와 무관하게 사용될 수 있도록 해주는 역할
- 새로운 장치가 연결되었다고 해서 커널 코드를 새로 작성하거나 수정할 필요가 없다
- 일반적으로 커널 공간에 적재되었지만, 드라이버 오류 발생 시 시스템 전체에 문제가 생기는 경우가 있어서 요즘은 사용자 공간에서 실행되는 것들도 있다

- 커널(Kernel)
사용자 공간과 커널 공간
운영체제는 CPU로 엑세스할 수 있는 전체 주소 공간을 사용자 공간과 커널 공간으로 분리하여 운영한다
- 사용자 공간(User Space)
- 응용프로그램 적재, 변수 생성 등
- 사용자 공간의 크기 = 응용프로그램의 최대 크기
- 커널 공간(Kernel Space)
- 커널 모듈 적재, 커널 함수 실행 시 필요한 스택 공간 등
- 분리 이유
- 응용프로그램으로부터 커널 코드와 데이터를 보호하기 위함
- 시스템 호출을 통해서만 엑세스 가능
- 가상 주소 공간
- 사용자, 커널 공간은 실제 메모리 공간이 아닌 가상 주소 공간이다
- 응용프로그램마다 주소선 갯수와 운영체제에 따라 다른 크기의 사용자, 커널 공간이 존재하는 가상 주소 공간을 부여받는다
- CPU의 MMU(Memory Management Unit)가 가상 주소를 실제 물리적 메모리 주소로 변환해 사용함
- 사용자 공간은 프로그램의 고유 공간이며, 커널 공간은 다른 프로그램과 공유한다

매핑 과정에 응용프로그램들의 주소 공간이 충돌하지 않을까?
- 가상 주소가 같은 번지로 같더라도 서로 다른 프로세스는 독립적으로 동작
- 응용프로그램은 사용자 공간을 커널 공간에 있는 고유한
매핑 테이블을 통해 물리 메모리 공간으로 매핑하여 사용한다. - 커널 공간은 커널이 존재하는 동일한 물리주소로 매핑되기에 각각의 프로세스들은 포인터 형식으로 접근하여 하나의 커널 공간을 공유한다

CPU의 사용자 모드와 커널 모드
응용프로그램 코드는 사용자 모드에서 실행되고, 커널 코드는 커널 모드에서 실행된다
- 운영체제에 의해 프로그램 실행 시 사용자 모드로, 시스템 콜 사용 시 커널 모드로 전환
-
믿을 수 없는 응용프로그램 코드를 상대로 커널 코드와 데이터를 보호하기 위함

- 커널 모드로 전환이 일어나는 경우
- 시스템 호출(System call)
- 하드웨어와의 엑세스는 커널 코드를 통해서만 가능하기 때문
- 시스템 콜이 끝나면 CPU의 기계 명령에 의해 사용자 모드로 변경
- 인터럽트(Interrupt)
- 인터럽트 서비스 루틴은 커널 공간에 있다
- 인터럽트 발생 시 자동으로 커널 모드로 바뀌며 인터럽트 서비스 루틴을 실행
- 시스템 호출(System call)
- 특권 명령
- I/O 명령
- Halt 명령
- 인터럽트 플래그 켜고 끄기
- 타이머 설정
- 컨텍스트 스위칭
커널은 프로세스가 아니다
커널은 시스템 관리 기능을 위한 함수와 데이터의 집합
- 프로세스
- 사용자 모드에서 실행됨
- 제한된 자원만 접근 가능
- 각자의 가상 주소 공간을 사용
- 교유한 스택이나 힙에 데이터를 저장
- 커널
- 커널 모드에서 동작함
- 모든 하드웨어 자원에 접근 가능
- 물리 메모리의 커널 공간에서 실행
- 스택이나 힙을 가지지 않음(프로세스가 커널 모드를 사용하기 위해서 만들어지는 스택은 커널 내에 할당됨)
라이브러리(Library)
미리 함수들을 작성하여 컴파일하고 바이너리 형태로 만든 파일
- 사용자 모드에서 실행되며 사용자가 작성한 함수들과 함께 사용자 공간에 적재된다
- 표준 라이브러리
- 같은 언어에 대해서 OS나 HW에 상관없이 이름과 사용법이 같음
- 시스템 호출 라이브러리(커널 API)
- OS마다 다르다
- 기계 명령을 이용해 시스템 호출을 일으켜 커널 함수를 실행함
함수 호출과 시스템 호출
- 함수 호출의 과정
- 같은 주소 공간의 한 함수가 다른 함수를 실행하는 것(시스템 호출 라이브러리 함수를 호출하는 것도 함수 호출이다)
- 사용자 모드에서 실행됨
- 과정 : 실행될 함수는 실행 후 돌아올 주소와 실행을 통해 전달할 매개변수 값들을 스택에 저장
-> 실행될 함수의 주소로 이동 후 코드 실행
-> 종료 후 함수를 호출한 주소로 돌아옴
- 시스템 호출의 과정
- CPU모드를 커널 모드로 바꾸고 커널 공간의 정해진 주소에 있는
시스템 호출 핸들러코드를 실행하는 것 - 커널 모드에서 실행됨
- 과정 : 응용프로그램에서 시스템 호출 라이브러리 함수를 실행(표준 라이브러리 함수를 통해 시스템 호출 라이브러리 함수를 호출 할 수도 있음)
-> 해당 함수가 시스템 호출 CPU 명령을 실행
-> 커널 모드로 전환되고 CPU의 모든 레지스터 값을커널 스택에 저장하며 그 안에 존재하는 커널 함수의고유 ID(시스템 호출 번호)가시스템 호출 핸들러에게 전달 됨
-> 핸들러가 커널 내에 존재하는시스템 호출 표에서 ID값을 인덱스로 하여 필요한 커널 함수의 주소를 찾아낸다
-> CPU가 핸들러를 통해 커널 함수를 실행
-> 작업이 종료되면 커널 스택에 저장해둔 레지스터 값들을 CPU 레지스터에 복귀시킨다
-> 호출 함수로 복귀하는기계 명령(sysret 등)을 실행하고 사용자 모드로 전환되며 호출 함수 위치로 돌아간다.
-> 읽은 값을 호출한 함수에게 리턴한다
- CPU모드를 커널 모드로 바꾸고 커널 공간의 정해진 주소에 있는
- 시스템 호출을 일으키는 기계명령
- CPU마다 시스템 호출을 일으키는 기계 명령을 두고 있다
- ‘시스템 호출 CPU 명령’ 혹은 ‘트랩 명령’이라고 부른다

시스템 호출의 비용
표준 라이브러리 함수를 통해 파일 읽기 vs 시스템 호출 라이브러리 함수를 통해 파일 읽기
- 표준 라이브러리 함수의 파일 읽기 과정
- 표준 라이브러리 내에 입력 버퍼가 존재한다
-> 표준 라이브러리 함수가 버퍼를 확인하고, 시스템 호출 라이브러리 함수를 호출한다
-> 처음 시스템 호출 라이브러리 함수를 사용할 때 디스크 블록 크기 만큼 읽도록 요청한다
-> 시스템 호출 라이브러리 함수가 커널 함수에게 디스크 블록 크기 만큼 읽도록 요청한다
-> 커널 함수는 요청만큼 파일을 읽어 입력 버퍼에 저장한다
-> 이후 응용프로그램이 요청하는 데이터는 버퍼에서 즉시 제공한다(시스템 콜 X)
- 표준 라이브러리 내에 입력 버퍼가 존재한다
- 시스템 호출 라이브러리 함수의 파일 읽기 과정
- 시스템 호출 라이브러리 함수를 통해 시스템 호출이 이루어짐
-> 커널 함수가 요청한 만큼 파일을 읽어 전달함
-> 다음 요청 때도 똑같은 과정으로 요청한 만큼 전달함
-> 요청할 때마다 시스템 콜
- 시스템 호출 라이브러리 함수를 통해 시스템 호출이 이루어짐

인터럽트
특정 상황 발생 시 CPU에게 하던 일을 멈추고 처리를 요청하는 방법
- 인터럽트 과정
- CPU가 열심히 일을 하고 있다
-> 특정 상황이 발생하여 CPU에게 알린다
-> CPU는 프로그램의 실행을 멈추고 현재 레지스터 상태를 PCB에 저장하고 돌아올 주소를 PC에 저장한다
-> 인터럽트 벡터를 읽고ISR(Interrupt Service Routine)주소값을 얻는다
-> 해당 주소로 점프 후인터럽트 서비스 루틴을 실행한다
-> 종료 후 레지스터를 복원하고 인터럽트가 해제되며 이전 위치로 복귀한다
- CPU가 열심히 일을 하고 있다
- 인터럽트의 종류
- 하드웨어 인터럽트
- 입출력 장치 (키보드 입력, 마우스 이동 및 클릭)
- 소프트웨어 인터럽트
- CPU의 기계 명령 (시스템 호출 명령)
- 하드웨어 인터럽트
- 인터럽트 벡터
- 인터럽트 서비스 루틴의 주소를 인터럽트 별로 보관하고 있는 테이블
- 인터럽트 서비스 루틴(인터럽트 핸들러)
- 인터럽트별로 처리해야할 내용이 프로그래밍 되어 있음
- 디바이스 드라이버나 커널 코드에 존재한다
인터럽트는 다중프로그래밍의 핵심이다
- 입출력으로 인한 CPU의 대기시간을 줄일 수 있다
- 입출력이 필요한 프로세스를 중단 상태로 만든다
-> CPU가 다른 프로세스를 실행하게 한다
-> 인터럽트를 통해 입출력 완료 신호를 보낸다
-> CPU가 돌아와서 해당 신호를 처리한다
- 입출력이 필요한 프로세스를 중단 상태로 만든다
- 입출력이 완료될 때까지 CPU가 신경쓰는
폴링(polling)과 반대된다
총 정리
- 사용자나 응용프로그램이 접근하는 공간은 모두
가상 공간이다- 매핑 테이블을 통해 실제 물리 메모리 공간의 주소로 매핑된다
- 하드웨어를 사용하는 모든 작업은
커널을 통해서 이루어진다 - 커널을 사용하기 위해서는 CPU가
커널 모드가 되어야 하고 커널 모드로의 전환은시스템 콜혹은인터럽트가 발생해야 한다 - 커널을 사용한다는 것은 커널 공간을 구성하는
커널 함수를 사용하는 것이다 - 시스템 콜, 인터럽트 과정을 이해하자
댓글남기기