하아아
울지않아
아니 그냥 울래
요점.
메인 메모리를 쓰는 것 자체가,
디스크에서 로드하는 시간이 길기 때문인데,
메인 메모리도 용량이 커지면서,
용량이 커지면 속도도 느려진다는 법칙과,
성능을 개선하기 위해 메모리 속도 개선보다는
프로세서 속도를 개선하는 시대의 흐름에 따라
프로세서의 속도와 메모리 속도가 엇나가면서,
CPU 자체에 자주 호출해야하는 정보를 저장하는
캐시를 생성해둔다.
그리고 캐시는,
CPU 내에 있는 것만 가리키는 것이 아니라,
어떤 거대한 저장 메모리의,
중간 역할을 하는 저장 장치는,
그 이전 단계의 저장 메모리의 캐시인 셈이고,
그래서 그 하드웨어들은 계층 구조를 이룬다.
어떤 응용프로그램을 실행할 때는,
중간에 운영 체제가 있다.
그렇게 함으로서,
를 한다.
그리고 운영체제의 과정은 세 개의 추상화를 할 수 있다.
전반적인 과정의 프로세스,(프로세서 + 메인 메모리 + 입출력 장치)
기억하는 과정의 주소 공간을 형상화한 가상 메모리(메인 메모리 + 입출력 장치)
그 모든 것의 언어 역할을 하는 파일(입출력 장치).
프로세서가 입출력 장치에 따라
메인 메모리를 사용하여 처리하는 전반적 과정.
그러나 하나의 응용프로그램을 실행하는 순간 마저도,
커널 -> 응용프로그램 -> 커널,
순으로 context switching, 문맥 전환이 일어나면서 진행된다.
문맥은 이전에 실행하던 프로그램의 주소나 진행 내역인데,
(PC, reg, main.. 등에 저장함)
그런 것을 저장하여 마치 쭉 실행하고 있던 것처럼 진행한다.
궁금한 문제다...
그리고 하나의 응용프로그램을 실행할 때도,
하나의 공간에서 진행하는 게 아니라,
쓰레드 형태로 나누어서,
상황에 따라 빨리 처리하기 위해 나누어서 여러개의 쓰레드에서 실행하는 등이 가능하다.
이 쓰레드 간에 context thread를 공유....흠.
메인 메모리가 입출력 장치와 어떻게 소통하는지,
일종의 세로의 주소공간처럼 형상화하여 이해하는 개념.
아래일수록 유저의 입력이,
위일수록 시스템 자체의 코드가 담겨져있다.
맨 아래의 유저의 코드가,
그 위에는 유저의 파일이,
그 위에는 런타임 힙(아마 파일이 쓰는 함수, malloc같은걸 호출한다는 데 잘 모르겠고, 아무튼 그래서 프로세스에 따라 유동적으로 크기가 바뀐다.)
그 위에는 항상 쓰는 공유 라이브러리, 시스템 라이브러리가 있고,
그 위에는 시스템 스택, 즉, 함수가 호출되는 순서를 기억해두는, 복귀 주소등이 스택으로 쌓이는 게 있고(그래서 함수가 얼마나 쌓여있느냐에 따라 유동적으로 크기가 변화.)
맨 위에는 커널이 있다.
주로 이러한 가상 주소 공간이 있어서,
입력 자체가 엉뚱한 주소 공간에 들어가 시스템을 훼손하지않도록
방지책이 있긴 할 것이다.
그리고 모든 하드웨어가,
소통할 때 주고 받는 것이 파일이다.
단순히 바이트를 나열한 정보지만,
이러한 일률적인 메커니즘 때문에 하드웨어가 다른 기술을 쓰더라도
서로 호환되거나 소통할 수 있다.
네트워크도,
일종의 입출력 장치처럼,
클라이언트 서버에 입력하여,
값을 받아와, 출력하는 구조를 취할 수 있다.
아무리 많은 메모리를 차지한 시스템을 개선한다고 하더라도,
전반적인, 총체적인 시스템의 속도는 크게 늘지 않는다는 법칙.
심지어 0.6할인 것을 무한히 최적화하여도,
2배 정도밖에 늘지 않는다.
식이 있으나 생략.
동시에 처리하는 일, 등의 개념이 동시성,
그것을 진짜로 동시에 처리하도록 컴퓨터에서 동작하게 하는 게 병렬성.
쓰레드 자체를 늘려서,
빨리 처리한다.
단일 코어에서 여러 쓰레드를 쓰는 것도 방법이지만,
코어가 하나면 일단 하나씩밖에 실행하지 못하기때문에,
멀티 코어를 쓴다면,
각각의 코어가 여러개의 쓰레드를 처리할 수도 있고,
하나의 프로그램을 여러개의 쓰레드를 써서 빠르게 처리할 수 있다.
쓰레드가 늘어나면,
제어 흐름을 다수 가질 수 있어서,
다수의 사람이 접속하는 웹 서버 등을 운영하여 순서를 정하거나 통제할 수 있다..?
그리고 그 쓰레드 내에서,
인스트럭션을 소화하는 속도를 높인다.
하나의 인스트럭션 자체도,
병렬로 다수의 연산을 한꺼번에 진행하여
빨리 처리하도록 한다.
이러한 추상화는...
뭐 좋은가보지
아무튼 이 세 가지를,
전부 포괄하는 것을 따로 구현한다면,
그것을 가상 머신이라고도 할 수 있겠다.
끝!