컴퓨터 시스템 - 컴퓨터 시스템으로 여행
1장 컴퓨터 시스템
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
위와 같은 형식의 c언어는 한글자씩 바이트로 변환되는데 이를 아스키코드라고 한다.
- 아스키 코드: 한 문자(1바이트)를 숫자로 대응한 것 (1바이트 -> 8비트)
- 아스키 코드표: https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
컴파일 작동방식
c언어로 작성된 파일은 전처리 -> 컴파일 -> 어셈블러 -> 링커로 나뉜다. (컴파일의 일련과정)
- 전처리
#include <stdio.h>
위와 같은 라이브러리를 소스코드에 직접 삽입한다.
-
컴파일 어셈블리 언어로 번역하여 기계가 직접 동작을 실행할 수 있도록 변경한다.
-
어셈블러 기계어로 번역한다.
- 링커 해당 파일을 실행 가능한 목적 파일로 만들어준다. -> 실행가능
CPU (프로세서)
- PC(프로그렘 카운터): 메인메모리의 해독할 인스트럭션(명렁)을 가리킨다.
- ALU(수식/논리 처리기): 새 데이터와 주소값을 계산
- 레지스터 파일: 각각 고유의 이름을 갖는 워드 크기의 레지스터 집합
- PC가 가리킨 인스트럭션을 수행한다.
- PC값이 다음 인스트럭션 위치를 가리키도록 업데이트한다. (업데이트 대상은 랜덤)
CPU, PC는 메인메모리, 레지스터 파일, ALU 주위를 순환한다.
인스트럭션 요청에 의해 CPU가 실행하는 단순한 작업의 예
- 적재
- 저장
- 작업
- 점프
버스
데이터 통로 - 단위 워드(word)
- 1워드
- 32bit 컴퓨터 -> 4바이트
- 64bit 컴퓨터 -> 8바이트
메인메모리 (Random Acess Memory)
연속적인 바이트 배열
입출력장치
모니터, 키보드, 외장하드 등
hello 프로그램 실행
그림 참조
캐시
- 지역성 메모리
- 자주 접근되는 데이터 저장소
운영체제
- 하드웨어와 소프트웨어 사이에 존재하는 소프트웨어
- 응용프로그램들이 제멋대로 동작하는 것을 막기위해
- 복잡한 저수준 하드웨어 장치들을 조작하기 위해
운영체제 추상화
- 포식스: IEEE에서 명명한 유닉스 표준
- 입출력장치 - Files 추상화
- 메인메모리 + 입출력장치 - Virual Memory 추상화
- 메인메모리 + 입출력장치 + 프로세서 - Processes 추상화
프로세스
프로세서가 실행하는 운영체제 추상화 - 여러개 가능
- 동시: 문맥전환(Context Switching) 방법을 통해 교차 실행
- 컨텍스트(Context) - PC, 레지스터 파일, 메인 메모리의 현재값
동시성 프로세스
- 프로세스 A -> B
- 프로세스와 컨텍스트를 생성
- 컨텍스트를 넘김 (프로세스 A의 제어권 넘어감)
- 프로세스 A <- B
- 컨텍스트를 다시 넘김 (프로세스 A의 제어권 복구)
쓰레드(Thread) 각각의 쓰레드는 해당 프로세스의 컨텍스트에서 실행된다. 동일한 코드와 전역 데이터를 공유한다.
가상 메모리
각 프로세스는 가상주소 공간이라는 균일한 메모리의 모습을 지님
- 최상위 영역: 프로세스가 공통으로 사용하는 운영체제의 코드와 데이터를 위한 공간
- 힙(런타임 힙): 동적 공간
- 공유라이브러리: C 표준라이브러리, 수학 라이브러리 등의 공간
- 스택: 함수 호출을 구현하기 위해 사용하는 공간 (동적)
- 커널 가상메모리: 주소공간 맨 윗 부분, 응용프로그램들은 접근금지인 공간
파일
연속된 바이트들, 모든 입출력 장치들은 파일로 모델링한다.
동시성과 병렬성
- 동시성: 다수의 동시에 일어나는 일을 갖는 시스템
- 병렬성: 동시성을 이용해 시스템을 좀 더 빨리 만드는 기술
댓글남기기