C++로 나만의 운영체제 만들기 2장
운영체제 이론 중 프로세스, 스레드, 스택, 호출 규약을 알아보자
프로세스(process)
프로세스는 컴퓨터에서 실행되는 프로그램을 의미한다. 즉, 메모리에 적재돼 실행되는 프로그램인 것이다.
프로세스 컨텍스트(process context)
OS가 관리하는 프로세스 정보이다. 다음과 같은 종류가 있다.
- CPU 상태: CPU 레지스터, 현재 프로세스가 수행되고 있는 위치 등
- PCB(Process Control Block): 커널이 관리하는 프로세스 정보 구조체
- 가상주소공간 데이터: 코드, 데이터, 스택, 힙
PCB(Process Control Block)
PCB는 OS 커널의 자료구조로써 프로세스를 표현하기 위해 사용된다. 커널은 이걸로 프로세스를 관리한다. 다음과 같은 정보가 포함되어 있다.
- OS가 사용하는 정보: 프로세스 상태, PID, 스케줄링 정보, 우선순위
- CPU 수행 관련 정보: PC(Program Counter), 레지스터
- 메모리 정보: 코드, 데이터, 스택의 위치
- 파일 정보: 오픈된 파일 정보
프로세스 상태
컨텍스트 스위칭에 의해 프로세스의 상태가 변할 수 있다.
자세한 건 이 링크를 참조하자.
컨텍스트 스위칭(Context switching)
지금 실행하고 있는 프로세스의 실행을 멈추고 다른 프로세스의 컨텍스트를 가져와 실행하는 것이다. 즉, CPU가 한 프로세스에서 다른 프로세스의 PCB 정보로 스위칭되는 과정이다.
엄밀히 말해서 프로세스가 아니라 스레드단에서 발생한다.
스레드(Thread)
프로세스가 프로그램의 주체라면, 스레드는 프로세스의 실제 실행 단위이다. 프로세스는 여러 개의 스레드를 담고 있으며, 커널은 프로세스가 담고 있는 스레드를 관리해서 프로세스의 동작을 조정한다.
스레드 경합
자료구조나 데이터에 다수의 스레드가 접근하면 데이터 무결성에 문제가 생길 수 있다. 이러한 상태를 경쟁 상태 또는 경합 상태(Race condition)이라 부른다.
thread i가 저장한 S + x의 값을 thread j가 S + y로 바꿔놓음
이러한 문제를 해결하기 위해선 동기화를 적용해야 한다. 다음과 같은 동기화 객체를 쓰면 된다.
- critical section
- mutex
- semaphore
- spin lock
TCB(Thread Control Block)
TCB는 커널에서 스레드를 관리하기 위해 필요로 하는 정보를 담은 구조체이다. 다음과 같은 정보를 포함한다.
- 스레드 식별자
- 스택 포인터: 스레드의 스택을 가리킨다.
- 프로그램 카운터: 스레드가 현재 실행 중인 명령어의 주소를 가리킨다.
- 스레드 상태
- 레지스터
- 스레드를 담고 있는 프로세스의 PCB 포인터
스택(Stack)
스택은 선입후출 자료구조이다.
콜스택(Call Stack)
특정 함수가 호출될 때, 지역변수나 함수 파라미터가 저장되는 공간이다. 함수 실행이 끝나면 그 함수를 호출한 실행 코드의 위치로 돌아가야 하므로 해당 함수의 복귀 주소와 EBP 값이 필요하다. 이러한 값들의 모임을 스택 프레임(Stack Frame)이라 부른다.
- EBP(Extended Base Pointer) 레지스터: 스택 프레임의 시작 주소를 가리킨다.
- 즉, 호출된 함수가 로컬 변수를 선언하기 직전의 시작점이다.
- 현재 실행 중인 함수가 종료되면 이 함수를 호출한 함수의 EBP 값으로 변경된다(스택 프레임에 저장된 EBP 값).
- ESP(Extended Stack Pointer) 레지스터: 스택의 밑바닥을 가리킨다.
- 최초 함수가 호출되면 EBP와 ESP는 같은 값이고, 로컬 변수가 선언되면 ESP가 낮은 값으로 증가하며 스택이 커진다.
- ESP는 pop할 때 뽑아낼 데이터의 위치를 가리킨다.
호출 규약(Calling Convention)
스택을 정리하는 방법과 파라미터를 입력하는 방식을 통틀어 호출 규약이라 부른다.
참고로 naked라는 규약도 있는데 이것은 호출 시 스택 프레임을 형성하지 않는다. 이제는 못 쓰지롱 하하
네임 맹글링(Name Mangling)
Linking 과정에서 함수나 전역 변수의 이름이 일정한 규칙을 가진 채 변경되는 과정이다.




