Chapter 3 : 화일 입출력 제어

Download Report

Transcript Chapter 3 : 화일 입출력 제어

3. 파일 입출력 제어
입출력 제어 환경에서 장치를 통한 파일의 입출력
과정을 살펴본다
3.1 입출력 제어 환경
운영 체제(operating system)
 다수 사용자를 위해 컴퓨터의 자원을 관리하는 S/W
사용자 프로그램
논리적 관점
운영 체제
보조 기억 장치
컴퓨터·IT공학부
물리적 관점
2
▶ 운영 체제의 기능
main memory management
process management
Job schedule
file management
- 파일 조직 방법을 제공
- 사용자의 I/O 명령문 (예, READ/WRITE)을 지정된 저급 I/O
명령어(예, GET/PUT)로 변환
 device management
- 물리적 저장장치에 대한 접근을 제공




입출력 제어 시스템 (I/O control system)
입출력 수퍼바이저 (I/O supervisor)
- 입출력 제어 환경을 제공
- 사용자와 보조 저장 장치간의 I/O를 제어하여 인터페이스를 제공
- 사용자의 논리적 관점의 I/O를 물리적 관점으로 사상하여 입출력
투명성( I/O transparency)을 제공
컴퓨터·IT공학부
3
▶ 입출력(I/O) 제어 시스템의 주요기능
1) 파일 디렉터리(파일 식별, 위치 정보)를 유지
2) 메인 메모리와 보조 저장장치 사이의 데이터 이동 통로(pathway) 확보
3) CPU와 보조 저장장치 사이의 통신을 조정
• CPU와 보조 저장장치 사이의 속도 차이 불균형을 조정
• CPU와 보조 저장장치 사이의 속도 차이 불균형을 조정
4) I/O로 사용될 파일 준비
5) I/O 완료 후의 파일 관리
컴퓨터·IT공학부
4
3.2 파일 디렉터리(1)
파일 관리 시스템
- 파일 디렉터리를 이용하여 시스템의 모든 파일을 관리
• 파일의 이름, 저장 위치, 파일 크기, 파일 타입 등의 정
보를 파일 디렉터리(file irectory)에서 관리
컴퓨터·IT공학부
5
3.2 파일 디렉터리(2)
파일 디렉터리의 구조(directory structure)
심벌 테이블
(symbol table)
유지
• 모든 파일에 지정된 심벌 이름으로 탐색
서브디렉터리
(subdirectory)
포함
• 다른 장치(디스크, 테이프)에 저장된 파일
한 레벨이나
여러 레벨의
계층 구조 구성
• 예: UNIX의 계층 디렉터리(hierarchical directory)
• 파일 식별을 위해 경로이름(pathname)을 사용
- 루트에서부터 원하는 파일에 이르는 디렉터리를 명세
- /mydir/addr
컴퓨터·IT공학부
6
▶ 디렉터리 구조의 예
계층 구조
컴퓨터·IT공학부
7
▶ 디렉터리를 이용한 연산
탐색(search)
특정 이름(symbolic name)의 파일을 찾기 위해
디렉터리 탐색
파일 생성
(create file)
파일을 디렉터리에 첨가
파일 삭제
(delete file)
디렉터리로부터 파일 삭제
리스트 디렉터리 디렉터리 내용과 파일에 대한 디렉터리 엔트리의
(list directory) 값을 표시
백업(backup)
컴퓨터·IT공학부
신뢰도를 위해서 백업 파일을 생성
테이프에 예비 사본(backup copy) 유지
8
3.3 입출력 장치 제어
 입출력 작업
 메인 메모리와 보조 저장장치 또는 라인 프린터와 같은
입출력 장치 사이의 데이터를 물리적으로 전송하는 것
 데이터의 판독/기록 작업 과정
i) 원하는 파일의 위치 탐색 (디렉터리)
ii) 메인 메모리와 입출력 장치 사이에 경로 설정
iii) 경로상의 요소들을 사용할 수 있는지 검사
iv) 입출력 장치에 I/O 연산 신호를 보냄
★ 신호를 받은 장치
 장치를 준비
 I/O 작업 도중에 발생하는 오류에 대처
 I/O 연산 뒤에 I/O 요청 장치에 작업의 성공 여부 보고
