- 프로그램을 실행하면 프로세스다.
- 커널은 프로세스를 관리한다.
- 커널은 프로세스마다 가진 고유 ID로 프로세스를 관리한다.
- 프로세스는 가상 주소를 사용한다.
- MMU에서 가상 주소가 실제 메모리 물리 주소로 변환된다.
- 프로세스마다 메모리를 할당받아 서로 독립된 가상 주소 공간을 가지고 있다.
UNIX V6는 여러 사용자가 시스템을 동시에 사용할 수 있다.
- PDP11/40의 물리 CPU는 한 개다.
- 실제 실행하는 프로세스는 한 개다.
- 다른 프로세스는 대기한다.
- Time Sharing System: 시분할 시스템
- 실행 가능 상태
- 실행 프로세스
- 대기 프로세스(실행 가능한 상태)
- 슬립 상태
- CPU 자원 해제 기다리는 프로세스
- 주변 장치에서 처리 끝나기 기다리는 프로세스
- 처리를 계속 진행하지 않는 프로세스
프로세서 모드 = 두 가지 모드.
- PSW: 모드 전환
- 사용자 모드
- 커널 모드
- MMU: 메모리 공간 전환. 가상 주소 공간 전환
- 사용자 공간: user space
- 커널 공간: kernel space
- 프로세스
- 사용자 프로세스: user process
- 커널 프로세스: kernel process
- 사용자 모드
- 커널 기능 사용 요구
- 시스템 호출
- PSW 모드 전환
- 커널 모드
- MMU 메모리 공간 전환
- 커널 처리
- PSW 모드 전환
- 사용자 모드
- MMU 메모리 공간 전환
시스템 부팅 시 생성된 프로세스가 처리
- Swap out: 스와핑 영역으로 이동
- 슬립 상태 프로세스
- 낮은 중요도 프로세스
- Swap in: 메모리로 이동
- 실행 가능 상태 프로세스
프로세스 정보 관리
- proc: 상태 정보. 메모리 상주
- user: 제어 정보. 스와핑 대상
프로세스마다 각각 한 개씩 할당
- /usr/sys/proc.h
#define NPROC 50
: /usr/sys/param.h#L18 = 50- status:
SSLEEP
,SWAIT
,SRUN
,SIDL
,SZOMB
,SSTOP
- flag:
SLOAD
,SSYS
,SLOCK
,SSWAP
,STRC
,SWTED
커널에서 항상 필요한 정보 포함
시스템 최대 프로세스 수 <= proc[] 엔트리 수 (50)
프로세스가 오픈한 파일이나 현재 디렉터리 정보 등 포함
실행 프로세스 외 user 구조체는 커널에서 필요하지 않다. 따라서 프로세스와 함께 스와프 아웃된다.
- m40.s#L813
커널 → 전역 변수 u
→ 실행 프로세스의 user 구조체 접근 가능
.globl _u
_u = 140000
연속된 두 개의 물리 메모리 영역을 할당 받음
- 텍스트 세그먼트
- 읽기 전용
- 여러 프로세스와 공유
- 프로그램 실행 코드를 담는다.
- 데이터 세그먼트
- 다른 프로세스와 공유 불가
- 프로그램의 변수 등을 담는다.
// /usr/src/sys/user.h
int u_tsize; /* 텍스트 세그먼트 크기. text size (*64) */
int u_dsize; /* 데이터 세그먼트의 데이터 영역 크기. data size (*64) */
int u_ssize; /* 데이터 세그먼트의 스택 영역 크기. stack size (*64) */
// /usr/src/sys/proc.h
struct proc
{
int p_addr; /* 데이터 세그먼트의 물리 주소. address of swappable image */
int p_size; /* 데이터 세그먼트의 크기. size of swappable image (*64 bytes) */
} proc[NPROC]; /* /usr/sys/param.h L18 */
proc.p_addr
: 데이터 세그먼트의 물리 주소proc.p_size
: 데이터 세그먼트 크기- PPDA (user struct + kernel stack area) + Data area + Stack area
커널 공간에서 사용한다.
가상 주소 공간에는 없다.
- user 구조체
- 커널 스택 영역: 커널의 작업 영역
// /usr/src/sys/param.h L62
#define USIZE 16 /* size of user block (*64) */
- 크기:
1 KByte
=USIZE 16
x64 Byte
- 210 = 24 x 26
- 변수 영역
- 전역 변수
- 정적 변수: bss
- 힙 영역
- 시스템 콜 호출 → 힙 영역 확장
- 방향:
0
→64 KByte
방향
user.u_dsize
- 함수의 매개변수
- 로컬 데이터
- 자동으로 확장:
0
←64 KByte
방향 user.u_ssize
MMU: 가상 주소 16 bit
→ 물리 주소 18 bit
- 가상 주소 공간
- = 용량:
64 KByte
- 가상 주소 크기:
16 bit
- = 용량:
- 물리 주소 공간
- = 용량:
256 KByte
- 물리 주소 크기:
18 bit
- = 용량:
- 최하위
0x0
: 텍스트 세그먼트 (크기:user.u_tsize
) - 데이터 세그먼트
0x0
+8 KByte
: 데이터 영역 (크기:user.u_dsize
)- 최상위
0xffff
: 스택 영역 (크기:user.u_ssize
)
- 물리 주소에 의존적이지 않다.
- 스와핑이 편리하다.
- 임의의 물리 주소로 할당될 수 있다.
- 프로세스의 메모리 접근을 관리할 수 있다.
- MMU 예외처리
- 할당받지 않은 메모리 영역에 접근할 때
- 접근 권한이 없는 영역에 접근할 때
- MMU 예외처리
- 메모리 효율이 높다.
- 물리 메모리를 분할하여 사용할 수 있다.
- 하지만, Unix V6은 안 된다.
- 연속된 두 개의 물리 메모리 영역을 할당 받음
MMU: 가상 주소 16 bit
→ 물리 주소 18 bit
가상 주소
+ user 구조체 → APR(PAR / PDR)
→ MMU → 물리 주소
- PDP-11/40: APR 2개
- 커널 모드: APR0 ~ APR7
- 사용자 모드: APR0 ~ APR7
- PSW의 모드 변경
- APR 변경
- MMU 가상 어드레스 공간 변환
- APR 한 쌍 → 한 페이지
- 블록 단위:
64 Byte
- 최대 블록 개수:
128
- 최대 할당 크기:
8 KByte
=128 블록
x64 Byte
8
x1 Kbyte
= 23 x 210 = 27 x 26
- 블록 단위:
- APR 8쌍 = 8 페이지
- 최대 할당 크기 =
64 KByte
=8
x8 KByte
- 최대 할당 크기 =
- 11 ~ 0: 베이스 주소 (*64)
- 페이지 블록 수
- 데이터 갱신
- 메모리 방향
- 읽기/쓰기 접근 제어
- 가상 주소 크기 =
16bit
- 3bit: 페이지 선택 = APR 쌍 선택
- APR의 PAR → 물리 주소의 베이스 블록 주소 (No.) 값
- 7bit: 가상 주소의 블록 No.
- 물리 주소의 베이스 블록 No. + 가상 주소의 블록 No. → 물리 메모리의 블록 주소 (No.)
- 5bit: 가상 주소의 블록 내 오프셋
- 3bit: 페이지 선택 = APR 쌍 선택
- 물리 주소 크기 =
18bit
- 12bit: 물리 메모리 블록 주소 (No.)
- 5bit: 가상 주소의 블록 내 오프셋