이론 정리/컴퓨터 구조
한 권으로 읽는 컴퓨터 구조와 프로그래밍 5장 정리
철매존
2024. 4. 27. 18:23
728x90
기본적 구조 요소
- 기본적으로 폰 노이만 구조, 하버드 구조 이렇게 있는데 둘의 차이는 메모리 배열뿐이다.
- 폰 노이만 구조는 메모리 버스와 주소 버스가 하나뿐이다.
- 폰 노이만 구조가 약간 더 느리지만 하버드 구조는 두번째 메모리 처리를 위한 버스가 더 필요하다.
프로세서 코어
- 위의 두 구조는 모두 CPU가 하나뿐이다.
- 단일 CPU보다 성능을 높이기 위해 멀티프로세서가 도입됐는데 병렬화에서 문제가 있었다.
- 예전에는 CPU라는거를 요즘은 프로세스 코어라고 하고, 이거를 여러개 쓰는거를 멀티코어라고 한다.
마이크로프로세서와 마이크로컴퓨터
- 마이크로프로세서
- 메모리와 I/O가 프로세서 코어와 같은 패키지에 들어 있지 않음
- 마이크로컴퓨터
- 모든 요소를 한 칩 안에 패키징
- 일단은 메모리가 차지하는 영역이 꽤 크기 때문에 마이크로프로세서보다 마이크로컴퓨터가 덜 강력함.
- 요약하면 마이크로프로세서는 보통 큰 시스템에 들어가는 부품이고 마이크로컴퓨터는 말 그대로 작은 컴퓨터이다.
- 추가로 SoC라는게 있는데 더 복잡한 마이크로컴퓨터를 의미한다.
프로시저, 서브루틴, 함수
- 일단 여기서는 세개가 같은 의미
- 간단하게 말하면 그냥 똑같은거 여러번 쓰기 귀찮으니 한번 해놓고 쓰는 메서드같은거
- 이거는 그냥 쓴다고 되는게 아니고(java, js 등으로)
- 그게 어떤 식으로 동작을 하기 때문에 되는것이다. -> 이 때 쓰는게 명령어 집합이다.
스택
- 함수는 다른 함수를 호출할수도, 자기 자신을 호출할수도 있다.
- 자기 자신을 호출하는 재귀같은 경우를 생각하면
- 재귀 함수가 제대로 작동하기 위해서는 반환 주소를 여러개 저장할 수 있어야 한다.
- 그리고 함수에서 호출 지점으로 반환할 때 저장된 주소 중 어떤 주소를 사용할지 결정할 수 있어야 한다.
- DFS, BFS 생각하면 편하다.
- 암튼 이럴 때에 주소를 쌓아두고 없애는데 이런거를 스택이라고 한다.
- 어떤 함수가 불렸을때 어디서 어떻게 불렸고 그 결과가 어디서 쓰이는지 알아야하잖어
인터럽트
- 동작 중에 잠깐 중단시켜서 주의해야할 내용을 바로 대응하는것
- 요거는 이제 지금 실행되고 있는 명령어는 끝까지 실행하고, 프로세서가 그 이후로 실행중 프로셋
- 고려해야 할 점이 있는데
- 응답 시간 -> 너무 오랜 시간을 소요하면 안된다.
- 현재 상태 저장 -> 인터럽트 처리 후 돌아올
- 이 상태를 스택에 저장한다.
상대 주소 지정
- 여러 프로그램을 동시에 실행하려면?
- 각 프로그램 전환을 위한 관리자 프로그램이 필요한데, 이거를 커널이라고 한다.
- OS와 OS가 관리하는 프로그램을 구분하기 위해 OS를 시스템 프로그램, 다른 모든 프로그램을 사용자 프로그램이나 프로세스라고 부른다.
- 보통
- 사용자프로그램 읽기 -> 상태 복원 -> 사용자 프로그램 실행 -> 타이머 인터럽트 -> 사용자 프로그램 중단 -> 상태 저장
- 요거를 반복한다.
- 사용자프로그램 읽기 -> 상태 복원 -> 사용자 프로그램 실행 -> 타이머 인터럽트 -> 사용자 프로그램 중단 -> 상태 저장
- 사용자 프로그램의 실행 시간을 조절하는 스케줄링 기법을 시분할이라고 부른다.
- 시간을 정해진 간격으로 나누고, 정해진 시간 간격 동안 사용자 프로그램을 실행한다.
- 이 사용자 프로그램 상태나 문맥(컨텍스트)는 레지스터 상태와 프로그램이 사용중인 메모리의 상태를 뜻한다.
- 메모리에는 스택도 포함!
- 이거는 좋은데 너무 느리다.
- 프로그램을 메모리로 불러들이려면 시간이 걸림.
- 그래서 각 프로그램에 각기 다른 공간을 허용할 수 있으면 훨씬 더 빠르게 시분할 실행이 가능하다.
- 사용자 프로그램이 하나씩 차례로 메모리에 올라간다.
- 주소 지정 모드 설명할 때 컴퓨터는 절대 주소 지정을 사용
- 이거는 즉 명령어 주소가 특정 메모리 주소를 가리킨다는 뜻
- 주소 지정 모드 설명할 때 컴퓨터는 절대 주소 지정을 사용
- 사용자 프로그램이 하나씩 차례로 메모리에 올라간다.
- 인덱스 레지스터를 추가해서 문제 해결
- 인덱스 레지스터 사용하면 인덱스 레지스터의 값을 명령어에 들어 있는 주소와 더해서 유효 주소를 계산한다.
- 사용자주소 : 1000번지 , 인덱스 레지스터 : 2000 -> OS는 이 프로그램을 3000번지에서 실행
- 혹은 상대 주소 지정으로 해결
- 명령어의 주소를 기준으로 하는 상대적 주소로 해석
- 명령어가 들어있는 위치로부터 얼마나 떨어져있는지 이런거
- 이거를 직접 계산하는거는 진짜 힘들지만 요즘은 프로그래밍 언어 도구들이 알아서 해줌
메모리 관리 장치
- 동시 작업은 계속해서 백그라운드에서 실행돼야해서 멀티태스킹이 필수다.
- 인덱스 레지스터랑 상대 주소 지정이 있으면 멀티태스킹에 도움이 되지만 이거만으로는 충분하지 않다.
- 버그가 있으면 사용자 프로그램 1이 차지한 메모리를 덮어쓰거나 심지어 OS의 메모리를 덮어쓴다면
- 의도적으로 시스템에 실행 중인 다른 사람의프로그램을 들여다보거나 변경하는 프로그램을 작성한다면
- 아예 각 프로그램을 분리하는게 좋은데, 그걸 위해 메모리 관리 장치가 들어있다.
- MMU 시스템은 가상주소와 물리주소를 구분한다.
- 프로그램은 가상주소로 작성되고, MMU는 가상주소를 물리주소로 변환해준다.
- MMU랑 인덱스레지스터 차이
- MMU의 가상 주소 범위는 물리적 메모리 주소보다 큰 경우가 많다.
- MMU는 가상 메모리 주소를 두 부분으로 나눈다.
- 주소 하위(LSB쪽) 부분은 물리적 주소 범위와 같다.
- 주소 상위(MSB쪽) 부분은 페이지 테이블이라는 RAM영역을 통해 주소를 변환한다.
- MMU는 가상 메모리 주소를 두 부분으로 나눈다.
- MMU의 가상 주소 범위는 물리적 메모리 주소보다 큰 경우가 많다.
- 프로그램 입장에서는 가상 메모리가 연속적인 것처럼 보이지만 실제 물리 메모리상의위치는 연속적이지 않아도 된다. -> 바뀌는것도 가능
가상 메모리
- OS는 MMU를 통해 가상 메모리 제공
- 요청받은 메모리가 사용가능 메모리보다 크면 안쓰는걸 옮기고 사용
- 참고로 이런 스와핑이 일어나면 시스템 성능이 저하된다. 그래도 느리더라도 프로그램 실행이라도 하는게 나음ㅇㅇ
시스템 공간과 사용자 공간
- 각자 프로세스마다 메모리 주소 공간 제공 -> 자기가 유일하게 실행되는거라고 생각하게
- 인터럽트같은거 쓰면 근데 격리 안됨
- 이게 시스템모드인지/사용자모드인지 결정하는 비트 필요
- I/O처리 등의 명령어는 특권명령어라 시스템 모드에서만 실행가능
- 트랩이나 시스템콜같은걸 통해 요청 가능
- 이렇게 하면 운영체제 보호 가능 + 운영체제가 프로그램에 대한 자원 할당만 전적으로 제어 가능 등
메모리 계층과 성능
- 캐시!!
코프로세서
- 비서마냥 몇가지 연산을 위임받아 처리.
- 직접 메모리 접근 등
메모리상 데이터 배치
- 메모리에는 명령어 뿐 아니라 데이터도 담는다.
- 이때 데이터는
static
이다. - 말하자면 프로그램 작성 때에 얼마나 많은 메모리가 필요한지 알고 있다는 것.
- 이때 데이터는
- 대부분의 프로그램은 동적 메모리를 다뤄야 하는데, 예를 들어 메시지 시스템은 저장해야 할 메시지 개수나 각 크기를 알 수 없고, 이런거는 정적 데이터 영역의 위 영역에 쌓이는데 이를 힙(heap)이라고 한다.
- 더 많은 데이터를 저장해야 하면 스택은 아래로, 힙은 위로 자라난다.
프로그램 실행
- 공유 라이브러리를 사용하는 동적 링크 방식 사용~