컴퓨터·IT공학부
9
▶ 입출력 채널(I/O channel)
 CPU 명령(채널 프로그램)으로 작동하는 입출력
처리기(I/O processor)
 채널 프로그램 (channel program)을 실행함으로써
I/O 장치를 제어하는 일종의 작은 컴퓨터
 채널 프로그램
- 채널이 수행하는 프로그램
- 장치의 접근이나 데이터 경로 제어에 필요한 연산들을 명세
- OS에는 I/O채널을 가동시키는 표준 루틴이 포함되어 있음
 장치 제어기(device controller)를 통해 I/O 장치를
간접적으로 운영
 입출력 연산을 위한 시스템 요소
CPU
메인 메모리
채널
채널
장치제어기
장치제어기
장치 1
장치 2
장치 3
장치 n
컴퓨터·IT공학부
10
▶ 입출력 채널(I/O channel)
 CPU 는 제어 명령어로 I/O 채널과 통신
i) 입출력 검사(test I/O) : 지정된 경로의 사용가능 검사
ii) 입출력 개시(start I/O): 입출력을 시작
iii) 입출력 중지(halt I/O) : 입출력을 중지
 작업이 완료되면 인터럽트(interrupt)로 CPU에 통보
 인터럽트는 불법적인 CPU 명령과 같은 오류 검출 시나 I/O
작업 완료 시에 발생
- 인터럽트가 발생하면 OS는 인터럽트 처리 루틴으로 제어를
전달/인터럽트 발생 원인을 규명하고/적절한 조치 후 원래
루틴으로 제어를 반환
컴퓨터·IT공학부
11
3.4 파일의 입출력 (1)
3.4.1 파일 기록(write) 연산
 프로그램에서의 write는 OS를 호출해서 작업을 수행함
 물리적 기록은 OS가 담당
1) 파일 관리자
- 파일에 관련된 작업과 입출력 장치를 취급하는 프로그램
- 프로그램의 데이터 레코드를 디스크 파일에 전송해서 저장하는데
필요한 모든 프로시저로 구성
- 파일의 디스크 할당 정보를 가지고 있는 파일 할당 테이블(FAT: File
Allocation Table)을 이용하여 파일의 어디에 레코드를 기록할
것인가를 결정
2) I/O 버퍼
- 파일 관리자는 메인 메모리에 디스크의 블록 판독을 위해
시스템 I/O 버퍼를 확보
- I/O 버퍼를 이용하여 레코드나 블록 크기로 판독/기록을 수행
컴퓨터·IT공학부
12
 파일의 입출력 (2)
3) I/O 채널
- I/O 처리 전담 장치 (I/O를 위한 작은 CPU)
- 파일 관리자로부터 채널 프로그램(channel program) 을
통해 작업 지시를 받고 독립적으로 운영
– Channel program: 데이터 버퍼, 데이터 양, 저장 위치
등을 지시하기 위한 I/O 프로그램
4) 디스크 제어기
- 디스크를 실제로 운영
- I/O 채널의 요청으로 디스크 드라이브 가용 여부를 점검
- 디스크 드라이브를 배정하게 되면 데이터를 한 비트씩
디스크 드라이브에 전송
- 기록 연산이 완료되면 I/O 채널을 통해 CPU에 제어를
반환하여 프로그램의 실행이 계속되도록 함
컴퓨터·IT공학부
13
 파일의 입출력(3)
3.4.2 파일 판독 연산
1)
2)
3)
4)
5)
프로그램에서 READ는 파일 관리자에 인터럽트를 발생
파일 관리자는 메인 메모리에 채널 프로그램 구성하고 I/O 채널 지정
지정된 채널이 채널 프로그램을 실행
I/O 채널은 디스크 제어기에 적절한 신호 전달
디스크 제어기는 이 신호를 해석해서 요청한 데이터를 판독할
디스크 드라이브를 제어
6) 디스크 드라이브는 전송 데이터의 경로를 통해 메인 메모리의
I/O 버퍼로 전송
7) I/O 채널은 인터럽트를 걸어 연산 완료를 보고하고 OS에
프로그램 실행 재개를 통보함
8) 파일 관리자는 제어를 원래의 프로그램으로 반환하여
실행을 계속시킴
컴퓨터·IT공학부
14
 파일 입출력(Read)
 프로그램의 READ 연산 수행 단계
프로그램
버퍼



