CH02. 프로그램이 실행되었지만, 뭐가 뭔지 하나도 모르겠다.
2.1 운영 체제, 프로세스, 스레드의 근본 이해학
2.1.1 모든 것은 CPU에서 시작된다.
- CPU
-
- 메모리에서 명령어(instruction)를 하나 가져오고(dispatch)
-
- 이 명령어를 실행(execute)한 후 1로 돌아감
- PC(Program Counter) 레지스터
- 용량은 매우 작지만 속도는 매우 빠른 메모리
- PC 레지스터에 저장된 명령어 주소를 가지고 CPU는 메모리에서 명령어를 가져온다.
- PC 레지스터의 명령어 주소는 1씩 자동적으로 증가하므로, CPU는 주소를 하나씩 증가시키면서 차례대로 명령어를 실행한다.
- if else 또는 함수 호출 같은 명령어를 만나면 순차적인 실행순서는 파괴되므로, 이런 명령어를 실행할 때는 연산 결과 또는 명령어에서 지정한 점프할 대상 주소에 따라 PC레지스터 값을 동적으로 변경
- CPU가 실행하는 명령어는 메모리에 저장되어 있고, 메모리에 저장된 명령어는 디스크에 저장된 실행 파일에서 적재되고, 그 실행 파일은 컴파일러로 생성되며 그 컴파일러는 프로그램이 작성된 코드를 기반으로 명령어를 생성
- 코드 → 컴파일러가 실행파일로 생성 → 디스크에 실행파일 저장 → 실행파일의 명령어를 메모리에 적재 → CPU가 메모리로부터 실행
- 프로그램이 시작되면 main함수에 대응하는 첫 번째 기계 명령어를 찾고, 그 메모리 주소를 PC레지스터에 기록
2.1.2 CPU에서 운영 체제까지
- CPU가 프로그램을 실행하게 하려면 실행 파일을 수동으로 메모리에 복사한 후 main함수에 해당하는 첫 번째 기계 명령어를 메모리에서 찾아 그 주소를 PC 레지스터에 적재
- 위와 같이 직접 CPU에 프로그램을 실행하도록 하려면… 번거롭지만
- 프로그램을 적재할 수 있는 적절한 크기의 메모리 영역을 찾고
- CPU 레지스터를 초기화하고 함수의 진입 포인트를 찾아 PC 레지스터 설정
- 운영 체제가 없으면…
- 멀티태스킹 지원 X: 한 번에 하나의 프로그램만 실행할 수 있다.
- 사용할 하드웨어를 직접 특정 드라이버와 연결해야 한다.
- 라이브러리가 없으므로 직접 구현해야 한다.
- 상호 작용 인터페이스를 직접 구현해야 한다.
- 적재 도구(loader): 프로그램을 메모리에 적재
- 단일 코어 컴퓨터에서 실행 중인 프로그램들의 실행과 중지를 전환하며 반복하면 동시에 실행하는 것처럼 보이려면?
- 일시 중지 되었을 때 상태가 유지되도록 상태를 저장한다: 상황 정보(context)
- process: CPU가 어떤 기계 명령어를 실행했는지, CPU 내부의 기타 레지스터 값 등을 저장하는 구조체
- 모든 프로그램을 프로세스 형태로 관리하며, 일시 중지하거나 다시 시작할 수 있다.
- 적재 도구와 프로세스 관리 도구를 모아 둔 프로그램을 운영 체제(operating system)라고 한다.
- 실행 파일을 수동으로 적재하거나 유지 관리할 필요가 없어짐
2.1.3 프로세스는 매우 훌륭하지만, 아직 불편하다
2.2~2.4는 금방 할거예욧!
2.5 콜백 함수를 철저하게 이해한다