컴퓨터 시스템의 계층
- 응용프로그램 계층
- 운영체제 계층
- 컴퓨터 하드웨어 계층
컴퓨터 시스템 계층 구조의 특징
- 사용자는 응용프로그램과 GUI/유틸리티를 통해 컴퓨터를 활용함
- 하드웨어는 운영체제의 배타적/독점적 지배를 받음
- 사용자나 응용프로그램의 하드웨어에 대한 직접 접근은 불허함
> 운영체제를 통해서만 접근 가능함
계층 구조로 보는 운영체제의 기능
- 사용자가 하드웨어를 몰라도 컴퓨터를 사용 가능하게 함
- 응용프로그램과 하드웨어 사이를 중계함
<컴퓨터 하드웨어 구성>
1. CPU(Central Processing Unit)
- 프로그램 코드(기계 명령)를 해석하여 실행하는 중앙처리장치
- 컴퓨터의 핵심 장치
- 전원이 공급될 때 작동 시작, 메모리에 적재된 프로그램을 실행함
2. 메인 메모리(Main Memory)
- 프로그램 코드와 데이터가 적재되는 공간(적재 후 CPU에 의해 실행)
- 보통 RAM(Random Access Memory)을 가리킴
3. 캐시 메모리(Cache Memory)
- CPU와 메인 메모리 사이에 위치하는 소량의 빠른 메모리
- 프로그램 실행 속도를 높이기 위해 사용함
- 온칩 캐시(On-chip): CPU 내부에 만들어진 캐시 (오늘날 대부분의 캐시 형태)
- 오프칩 캐시(Off-chip): CPU 외부에 설치되는 캐시
- CPU는 캐시 메모리를 통해서 프로그램 실행
> 실행하는 프로그램과 데이터는 메모리에 먼저 적재되고 다시 캐시로 옮겨짐
> 캐시는 용량이 작기 때문에 현재 실행할 코드와 데이터의 극히 일부분만 저장함
4. 기타 장치들(Peripheral Devices)
- 키보드, 프린터, 스캐너 등
5. 버스(Bus)
- 하드웨어 사이의 데이터 송수신을 위해 0과 1의 디지털 신호를 전송하는 통로
- 전송 신호에 따른 버스의 종류
> 주소 버스(Address Bus): 주소 신호가 지나다니는 버스
> 데이터 버스(Data Bus): 데이터 신호가 지나다니는 버스
> 제어 버스(Control Bus): 제어 신호가 지나다니는 버스
6. I/O Controllers & Control Unit
- 입출력 장치들을 제어하기 위한 하드웨어
> 입출력 장치에게 명령 전달
> 메인 메모리-입출력 장치, CPU-입출력 장치 사이에 데이터 전달 중계
> DMAC(Direct Memory Access Controller), INTC(Interrupt Controller) 등 포함
CPU Instruction
CPU가 해석하고 실행할 수 있는 기계 명령(Machine Instruction)
- C 언어나 자바의 프로그램 소스 코드와는 다름
- CPU의 명령 개수는 수십~수백개가 존재할 수 있음
- CPU를 설계하는 기업이 명령어들, 명령어 개수, 형태 등을 결정함
> CPU마다 명령 이름, 기계어 코드, 크기, 개수 등이 다름
> CPU 사이에 명령들의 호환성 없음
> 어떤 CPU를 대상으로 컴파일하였는지에 따라 기계어가 달라지므로,
컴파일된 코드는 CPU 사이에 호환성 없음
CPU 레지스터 종류
- PC(Program Counter): 다음에 실행할 명령의 메모리 주소를 저장함
- IR(Instruction Register):
> 현재 실행하기 위해 메모리로부터 읽어 온 명령을 저장함
- SP(Stack Pointer): 스택의 꼭대기 메모리 주소를 저장함
- 데이터 레지스터들(Data Registers): 연산에 사용되거나 사용될 데이터들을 저장함
- 상태 레지스터(Status Register):
> CPU의 상태 정보나 인터럽트 금지 등의 제어 정보를 저장함
- 기타 여러 레지스터:
> 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터들을 포함함
CPU Instruction Cycle (명령 사이클)
- CPU가 하나의 명령을 실행하는 과정을 의미함
- CPU는 전원이 켜진 후 단순하게 명령 사이클을 반복함
스택(Stack)
-프로그램이 실행되기 위해 운영체제에 의해 할당되는 4가지 공간
- 코드(code) 공간: 프로그램 코드 적재
- 데이터(data) 공간: 전역 변수들이 적재되는 공간
- 힙(heap) 공간: 프로그램에서 동적 할당받는 공간
- 스택(stack) 공간: 함수가 호출될 때 매개변수, 지역변수 등을 저장함
- 메모리의 일부를 스택으로 사용하도록 (논리적으로) 할당된 공간
> 스택이라는 별도의 하드웨어 메모리가 있는 것은 아님
- CPU의 SP 레지스터는 현재 CPU가 실행중인 프로그램의 스택 꼭대기 주소를 가리킴
- 스택에 저장되는 내용
> 함수의 지역 변수들
> 함수가 호출될 때 전달받은 매개변수 값들
> 함수가 실행된 후 돌아갈 주소
> 함수가 의도적으로 저장해 두기 위한 값
컨텍스트(Context)
- 문맥이라고도 표현함
- 한 프로그램이 실행 중인 일체의 상황 정보를 의미함
> 메모리 정보
프로그램 코드와 데이터, 스택, 동적할당 받아 저장한 값을 포함
> CPU 레지스터 정보
PC에는 코드의 주소가 저장됨
SP에는 스택의 주소가 저장됨
다른 레지스터는 이전의 실행 결과나 현재 실행에 사용되는 데이터들을 저장함
- 축소 정의
> 현재 CPU에 들어 있는 레지스터 값들만을 의미함
(메모리 정보는 언제나 동일하며 레지스터 정보만 바뀌므로)
컨텍스트 스위칭(Constext Switching)
- CPU가 현재 프로그램의 실행을 중지하고 다른 프로그램을 실행할 때 발생함
- 과정
> 현재 실행중인 프로그램의 컨텍스트(CPU레지스터들의 값)를 메모리에 백업함
> 새로 실행시킬 프로그램의 저장된 컨텍스트(CPU레지스터들의 값)를 복구함
운영체제 = 커널 + 툴 + 디바이스 드라이버
커널(Kernel)
- 운영체제의 핵심 부분, 좁은 의미의 운영체제라고 할 수 있음
- 부팅 후 메모리에 계속 상주하는 코드와 데이터로서 존재함
- 운영체제의 핵심 기능을 수행함
- CPU, Memory, MMU등 컴퓨터 자원을 제어하고 관리하는 코드와 자료 구조를 포함함
- 커널 기능을 이용하려면 응용프로그램은 반드시 시스템 콜(System Call)을 하여야 함
도구(tool) 및 GUI
- 사용자가 컴퓨터를 편리하게 사용할 수 있도록 제공하는 소프트웨어를 의미함
- Windows 경우, 바탕화면 GUI, 탐색기, 명령창, 작업 관리자, 제어판 등을 의미함
- 리눅스 경우, 쉘, 로그인 프로그램을 의미함
디바이스 드라이버(Device Driver)
- 장치를 직접 제어하고 입출력하는 소프트웨어를 의미함
- 장치마다 전담 디바이스 드라이버가 존재함
- 일반적으로 장치 제작자에 의해 작성되어 배포됨
System Call (시스템 호출)
- 커널과 응용프로그램 사이의 인터페이스를 의미함
- 사용자 공간의 코드에서 커널 서비스를 요청하는 과정을 의미함
> 응용프로그램에서 커널 기능을 사용할 수 있는 유일한 방법임
- 라이브러리를 통해 다양한 System Call 함수를 제공함
> System Call 라이브러리는 운영체제 패키지에 포함됨
예) 파일 읽기, 메모리 할당, 프로세스 정보 보기, 프로세스 생성 등
> Unix/Linux의 커널 API – open(), read(), write(), fork(), exit()
> Windows의 커널 API – CreateProcess(), WaitForSingleObject()
> 대략 200개 이상의 System Call 함수가 존재함
Function Call(함수 호출)로 라이브러리 활용
- 사용자 공간에 적재된 함수가 같은 공간에 적재된 다른 함수를 호출함
(표준 라이브러리 및 System Call 라이브러리 함수 포함)- 사용자 공간에서 사용자 모드로 실행함
- Function Call 과정
> 사용자 공간의 스택에 돌아올 주소, 매개변수 전달, 호출된 함수의 지역변수를 생성함
> 사용자 공간에 적재된 함수의 주소로 점프함
> 함수가 끝나면 함수를 호출한 곳으로 복귀함
System Call(시스템 호출)로 커널 코드 실행
- 응용프로그램이 운영체제의 기능을 사용하고자 할 때, 커널에 작성된 함수를 실행함- System Call 라이브러리에 포함된 함수가 System Call을 발생시킴
- System Call 과정
> System Call을 발생시키는 특별한 CPU Instruction을 실행함
> 특별한 CPU Instruction을 통해 사용자 모드에서 커널 모드로 전환을 수행함
커널 함수마다 매겨진 고유 번호를 전달함
> 커널의 System Call 핸들러를 실행함
> System Call 핸들러가 전달받은 커널 함수의 고유 번호를 분석함
해당 커널 함수를 호출함
> 커널 함수로부터 리턴할 때 사용자 모드로 전환 후, 사용자 프로그램으로 복귀함
System Call은 Function Call에 비해 많은 시간 비용
- System Call을 많이 할수록 프로그램 실행 속도 저하
파일에서 1000바이트를 읽는 2가지 유형의 코드. 실행 비교 결과는?
표준 C 라이브러리 함수 fread()와 System Call read() 실행 비교
- 표준 C 라이브러리 함수, fread(fp, buf, size)의 동작 과정
> fread()를 처음 호출하면 라이브러리 내 버퍼(buffer)가 비어 있음
> read()를 호출하여 라이브러리 내 버퍼를 채운다. n = read(fd, buf, BLKSIZE);
> 응용프로그램으로부터 요청 받은 크기(size)만큼 응용프로그램의 buf로 복사
> 라이브러리 버퍼가 비거나 부족하면 그때 다시 read() 호출
- System Call 함수, read(fd, buf, size)의 동작 과정
> System Call을 이용하여 커널 코드 실행
> 커널 코드에서 디스크 읽기
> 라이브러리를 거치지 않고 바로 buf로 읽어 들임
`
System Call에 따른 비용은 매우 크다
System Call 함수에 전달할 데이터들을 CPU 레지스터에 저장
-> 사용자 모드에서 커널 모드로 전환
-> System Call 핸들러 실행
-> CPU 내 레지스터가 훼손되는 것을 막기 위해 스택에 저장
-> System Call 표에서 System Call 함수 찾기
-> System Call 함수 실행
-> 스택에 저장해둔 레지스터 복귀
-> 사용자 모드로 복귀
System Call 횟수를 줄여야 응용프로그램의 실행 시간이 짧아지고,
시스템 입장에서 더 많은 프로그램을 실행시킬 수 있는 시간 확보
-> 시스템의 처리율 향상
Interrupt(인터럽트)
- 커널과 하드웨어 장치 사이의 인터페이스
- 입출력 장치들이 비동기적 사건을 CPU에게 알리는 행위
(비동기적이란 예정되지 않거나 발생시간을 예측할 수 없는 사건)
> 키보드 입력, 프린터 출력, 타이머 완료, 네트워크로부터 데이터 도착 등
- 하드웨어 Interrupt
> 장치들이 어떤 상황 발생을 CPU에게 알리는 하드웨어 신호
> CPU는 Interrupt 를 수신하면 Interrupt Service Routine을 실행함
(Interrupt Service Routine은 대부분 디바이스 드라이버/커널 영역 내에 존재)
- 소프트웨어 Interrupt
> 프로그램등을 통해 CPU Instruction 으로 발생시키는 Interrupt
> Trap등이 여기에 속함
Interrupt를 사용하는 이유
입출력이 완료될 때
- 장치로부터 입출력 완료 통보를 받는 방법이 필요함
- Interrupt가 없다면, CPU는 입출력 완료를 계속 검사하는 폴링(polling)이 필요함
-> CPU 자원을 낭비하게 됨
Interrupt가 없다면
- 다중프로그래밍 운영체제의 성능이 크게 하락하게 됨
Interrupt의 효과
- 입출력 장치와 CPU가 동시에 각자의 작업 실행을 할 수있도록 함
> 입출력 장치는 지시받은 입출력을 진행, CPU는 다른 프로그램을 실행함
- 컴퓨터 시스템이 효율적으로 작동함
> CPU 활용률이 높아지고, 시스템 처리율이 향상됨
커널 (중요☆)
부팅 시에 운영체제 전용 공간(커널 공간)에 적재된 함수들과 데이터 집합
- 커널은 컴파일된 바이너리 형태로 존재하며 하드디스크 특정 영역에 저장됨
- 부팅 시에 커널 공간의 메모리에 적재됨
커널의 특징
커널은 스스로 실행되는 프로세스인가? NO
- 커널은 함수들의 단순 집합, System Call을 통해 호출되는 함수들을 의미함
- 커널이 스케줄링을 수행한다(x)
> 커널 프로세스가 실행되면서 주기적으로 스케줄링한다(x)
> System Call과 Interrupt Service Routine에 의해 커널 내 스케줄러 함수가
호출되어 실행(0)
커널이 실행 중이다? NO
- 커널은 프로세스도 스레드도 아니므로 NO
- 커널이 실행 중이다(x)
> 응용프로그램이 System Call을 하여 커널 코드를 실행하고 있다(0)
> Interrupt가 발생하여 Interrupt Service Routine이 실행되고 있다(0)
커널은 스택이나 힙을 가지는가? NO
- 스택이나 힙을 가지는 주체는 프로세스 혹은 스레드뿐임
- 스레드마다 사용자 스택과 커널 스택을 소유함
> 스레드가 생성될 때 프로세스의 사용자 공간에 사용자 스택을 할당함
(사용자 코드가 실행되는 동안 활용함)
> 스레드가 생성될 때 커널 공간에 커널 스택 할당
(스레드가 System Call로 커널 코드를 실행할 때 스택으로 활용)
자원 접근 관리
다중프로그래밍 운영체제에서 발생하는 자원 문제
- 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손이 발생함
> 다른 응용프로그램이 적재된 메모리를 훼손할 수 있음
> 다른 응용프로그램이 만든 파일을 삭제하거나 훼손할 수 있음
> 응용 프로그램이 커널이 적재된 영역을 훼손할 수 있음
- 해결 방안
> 응용프로그램의 임의의 자원 접근을 불허함
> 자원에 대한 모든 접근은 커널에만 부여함
구체적인 해결 방법
- 메모리 공간을 사용자 공간과 커널 공간으로 분리
> 응용프로그램은 사용자 공간에 적재, 커널은 커널 공간에만 적재
- CPU의 실행 모드를 사용자 모드와 커널 모드로 분리
> 응용프로그램은 사용자 모드에서만 실행, 커널 코드는 커널 모드에서만 실행
> 사용자 공간에서 커널 공간의 코드를 직접 접근하지 못함
> 사용자 모드에서 커널 코드를 접근하면 응용프로그램을 강제 종료함
- 응용프로그램이 커널 기능을 실행하고자 할 때, System Call을 이용해야 함
사용자 공간과 커널 공간
운영체제는 컴퓨터 메모리를 두 공간으로 분리
- 사용자 공간(user space) : 모든 응용프로그램들이 나누어 사용하는 공간
> 응용프로그램들이 적재되는 공간
- 커널 공간(kernel space) : 커널만 사용할 수 있는 공간
> 커널 코드, 커널 데이터 등 커널에 의해 배타적으로 사용되는 공간
> 디바이스 드라이버를 포함함
분리 이유
- 커널 코드와 데이터를 악의적인 응용프로그램이나 코딩 실수로부터 지키기 위함
사용자 공간 크기
- 한 응용프로그램의 최대 크기를 결정함
> 프로그램 코드 + 데이터(전역변수) + 힙(동적할당) + 스택 합친 크기
예) 32비트 Windows 운영체제에서 사용자 공간 2GB란 ->
응용프로그램을 2GB 크기 이상 개발할 수 없음
사용자 공간의 주소 범위
- 응용프로그램은 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없음
예) 32비트 Windows 운영체제에서,
응용프로그램은 0~7FFFFFFF 범위의 주소를 넘어 액세스하면,
바로 종료(심각한 오류)됨
모드 레지스터
- CPU 내부에 존재하며 CPU의 모드 상태를 나타냄
사용자 모드(User Mode)
- CPU의 모드 비트 = 1
- CPU는 사용자 공간에 있는 코드나 데이터를 액세스하는 중
- CPU의 커널 공간 접근 불허 -> 응용프로그램으로부터 커널영역 보호
- 특권 명령(Privileged Instruction) 실행 불허
> 특권 명령: 입출력 장치 등 하드웨어나 시스템 중단 등
시스템 관련 처리를 위해 설계된 특별한 명령
커널 모드(Kernel Mode, Supervisor Mode)
- CPU의 모드 비트 = 0
- CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
- 특권 명령 사용 가능
모드 레지스터
- CPU 내부에 존재하며 CPU의 모드 상태를 나타냄
사용자 모드(User Mode)
- CPU의 모드 비트 = 1
- CPU는 사용자 공간에 있는 코드나 데이터를 액세스하는 중
- CPU의 커널 공간 접근 불허 -> 응용프로그램으로부터 커널영역 보호
- 특권 명령(Privileged Instruction) 실행 불허
> 특권 명령: 입출력 장치 등 하드웨어나 시스템 중단 등
시스템 관련 처리를 위해 설계된 특별한 명령
커널 모드(Kernel Mode, Supervisor Mode)
- CPU의 모드 비트 = 0
- CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
- 특권 명령 사용 가능
사용자 모드 -> 커널 모드 전환
사용자 모드에서 커널 모드로 전환하는 경우
- 오직 2 가지 경우: System Call과 Interrupt 발생
System Call
- System Call을 실행하는 특별한 Machine Instruction에 의해 진행
예) int 0x80/sysenter/trap/syscall 등 CPU마다 다름
- Machine Instruction이 CPU의 모드 비트를 커널 모드로 전환
Interrupt
- CPU가 Interrupt를 수신하면 커널 모드로 자동 전환
> Interrupt Service Routine이 커널 공간에 있기 때문
- CPU는 Interrupt Service Routine 실행
- Interrupt Service Routine이 끝나면 CPU는 사용자 모드로 자동 전환
특권 명령(Privileged Instruction)
- 입출력 장치로부터의 입출력(I/O), 시스템 중단, 컨텍스트 스위칭,
Interrupt 금지 등 특별한 목적으로 설계된 CPU Instruction
- 커널 모드에서만 실행됨
특권 명령 종류
- I/O 명령
> 하드웨어 제어 및 장치로부터의 입출력
> 사례) in eax, 300; I/O 포트 300 번지에서 값을 읽어 eax 레지스터에 저장
out 301, eax; eax 레지스터에 있는 값을 I/O 포트 301 번지에 쓰기
- Halt 명령
> CPU의 작동을 중지시키는 명령 (CPU를 유휴 상태로 만듦)
- Interrupt 플래그를 켜고 끄는 명령
> CPU 내에 있는 Interrupt 플래그 비트를 제어하여 Interrupt 를 허용 혹은 무시함
> 사례) cli/sti 명령
- 타이머 설정 명령
- 컨텍스트 스위칭 명령
- 메모리 지우기 명령
- 장치 상태 테이블 수정 등의 명령
'운영체제' 카테고리의 다른 글
4. 스레드와 멀티스레딩 (2) | 2023.04.10 |
---|---|
3. 프로세스와 프로세스 관리 (2) (0) | 2023.04.07 |
3. 프로세스와 프로세스 관리(1) (1) | 2023.04.04 |
1. 운영체제의 시작과 발전 (2) | 2023.04.01 |