파일 관리자
채널 프로그램

컴퓨터·IT공학부

채널


디스크
제어기

디스크
드라이브
15
 파일의 입출력 (4)
3.4.3 채널 명령어(1)
 I/O 채널은 프로그램으로 데이터 교류를 지시
 CPU는 데이터 전송을 위해 I/O 채널에 채널 프로그램 실행을 지시
 I/O 채널은 비정상적인 상황을 처리하기 위하여 인터럽트 발생
-
채널 프로그램과 디스크의 속도 조절을 위해 wait loop를 활용
 디스크에 대한 채널 프로그램 구성 명령어
 Search : 요구하는 데이터를 디스크에서 탐색
 Read : 레코드를 판독해서 메인 메모리 버퍼로 전송
 Write : 메인 메모리 버퍼로부터 데이터를 디스크로 전송
 Wait : 연산이 끝날 때까지 다음 read/write 명령어 실행을 지연
컴퓨터·IT공학부
16
 파일의 입출력 (4)-계속
3.4.3 채널 명령어(2)
 출력(기록) 연산 수행 단계
1) 데이터 전송을 위한 장치, I/O채널, 디스크 제어기를 선정
2) CPU가 채널 프로그램을 기동
3) I/O 채널은 메모리의 데이터를 요청하고 디스크 제어기로 데이터가
전송되도록 제어
4) 디스크 제어기는 디스크 드라이브에 적합한 형식으로 데이터를
코딩하여 전송
5) 디스크 드라이브는 데이터 기록
컴퓨터·IT공학부
17
 파일의 입출력 (5)
3.4.4 장치 제어기(device controller)의 기능
 채널 명령어(search, read, write 등)를 그 장치에
적합한 연산으로 번역해서 실행을 지시
 I/O 채널이나 파일 관리자에게 상태 정보를 제공
 장치 준비 여부, 데이터 전송 완료 등
 호스트 컴퓨터와 I/O장치 사이의 데이터 변환
 호스트 : 비트들의 병렬 전송
 I/O 장치 : 비트들을 직렬 전송
 데이터 전송시 에러 검사와 교정
 패리티 체크(parity check)의 제거와 복원
 에러 교정을 위한 코드
- CC(cyclic check characters)/CRC(cyclic redundancy check
characters)/ECC(error correction code) 등의 검사, 제거, 복원
컴퓨터·IT공학부
18
3.4.5 파일의 개방과 폐쇄(1)
 OPEN 문이나 첫 번째 READ 혹은 WRITE문과
연계하여 수행
i)
오퍼레이터에게 테이프 릴이나 디스크 등의 준비를 요구
ii)
필요한 채널 프로그램의 골격을 구성
iii) 레이블을 검사하여 파일이 입력을 위한 것인지 출력을 위한
것인지 확인
iv) 파일을 접근하는 사용자의 권한 검사
v)
파일을 위한 버퍼 구역을 구성
vi) 입력 파일에 대해 예상 버퍼링을 하는 경우라면
첫 번째 버퍼를 채움
vii) 파일 디렉터리에 파일 제어 정보를 기록
컴퓨터·IT공학부
19
3.4.5 파일의 개방과 폐쇄(2)
 CLOSE 문이나 프로그램 종료 시 자동으로 수행
(파일 재사용 준비)
i) 출력을 위한 버퍼 구역을 비움
ii) 버퍼와 채널 프로그램이 차지했던 메모리 구역을 반환
iii) 출력 파일에 파일 끝 표시(end-of-file mark)와
꼬리(tail) 레이블을 기록
iv) 저장 매체를 정리(rewind, dismount 등)
컴퓨터·IT공학부
20
3.5 버퍼 관리
 버퍼(buffer) :


디스크 파일에서 데이터를 읽어 들이는 메인 메모리의 일정 구역
버퍼 관리의 목적
- CPU와 보조저장장치의 성능 조정으로 시스템 활용을 최대화
 버퍼 관리자




제한된 메인 메모리의 버퍼 공간을 최적으로 분배
응용 프로그램의 요구에 따라 버퍼 공간 할당
할당된 버퍼 중에서 사용하지 않는 버퍼 공간을 관리
버퍼 요구량이 할당 가능 공간을 초과시
- 응용 프로그램을 지연
- 우선 순위가 낮은(또는 사용도가 낮은) 프로그램에 할당된 버퍼 공간 회수
 메모리 할당으로 발생하는 단편(fragmentation)의 최소화

