2025. 3. 22. 21:20ㆍ개발/💻 CS 지식
컴퓨터 시스템 구조
컴퓨터 시스템 구성 - CPU, Memory, OS, Disk
컴퓨터를 크게 내부와 외부로 나눠서 보자면,
내부에서는 CPU, Memory, OS(Memory에 상주)가 가장 큰 부분을 차지하며,
외부는 I/O 장치(Disk)들로 이루어져 있다
CPU는 기계어를 직접 연산하는 장치이며
CPU의 작업 공간을 Memory라고 한다
Disk는 외부(사용자)의 입출력을 담당하는 장치다
이때 Disk에도 간단한 연산을 수행하는 Disk Controller와,
Disk Controller의 작업 공간인 Local Buffer가 달려 있다
즉, 외부의 CPU 역할을 Disk Controller가, Memory 역할을 Local Buffer가 수행해주는 것이다
Disk Controller는 CPU와 I/O 사이의 소통 또한 담당한다
CPU의 명령을 I/O Device에 전달해주고 I/O의 작업이 완료되면 Interrupt를 발생시킨다
Mode Bit - kernel mode, user mode
Mode Bit : CPU가 실행하고 있는 기계어를 구분해주는 하드웨어
1 : 사용자 모드 - 사용자 프로그램 수행
2 : 모니터(커널/시스템) 모드 - OS 코드 수행
왜 kernel mode와 user mode를 구분하는 Mode Bit이 필요한가?
CPU는 크게 두가지의 기계어 연산을 담당하는데
하나는 OS가 요청한 기계어, 다른 하나는 사용자 프로그램의 기계어이다
OS가 요청한 기계어는 미리 약속된 규칙 범위 내이기 때문에 안전하지만,
사용자 프로그램은 애초에 외부에서 들여온 놈이기 때문에 비교적 위험하다
( CPU를 계속 잡아먹고 있을 수도 있고 )
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
따라서 사용자 프로그램의 잘못된 수행으로부터 컴퓨터를 보호하기 위해
Mode Bit을 통해 사용자 모드와 커널 모드를 구분해주고
특권 명령 - previleged instruction(보안을 해칠 수 있는 중요한 명령어)은
커널 모드에서만 수행 가능하도록 지정한 것이다
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
Mode Bit의 변경
1 ) 커널 모드(0) -> 사용자 모드(1)
OS가 CPU를 사용자 프로그램에게 넘기기 전에 Mode Bit을 1로 변경
2 ) 사용자 모드(1) -> 커널 모드(0)
Interrupt 발생 시 Mode Bit은 다시 0으로 돌아온다
Register
: CPU에 달려 있는 연산(AND, OR 등등)에 필요한 작은 저장공간
Program Counter Register
: 다음에 실행할 프로그램의 메모리 주소를 저장하는 공간
Timer
: 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴
: 타이머는 매 클럭 틱 때마다 1씩 감소
: 타이머 값이 0이 되면 타이머 인터럽트 발생
: CPU를 특정 프로그램이 독점하는 것으로부터 보호
: 현재 시간을 계산하기 위해서도 사용됨
DMA(Direct Memory Access) Controller
: I/O device의 작업을 모아서 한번에 처리한다
: I/O device의 Local Buffer에 접근해서 저장된 데이터를 block 단위로 Memory에 전송한다
: Memory에 데이터를 전송할 때만(block이 다 찼을 때만) interrupt를 발생시킨다
: block 단위로 interrupt가 발생하도록 하여 CPU의 성능이 저하되는 것을 방지한다
Interrupt
하드웨어 인터럽트 (Hardware Interrupt) : 하드웨어에서 발생시킨 인터럽트
- Timer Interrupt : Timer가 0이 되면 인터럽트 발생시킴
- I/O Interrupt : I/O가 작업을 완료하면 인터럽트 발생시킴
- DMA Controller : I/O의 데이터가 block 단위로 쌓이면 Memory에 데이터를 올리면서 인터럽트 발생시킴
소프트웨어 인터럽트 =(Software Interrupt) = Trap
- Exception : 사용자 프로그램이 오류를 발생시킨 경우 (ex - 사용자 프로그램이 특권 명령을 직접 호출한 경우)
- System Call : 사용자 프로그램이 커널 함수를 호출시킨 경우 (ex - 사용자 프로그램이 I/O를 호출한 경우)
인터럽트에는 여러 종류가 있는데, 인터럽트 번호마다의 처리 방식이 따로 정의되어 있음
인터럽트 벡터 : 인터럽트의 처리 루틴 주소를 가지고 있음
인터럽트 처리 루틴(Interrupt Service Routine) : 해당 인터럽트를 처리하는 커널 함수
동기식 입출력과 비동기식 입출력
동기식 입출력 (Synchronous I/O)
: OS에 I/O 요청 후 입출력 작업이 완료된 후에야 CPU 제어권이 사용자 프로그램에 넘어감
비동기식 입출력(Asynchronous I/O)
: OS에 I/O 요청만 해놓고 CPU 제어권을 즉시 돌려받아 다른 작업을 수행함
➡ 동기식, 비동기식 입출력 모두 처리가 완료되면 인터럽트를 발생시킨다
입출력 명령어 종류
일반적인 I/O 처리 방법
: 메모리상에 I/O처리를 위한 별도의 instruction이 존재
Memory Mapped I/O
: I/O 처리를 위한 instruction을 메모리 주소의 연장선상에 놓는 방법
: 따로 주소 변환 처리 필요
저장장치 계층 구조
위 계층일수록 속도가 빠르지만 비용과 용량이 작다
프로그램의 실행
사용자 프로그램의 메모리 로드
File System에 저장되어 있던 실행 파일들은 실행을 위해 Memory에 올라가면 프로세스가 된다
실행 파일들은 File System 내에서 가상 메모리 공간을 갖게 되는데
가상 메모리 공간은 stack, data, code로 이루어져 있다
가상 메모리의 주소
stack - 함수 호출 및 return값, 지역 변수 저장
data - (전역)변수, 배열과 같은 데이터
code - CPU에서 수행할 기계어
가상 메모리는 말그대로 물리적이지 않은, 가상의 메모리이기 때문에
가상 메모리 공간의 주소는 물리적 메모리 공간의 주소와 다르다
따라서 File System(가상 메모리 주소)에서 Memory(실제 메모리 주소)에 실행파일을 올릴 때는 주소 변환이 필요하다
이때 Memory에 올라가는 것들은 실행을 위해 당장 필요한 애들이고
당장에 필요하지 않은 애들은 Swap Area에 따로 저장된다
커널 주소 공간의 내용
OS도 결국 프로그램을 돌리기 때문에 메모리 공간이 필요하다
code
- 자원 관리와 사용자에게 편리한 서비스 제공을 위한 코드 존재
- 인터럽트가 들어왔을 때의 처리를 위한 코드 존재
data
- 하드웨어(CPU, Memory, Disk)를 관리하기 위한 각각의 자료구조 존재
- 프로세스를 관리하기 위한 자료구조 존재
stack
- OS 또한 함수 형태로 코드가 작성되어 있기 때문에 함수를 처리하기 위한 stack이 존재함
- 여러 프로세스를 동시에 돌리기 때문에 프로세스별로 스택을 가지고 있음
사용자 프로그램이 사용하는 함수
사용자 프로그램이 사용하는 함수에는 사용자 정의 함수, 라이브러리 함수, 커널 함수가 있다
사용자 정의 함수와 라이브러리 함수는 사용자 프로그램이 저장되는 가상 메모리 공간의 code에 저장되며
커널 함수는 말그대로 OS에서 정의해놓은 함수이기 때문에 커널 주소 공간의 code에 저장된다
이때, 사용자 프로그램 내에서 커널 함수를 호출하는 것을 시스템 콜이라고 한다
프로그램의 실행 과정
사용자 프로그램이 실행되면 여러 함수를 거치게 되는데,
이때 함수의 종류에 따라 사용자 모드 <-> 커널 모드로 계속 전환된다
'개발 > 💻 CS 지식' 카테고리의 다른 글
[ 운영 체제 ] Process Management (0) | 2025.04.12 |
---|---|
[ 운영체제 ] Process (0) | 2025.04.01 |
[ 운영체제 ] 운영 체제 개요 (0) | 2025.03.10 |
🍪 쿠키 (1) | 2025.03.06 |
🖥 운영 체제 - 동기화 (0) | 2024.08.06 |