들어가기 전에
학교 수업 때 배운걸 다시 정리해서 쓴 글입니다.
오타 및 잘못된 부분 지적은 언제나 환영입니다!
주소 공간의 분리
프로세스 내부엔 각자의 역할끼리 모여있다.
이 역할은 메모리에 적재될 때 크게 3가지 영역으로 분리된다.
code : 코드를 실행 가능한 기계어 형태로 변환한 곳 이 부분이 변환되면 안 되기 때문에 읽기 전용이다.
data : 전역 변수와 정적 변수등 프로그램에서 사용되는 변수를 저장하는 부분. 변수는 런타임 중에도 바뀔 수 있기 때문에
일부 데이터는 쓰기가 된다.
stack : 함수가 호출되고 종료될 떄 사용되는 공간, 함수 선언에 필요한 매개변수나 복귀 주소를 담는다.
이 외에도, 초기화 되지 않은 변수 영역인 bss 영역이나 동적 할당 공간인 heap도 있지만
malloc같은 동적 할당의 경우 C89에서 생겼던 걸로 알고
맞는지 모르겠는데 예전 컴파일러에선 초기화 되지 않은 변수는 에러를 출력했던 걸로 안다.
그래서 대부분 code, data, stack 으로 크게 3가지로 본다.
이 영역들은 서로 간섭이 최소화 되는 메모리 영역에 할당된다.
정리하면 다음과 같다.
운영체제에서는?
운영체제도 메모리 위에서 cpu자원을 받는 프로세스이기 때문에
위에서 말한 영역별로 역할이 있다.
다만 일반 프로세스와는 다른 정보를 가지고 있다.
code : 커널 코드로, 시스템 콜이나 인터럽트 처리 코드가 있다
그 밖에 H/W, S/W 자원을 관리하기 위한 코드 등이 있다.
data : 자원을 관리하기 위한 자료구조가 저장된다.
특이하게도 변수가 아닌 PCB를 가지고 있는데
이 PCB는 현재 실행중인 프로세스별로 하나씩 가지고 있다.
그냥 시스템을 효율적으로 유지하기 위한 자료구조들을 가지고 있다.
stack : PCB와 마찬가지로 현재 실행중인 프로세스별로 스택 공간이 하나씩 있다.
프로세스는 H/W 자원에 접근하기 위해 커널 모드로 전환해 운영체제가 그 자원을 써야 하는데
컴퓨터가 실행되면 여러 프로세스가 동시에 돌아가고 동시에 커널 모드로 전활할 수 있다.
따라서, 각 프로세스별로 별도의 스택 공간을 할당해 그 안에서 시스템 콜이나 인터럽트를 처리한다.
'학교 > os' 카테고리의 다른 글
주소 변환 (0) | 2022.07.10 |
---|---|
문맥 교환(context switching) (0) | 2022.06.27 |
프로세스의 생성과 통신 (0) | 2022.06.26 |
DMA(Direct Memory Access) (0) | 2022.06.25 |
커널(Kernel) (0) | 2022.06.25 |