파일 관리 시스템이 사용하는 블록의 크기와 OS가 버퍼에 사용하는
페이지의 크기를 동일하게 함
컴퓨터·IT공학부
21
(1) 단순 버퍼 시스템
 단순 버퍼
 하나의 파일에 하나의 버퍼만 할당
 응용 프로그램의 데이터 요구 시(on demand) 버퍼로 데이터
블록을 읽어 들임
 블록에 하나의 레코드가 저장된다고 가정
 버퍼의 논리적 구조
버퍼
채널 프로그램의 시작(주소)
데이타 구역
컴퓨터·IT공학부
22
▶ 버퍼를 채우는 채널 프로그램 구조
컴퓨터·IT공학부
23
▶ 예상 버퍼링 (anticipatory buffering)
 버퍼가 채워질 때까지 CPU(사용자 프로그램)가 유휴
상태(idle)로 되는 문제를 예방
 파일 관리자가 프로그램이 필요로 할 것으로 예측되는 데이터로
미리 버퍼를 가득 채워 놓음(prefetching)
- CPU는 버퍼가 채워질 때까지 기다릴 필요가 없음
 버퍼가 채워졌는지를 표시하는 플래그(full-flag)를 사용
 예상 버퍼링을 위한 버퍼 구조
버퍼
채널 프로그램의 시작
full_flag
단, 버퍼가 공백이면 full_flag=0
데이타 구역
컴퓨터·IT공학부
버퍼가 채워 있으면 full_flag=1
24
▶ 버퍼링을 위한 채널 프로그램
 버퍼를 채우고 비우는 채널 프로그램은
생산자(producer)와 소비자(consumer) 루틴 쌍으로
구성됨
 입력 파일에 대해
 생산자는 I/O 채널
 소비자는 CPU(응용 프로그램)
 출력 파일에 대해
 생산자는 CPU(응용 프로그램)
 소비자는 I/O 채널
컴퓨터·IT공학부
25
▶ 생산자/소비자 프로그램 구조
 생산자(Producer) 루틴
loop : if (full_flag = 1) goto loop;
//버퍼가 공백이 될 때까지 대기
issue start-I/O command to disk-controller;
//디스크 제어기에 I/O시작 명령을 내린다.
wait while buffer is being filled;
//버퍼가 채워지는 동안 대기
full_flag = 1;
goto loop;
 소비자(Consumer) 루틴
wait : if (full_flag = 0) goto wait;
//버퍼가 공백이면 대기
read buffer into work area;
//버퍼에 있는 레코드를 작업 구역으로 이동
full_flag = 0;
goto wait;
 초기에 full_flag=0으로하고 I/O 채널이 버퍼를 채우기 시작
컴퓨터·IT공학부
26
▶ 하나의 블록에 n개의 레코드(Bf = n)
 디블로킹(deblocking)
 n개의 레코드는 다시 한 레코드 씩 응용 프로그램의 작업
구역으로 이동해서 처리됨
 디블로킹을 위한 포인터로 record_counter를 사용
 버퍼 구조
버퍼
채널 프로그램의 시작
full_flag
record_counter
데이타 구역
n개의 레코드로 된 블록
단, 버퍼가 공백이면 full_flag = 0
그렇지 않으면 full_flag = 1
record_counter = 1,…, n
컴퓨터·IT공학부
27
디블로킹을 위한 생산자/소비자
 생산자 루틴
loop : if (full_flag = 1) goto loop;
//버퍼가 공백이 될 때까지 대기
issue start-I/O command to disk-controller;
//디스크 제어기에 I/O 시작 명령을 내린다.
wait while buffer is being filled;
//버퍼가 채워질 때까지 대기
record_counter = 1;
full_flag = 1;
goto loop;
 소비자 루틴
wait : if (full_flag = 0) goto wait;
read record(record_counter) into work area;
// record_counter가 지시하는 레코드를 작업 구역으로 이동
record_counter = record_counter + 1;
if (record_counter > n) full_flag = 0;
//n개의 레코드를 모두 처리해서 버퍼가 공백이 된 경우
goto wait;
 초기에 full_flag는 0으로 설정되고 I/O 채널이 버퍼를 채우기 시작
