대학원 랩실 면접을 대비해서 컴퓨터의 전체적인 개념원리에 대해서 정리했다. 특히 '초보 프로그래머가 꼭 알아야할 컴퓨터의 동작원리' 라는 책을 많이 참고 했다.
각각의 디바이스들은 버스라는 통로로 연결되어 있다.
이름 | 설명 |
어드레스 버스 | 메모리 주소가 전달된다 |
데이터 버스 | 데이터가 전달된다 |
제어 버스 | 제어정보가 전달된다 |
'소스프로그램 컴파일 → 기계어 코드로 변환(바이너리) → 메인 메모리에 적재(프로세스 상태) → CPU 에서 한줄씩 읽어서 실행'
이름 | 설명 |
제어장치 | 명령어를 해석하고 다른 장치들에게 동작을 지시한다 |
연산장치 | 덧셈, 뺄셈등의 연산을 한다 |
레지스터 집합 | 명령어를 실행하는 동안 필요한 정보들을 저장한다 |
이름 | 설명 |
어드레스 레지스터 | 메모리로 부터 데이터를 읽거나 데이터를 쓸 메모리 주소를 저장 |
프로그램 카운터 | 다음에 실행할 명령어가 저장될 메모리주소를 저장 |
데이터 레지스터 | 메모리에서 읽어온 데이터를 저장 |
명령어 레지스터 | 메모리에서 읽어온 명령어를 저장 |
어큐뮬레이터 | 연산에 사용되는 데이터를 저장 |
ex) 프로그램이 실행되는 예제
카운터 | 명령어 |
101 | LOAD 104 |
102 | ADD 105 |
103 | STORE 106 |
104 | 200 |
105 | 300 |
파이프 라이닝 | 명령어를 실행하는 과정을 여러단계로 나누어 여러 명령어를 동시에 실행함으로써 CPU 속도를 빠르게 하는 기술 |
처리 도중에 각 변수들의 값이 변할 수 있다. (a=b; c=a;)
처리 중간에 아무 동작도 하지 않는 NOP 명령어를 삽입한다. 명령어의 순서를 재배치한다.
수퍼스칼라 | CPU 내에 파이프라인을 여러개두어 여러 명령어를 동시에 실행하는 기술(병렬처리) |
자주 참조되는 프로그램과 데이터를 메인 메모리가 아닌 더욱 빠른 속도의 메모리에 저장해두면, 메모리 접근시간이 감소해 결국 프로그램의 실행시간이 단축될 것이다.(일반적으로 CPU 와 메인 메모리 사이에 위치한다. 최근에는 CPU 를 포함하고 있는 칩안에 위치하기도 한다. SRAM 으로 구현)
나중쓰기 방식 | 저장된 데이터가 바뀌더라도 캐시메모리상의 데이터만 수정되다가 더이상 데이터의 참조가 필요없게 되면 그때 메인 메모리에 저장 |
장점 | 메인 메모리에 반영하는 동작을 최소화 함으로써 성능이 좋음 |
단점 | 수정된 내용이 메인 메모리에 반영되지 않아 메인 메모리 데이터가 의미가 없음 |
즉시쓰기 방식 | 데이터가 바뀔때마다 메인 메모리의 데이터도 수정 |
장점 | 캐시 메모리와 메인 메모리가 항상 같은 데이터를 가짐 |
단점 | 너무 자주 메인 메모리에 접근하므로 성능 저하를 가져옴 |
각각의 CPU 마다 캐시메모리를 가지고 있다. 이 상태에서 하나의 데이터 값이 각각의 CPU 캐시 메모리마다 다를때 이때 데이터 값을 수정한 CPU 의 캐시 메모리를 제외한 다른 CPU 의 캐시 메모리는 '무효' 가 되고, 다시 말해 마지막으로 수정한 CPU 의 캐시 메모리만 '유효'가 되고 나머지는 모두 '무효' 상태가 된다.
운영체제는 각 프로세스의 관리를 위해 프로세스 콘트롤 블록(PCB) 을 생성한다.
스택 세그먼트 |
힙 |
데이터 세그먼트 |
텍스트 세그먼트 |
이름 | 설명 |
스택 세그먼트 | 함수를 실행할 때의 매개변수 또는 지역변수를 저장 |
힙 | malloc 등으로 메모리를 동적으로 할당할 때 사용 |
데이터 세그먼트 | 전역 변수를 저장 |
텍스트 세그먼트 | 프로그램 코드를 저장 |
부모 프로세스 FORK() : 자식 프로세스 생성(자신과 똑같은 프로세스를 복사)
부모 프로세스 EXEC() : 프로그램을 수행
가장 먼저 생성된 프로세스를 먼저 서비스(실행)하는 방식
여러 프로세스들이 CPU 를 조금씩 돌아가며 할당받아 실행되는 방식. 이때 프로세스들은 시간 할당량 동안 할당된다.
우선 순위가 가장 높은 프로세스 부터 서비스(실행)되는 방식. 우선순위가 같은 경우에는 FCFS 방식을 적용한다.
하나의 데이터를 여러개의 프로세스가 동시에 엑세스한다고 했을 때, 과연 어떤 방법으로 동기화를 시키는가?
가상메모리 | 메모리 공간보다 큰 프로그램을 실행하기 위하여 프로그램을 작은 단위로 쪼개서 실행시키는 방식 |
페이지 | 프로그램을 일정한 크기로 쪼개는 단위 |
페이징 | 페이지 단위로 메모리에 올리며 동작하는 것 |
페이지 테이블 | 프로세스마다 각 페이지가 메인 메모리의 어느 곳에 저장되어 있는지를 알려주는 테이블. OS가 운영 |
가상 주소는 '페이지 번호, 변위' 로 이루어져 있다. 실제주소를 구하기 위해서는 '페이지 프레임 시작주소 + 변위' 를 하면 된다.
가상 메모리의 크기가 커지면서, 페이지번호에 할당되는 비트수가 커지는 데, 이에 따른 메모리 낭비를 줄이기위해 사용한다.
다단계 페이지 가상주소는 '페이지 디렉토리 인덱스, 페이지 테이블 인덱스, 변위' 로 이루어져 있다.
프로그램을 페이지단위로 쪼갤때, 이 중 일부는 텍스트 세그먼트, 데이터 세그먼트의 일부가 될 것이다. 페이징을 사용할 경우, 논리적으로 독립된 내용들이 구분되지 못하고 하나의 페이지로 묶여 동작하는 문제점이 생긴다. 논리적으로 독립된 의미의 세그먼트 단위로 동작하는 메모리 관리기법이다.
디스크립터 테이블 | 각 세그먼트가 어느 영역에 저장되었는지와 크기 정보등을 운영체제가 테이블로 관리 |
가상주소는 '세그먼트 번호, 변위' 로 이루어져 있다. 실제주소를 구하기 위해서는 '세그먼트 시작주소 + 변위' 를 하면 된다.
메모리 할당이 불연속적으로 일어나기 때문에 큰 크기의 메모리 공간은 줄고, 작은 크기의 빈 메모리 공간이 늘어남으로써 세그먼트가 들어갈 수 있는 공간이 없어지는 문제
NTFS 든, EXT2 든 각 파일 시스템의 동일한 방식은 어떤 데이터 파일이 디스크에 저장될 때, 최대한 계층화적으로 파일의 정보(시간, 용량, INODE NUMBER 등)를 저장한다는 것이다. 이렇게 하는 것은 나중에 검색시간의 단축을 위함이다. 마치 DNS 를 보는 듯 하다.