지난시간에
컴퓨터 하드웨어와 구성 요소
- CPU는 메모리에서 명령어를 하나씩 가져와 해석하고 실행함.
- 데이터와 코드는 메모리에 저장됨.
- 자주 사용하는 데이터는 '로컬리티'라는 특성 때문에 캐시 메모리에 저장됨.
- 메모리는 계층 구조를 가짐.
- 프로세스의 코어에 가장 가까운 것은 레지스터.
- 그 다음은 캐시 메모리, 그 아래는 메인 메모리, 그리고 마지막으로 HDD나 SSD 같은 저장 장치로 구성됨.
- 위로 올라갈수록 크기는 작고, 속도는 빠르며, 가격은 비쌈.
- 하드디스크에 가까워질수록 가격은 싸고, 용량은 크며, 접근 속도는 느림.
- 데이터, 제어, 주소 신호가 오가는 통로를 버스라고 함.
- IO 장치 주소를 지정하는 방식은 두 가지로 나뉨:
- 메모리 맵드 IO: 메모리 주소의 일부를 IO 주소로 사용.
- 포트 맵드 IO: IO 전용 주소를 따로 할당함.
- CPU가 개입하지 않고 IO 장치에서 메모리로 데이터를 옮기는 방식은 DMA (Direct Memory Access)라고 함.
- IO 브리지에는 DMA 컨트롤러가 포함되어 있음.
컴퓨팅 자원 보호 기법
- 메모리 공간을 사용자 공간과 커널 공간으로 나누고, 가상 주소 공간을 사용하여 프로세스 간의 메모리 충돌을 방지함.
- 베이스 어드레스 레지스터와 바운드 어드레스 레지스터를 사용해 메모리 공간을 나누는 방식이 있음.
- 명령어는 사용자 모드와 커널 모드로 나뉘어 실행됨.
- 커널 모드에서만 실행 가능한 명령어를 특권 명령어라고 하며, 사용자 모드의 프로세스는 이를 실행할 수 없음.
프로그램 수행과 예외처리
- 프로세서는 한 번에 한 가지 일만 처리함.
- 프로그램을 실행할 때, CPU는 부팅 이후 명령어들을 하나씩 읽어 해석하고 실행함. 이를 제어 흐름이라 하며, 이 시퀀스를 제어 흐름(sequence of control)이라고 함.
일반적인 프로그램의 실행 순서
- 명령어는 순서대로 실행됨.
- 그러나 특정 조건에서는 순서가 변경될 수 있음.
제어 흐름의 변경
- 일반적인 제어 흐름 변경 방법:
- Jump, Branch: 흐름을 다른 위치로 변경.
- Call, Return: 함수 호출 및 반환 시 흐름 변경.
- 제어 흐름이 변경되면 프로그램 상태도 변동됨.
시스템 상태 변경이 필요한 경우
- 디스크나 네트워크 디바이스에서 데이터 전송이 완료되었을 때, 이를 처리할 필요가 있음.
- 0으로 나누기(Divide by Zero) 오류 발생 시, 적절한 예외처리가 필요함.
- 사용자가 Ctrl-C를 눌렀을 때, 프로세스를 중단시킴.
- 시스템 타이머가 만료되면 다른 프로세스로 제어권을 넘기거나 종료함.
예외적인 제어 흐름 (Exceptional Control Flow, ECF)
- 프로그램 실행 중 예상치 못한 상황을 처리하기 위해 예외적인 제어 흐름이 필요함.
예외적인 제어 흐름의 종류
저수준 메커니즘
- Exception (예외):
- 시스템 이벤트에 응답하여 제어 흐름이 변경됨.
- 하드웨어와 운영체제(OS)의 협력으로 구현됨.
- 특정 예외가 발생할 경우, 이를 OS 커널에서 처리하거나 응용 프로그램에서 처리함.
- 프로세스 컨텍스트 스위치 (Process Context Switch):
- 운영체제와 하드웨어 타이머에 의해 구현됨.
- 일정 시간이 지난 후 다른 프로세스로 제어가 넘어감.
- Signals:
- OS에 의해 구현되며, 프로세스가 특정 이벤트를 비동기적으로 처리함.
- 프로세스는 시그널을 받고 적절한 방식으로 처리함.
- Nonlocal jump:
- setjmp와 longjmp로 구현됨.
- 현재 프로그램 상태를 저장하고 나중에 복원하는 방식.
오늘 볼거는 저수준 exception
https://www.youtube.com/watch?v=rN2Ytjmvo0w
특정 이벤트에 대응하기 위해서 OS 커널에 제어를 전달
이벤트가 발생하면 그 이벤트가 해당하는 익셉션 루틴으로 점프하고 커널코드에 있는 exception 처리하고 원래 유저 코드로 돌아오는 형태로 돌아오게됨. 돌아올 때도 원래 이벤트 받은 곳으로 혹은 다음으로 혹은 아예 다른 터미널? 로 갈 수도 있음
이벤트 발생하면 이벤트발생한거만 전달되는게 아니라 exception 번호가 같이 들어감
그걸 매핑을 하는거는 exception table에 주소 번지 해당되는 exception handler 코드를 실행하는 식으로 동작함 exception table은 exception table base register에 저장되어있음?
interupt같은 것도 동일하게 처리됨
예외 처리 과정
- 특정 이벤트가 발생하면 OS 커널이 제어권을 가져와 예외 처리 루틴을 실행함.
- 이벤트와 함께 예외 번호도 전달되어, 예외 테이블의 핸들러가 실행됨.
예외의 종류
종류 | 원인 | Async/Sync | Return behavior |
Interrupt | Signal from I/O device | Async | Always return to next intruction |
Trap | Intentional exception | Sync | Always returns to next instruction |
Fault | Potentially recoverable error | Sync | Might return to current instruction |
Abort | Nonrecoverable error | Sync | Never returns |
- Trap: 의도적인 예외 (예: 시스템 호출, 브레이크포인트).
- Fault: 비의도적이지만 복구 가능한 오류 (예: 페이지 폴트).
- Abort: 복구 불가능한 오류 (예: 잘못된 명령어).
비동기 예외 (Asynchronous Exception)
- 프로세스 외부의 입출력 장치 신호로 인해 발생함.
- 예: 타이머 인터럽트, I/O 인터럽트 등.
동기 예외 (Synchronous Exception)
- 명령어 실행 중 발생함.
- Traps: 의도적인 예외 (예: 시스템 호출).
- Fault: 비의도적이지만 복구 가능 (예: 페이지 폴트).
- Abort: 복구 불가능한 비의도적 예외.
:system call, breakpoint traps, special instructions
: 실행하던 명령어 다음으로 돌아감
-Fault
: 비의도적
:복구 가능할지도, 복구 가능하면 원래 instructin으로 돌아가고 안되면 abort로 감
: page fault
: 오류 발생한 명령어 재수행 또는 중단
- Abort
: 비의도적
: 복구가 불가
: illegal instruction
: 현재 프로그램 중단
시스템 콜 (System Call)
- 시스템 호출은 커널이 제공하는 서비스에 접근하기 위한 인터페이스임.
Number | Name | Description |
0 | read | Read file |
1 | write | Write file |
2 | open | Open file |
3 | close | Close file |
4 | stat | Get info about file |
57 | fork | Create process |
59 | execve | Execute a program |
60 | _exit | Terminate process |
62 | kill | Send signal to process |
Fault 예시: 페이지 폴트 (Page Fault)
- 메모리 상에 없는 페이지를 접근할 때 발생함.
- 메모리가 아닌 디스크에 있는 데이터를 메모리로 로드하여 복구함.
- A500 array 에다가 13을 넣고 싶다. 그러면 ~~식으로 저ㅏㅇ하는데 버츄얼 메모리에 저장되어있다고 가정함. 메인 메모리에 없으니까 page fault에일어나서 디스크에서 메모리로 카피하고 돌아옴
Fault 제: Inavlid Memory reference
앞이랑 동잃한 상황일때, invalid address이면 signal process
interrupt, system call
interrupt는 응용프로그래 ㅣㅇㅆ는데 키도브 입력하면 I/O APIC가 메시지 인터럽트 메시지를 CPU안에있는 Local APIC를 코어에 넣고 인터럽트 벡터 번호를 보내고.. 함. 인터럽트 벡터 번호는 해당하는 서비스 주소가 있음. 어떤주소가 나오면 그 서비스 루틴으로 간다? 인터럽트 서비스 루틴하고 원래 작업으로 돌아감. 이런식으로 인터럽트 돌아간다.
proces의 메모리 배치
- 코드 영역
- 데이터 영역
- 힙 영역
- 스택 영역
스택
: 후입선출구조, 넣을 때는 PUSH, 뺄때는 POP
32비트 CPU에서 리눅스의 프로세스 주소 공간
코드 영역 | 사용자 공간 |
데이터 영역 | |
힙 영역 | |
미 할당 영역 |
|
스택 영역 | |
커널 코드와 데이터 등 | 커널 공간 |
: 미할당 영역은 힙은 아래로, 스택은 위로 자란다.
:프로세스 주소 공간의 스택 - 메모리 일부를 스택으로 사용하도록 할당된 공간, OS는 각 프로그램에게 스택 공간 할당
프로그램 A와 프로그램 B를 돌릴때 할당된 공간은 메모리에 따로 존재함.
프로세스마다 공간 할당..
컨텍스트(context)
: 한 프로그램이 실행 중인 일체의 상황 혹은 상황 정보
- 메모리
- CPU 레지스터 값
컨텍스트 스위칭
:Cpu가 현재 프로그램의 실행을 중지하고 다른 프로그램 실행 시 발생
현재 컨텍스트(레지스터 값들)를 메모리에 저장해두고 새로운 컨텍스트를 CPU에 데리고 옴 = 새로운 프로그램이 실행될 준비가 됨.
interrupt는 다중프로그래밍 지원의 중요 기술
다중 프로그래밍
: 여러 프로세스 통시 실행
'공부해요 > 운영체제' 카테고리의 다른 글
프로세스와 스레드(2) (1) | 2024.10.03 |
---|---|
프로세스와 스레드 퀴즈 (0) | 2024.09.26 |
프로세스와 스레드 (0) | 2024.09.26 |
프로그램 수행과 예외처리 및 시스템 콜 퀴즈 (0) | 2024.09.19 |
시스템 콜 (0) | 2024.09.19 |