컴퓨터·IT공학부
28
(2) 이중 버퍼 시스템 (double buffer
system)
 파일당 두 개의 버퍼를 할당하여 운영
- 소비자가 하나의 버퍼를 비우는 동안 생산자는 다른 버퍼를 채움
- 생산 연산과 소비 연산이 순환,반복되면서 병행적으로 수행
 이중 버퍼 시스템 구조
버퍼1
버퍼2
next_buffer)
next_buffer
channel-program
channel_program
full_flag
record_counter)
full_flag
record_counter)
블록 데이타 구역
블록 데이타 구역
채널 프로그램의
시작
단, 버퍼가 비워 있거나 채워지고 있는 중이면 full_flag=0
버퍼가 채워졌거나 비워지고 있는 중이면 full_flag=1
record_counter=1,…, n
컴퓨터·IT공학부
29
이중 버퍼 시스템에서의 소비자/생산자
 2 개의 포인터를 추가로 사용
- to_fill : 현재 채워지고 있거나 다음에 채워야 할 버퍼에 대한 포인터
- to_pempty : 현재 비워지고 있거나 다음에 비워져야 할 버퍼에 대한 포인터
 생산자는 항상 to_fill이 가리키는 버퍼를 채움(초기에는 버퍼1을 지시)
 초기에는 두 버퍼가 모두 공백(full_flag는 모두 0)
 생산자
 입력 파일에 대하여 채널은 생산자가 되어 생산자 루틴을 실행
 항상 to_fill이 가리키는 버퍼를 채움
loop : if (to_fill.full_flag = 1) goto loop;
//to_fill.buffer가 공백이 될 때까지 대기
issue start-I/O command to disk-controller;
//디스크 제어기에 I/O 시작 명령을 내린다.
wait while to_fill.buffer is being filled;
// to_fill.buffer가 채워질 때까지 대기
to_fill.rec_ctr = 1;
to_fill.full_flag = 1;
to_fill = to_fill.next_buffer;
// to _fill은 다음에 채워져야 할 버퍼를 지시
goto loop;
컴퓨터·IT공학부
30
이중 버퍼 시스템에서의 소비자/생산자
 소비자
 입력 파일에 대해 CPU(사용자 프로그램)는 소비자가 되어
다음과 같은 소비자 루틴을 실행
 소비자는 항상 to_empty가 가리키는 버퍼를 비움
wait : if (to_empty.full_flag = 0) goto wait;
//to_empty.buffer가 채워질 때 까지 대기
read record[to_empty.record_counter] into work area;
//to_empty.record_counter가 지시하는 레코드를
//작업 구역으로 이동
to_empty.record_counter = to_empty.record_counter + 1;
if (to_empty.record_counter > n) {
//n개의 레코드를 모두 처리해서 공백이 된 경우
to_empty.full_flag = 0;
to_empty = to_empty.next;
//to_empty는 다음에 비워야 할 버퍼를 지시
}
goto wait.
컴퓨터·IT공학부
31
 Unix에서의 입출력
 UNIX 에서는 파일을 단순히 일련의 바이트(sequence of
bytes)로 가정
 디스크 파일, 키보드, 콘솔 등 물리적 장치도 모두 파일로 취급
 하나의 UNIX 파일은 하나의 정수(integer)로 표현되는 파일
기술자로 표현
 파일 기술자 (file descriptor)
 정수로 모든 파일을 표현(0, 1, 2 등)
 파일 세부 정보를 저장하고 있는 배열의 인덱스 역할
- 키보드(표준 입력 파일, stdin) : 0
- 출력화면(표준 출력 파일, stdout) : 1
- 에러를 출력하는 표준 에러 파일(stderr) : 2
- 사용자가 개방한 파일 : 정수 3부터 부여
컴퓨터·IT공학부
32
Unix 프로세스와 커널
 프로세스(processes)
 실행 중인 프로그램(시스템 내부의 단위)
 Unix 최상위 I/O계층의 구성요소로서 파일을 논리적으로 취급
 Shell 루틴, 라이브러리 루틴, 사용자 프로그램
- Shell은 사용자와 unix 사이의 인터페이스를 제공하는
command interpreter
 커널(kernel)
 프로세스 계층 이하의 모든 하부 계층을 통합
 모든 I/O를 바이트 순열 위에서의 연산으로 취급
컴퓨터·IT공학부
33
▶ Unix 파일 I/O
 디스크 파일에 하나의 문자를 기록한다고 가정

응용 프로그램이 파일에 하나의 문자를 기록하라는 명령문 write
(fd, &ch, 1)을 실행하면 시스템 호출 인터페이스(system call
interface)를 통해 커널이 즉시 기동됨.
-
System call interface: 프로세스가 커널과 직접 통신하도록
해주는 루틴

커널 I/O 시스템은 파일 이름을 파일 시스템의 파일과 연결시키는
것으로 작업을 시작함. 이 때 4개의 테이블을 이용
컴퓨터·IT공학부
34
Unix I/O를 위한 테이블(1)
1. 파일 기술자 테이블(file descriptor table)
 각 프로세스가 사용하는 파일 기록 테이블
 프로세스당 하나의 파일 기술자 테이블
2. 개방 파일 테이블 (open file table)
 현재 시스템이 개방하여 사용중인 모든 파일에 대한 엔트리로
구성
- 엔트리 : 판독/기록 형식, 사용 프로세스 수, 다음 판도/기록 연산을
위한 파일 오프셋, 이 파일 작업에 사용할 수 있는 일반 함수들의
포인터
 Unix 시스템 전체에 하나
컴퓨터·IT공학부
35
Unix I/O를 위한 테이블(2)
3. 파일 할당 테이블(file allocation table)
 실제로는 인덱스 노드(index node) 구조의 일부
 파일에 할당된 디스크 블록 리스트를 포함
4. 인덱스 노드 테이블(index node table)
 현재 사용되고 있는 파일 당 하나의 엔트리(inode)로 구성
 각 엔트리는 파일과 함께 디스크에 저장되어있는
inode( index node)의 사본
 inode에는 파일의 저장 위치, 크기, 소유자 등 파일 접근에
필요한 정보가 저장
컴퓨터·IT공학부
36
▶ 파일 기술자 테이블과 개방 파일 테이블
화일
기술자 테이블
(프로세스당 하나)
화일
기술자
개방화일
테이블
엔트리
0(키보드)
1(화면)
2(에러)
3(일반화일)
4(일반화일)
개방 화일 테이블
(UNIX 전체에 하나)
R/W 화일사용 다음접근 Write
…
모드 프로세스수 오프셋 루틴포인터
…
write
…
…
1
…
…
100
…
inode
테이블
엔트리
…
…
…
…
…
…
…
컴퓨터·IT공학부
37
Inode 테이블 구조
소유자 ID
inode 테이블
파일 할당 테이블
컴퓨터·IT공학부
장치
그룹
파일
접근
파일
파일
파일
블록
파일
이름
유형
권한
접근 시간
참조 포인터 수
크기 (블록수)
카운트
할당 테이블
데이터 블록번호 0
데이터 블록번호 1
…
데이터 블록번호 9
38
▶Unix에서의 파일 입출력
예) 파일 기술자 값이 3인 파일의 레코드 판독 명령
1) 프로그램의 파일 기술자 테이블에서 개방 파일 테이블을
이용, 개방 파일 테이블의 해당 엔트리를 검색
2) 개방 파일 테이블에서 inode 테이블 포인터를 이용, inode
테이블의 해당 엔트리(inode)를 검색
3) inode 테이블에서 해당 파일의 데이터가 저장된 디스크
블록의 주소를 얻어 디스크에서 데이터 블록을 판독
컴퓨터·IT공학부
39
▶파일 이름과 디스크 파일의 연결
 디렉터리 구조

파일 이름과 디스크에 저장되어있는 그 파일의 inode에 대한
포인터로 구성

Inode에 대한 포인터는 그 파일 이름으로부터 그 파일에 대한
모든 정보에 대한 직접 참조를 제공

파일이 개방되면 그의 inode를 메모리(inode 테이블)로 가져오고,
포인터를 이용하여 개방 파일 테이블에 해당 엔트리를 추가

여러 파일 이름이 같은 inode를 사용, 하나의 파일이 여러 개의
이름으로 사용됨을 의미(삭제시 포인터 수만 감소)
파일 이름
inode 포인터
…
…
Unix 디렉터리 파일
컴퓨터·IT공학부
40