1.4.4 입력과 출력

23
1.4.4 입입입 입입 입입입 입입입

Transcript of 1.4.4 입력과 출력

Page 1: 1.4.4 입력과 출력

1.4.4 입력과 출력

아꿈사 박민욱

Page 2: 1.4.4 입력과 출력

자기 테이프에서 자료를 읽을 려고 할 때

구문 (1) "IN 1000(5)“

5 번 테이프 유닛 에서 100 개의 워드들을 읽어서 메모리 칸 1000-1999 에 넣는 과정을 시작 그 이후의 프로그램이 즉시 그 메모리 칸들을 참조 해서는 안 된다 .

Page 3: 1.4.4 입력과 출력

(a) 5 번 유닛을 참조하는 다른 I/O 연산 (IN, OUT, IOC) 이후

혹은 (b) 조건부 점프 명령 JBUS(5) 나

JRED(5) 에 의해 유닛 5 가 더이상 "사용 중 " 이 아님이 확실해 졌을때에만 애초의 입력이 완료 되었다고 가정

Page 4: 1.4.4 입력과 출력

IN 1000(5); JBUS *(5) <- 사용 중이면 점프

이 방법은 컴퓨터의 시간을 낭비 1000u 10000u 정도 왜냐하면 "JBU

S" 명령을 반복해서 실행 해야 하는데 소비해야 하기 때문이다 .

Page 5: 1.4.4 입력과 출력

이러한 시간을 계산에 활용할 수 있다면 속도를 올릴 수 있다 .

IN 2000(5) 첫 번째 블록을 읽기 시작한다 .

Page 6: 1.4.4 입력과 출력

이후 테이프 한 블록이 필요할 때 마다 명령 수행구문 (2)

ENT1 1000 MOVE 연산자 준비

JBUS *(5) 유닛 5 가 준비 될때까지 기다린다 .

MOVE2000(50) (2000-2049) -> (1000-1049)

MOVE2050(50) (2050-2049) -> (1050-1099)

IN 2000(5) 다음 블록을 읽기 시작한다 .

Page 7: 1.4.4 입력과 출력

계산 시간과 I/O 시간을 중첩시키는 방법을 버퍼링 이라고 한다 .

버퍼는 프로그래머가 I/O 자료를 담는 데 사용하는 메모리 영역을 의미

Page 8: 1.4.4 입력과 출력

구문 (2) 가 구문 (1) 보다 절대 좋은 것은 아니지만 좋지 않는 경우는 드물다 .

외부 프로그램이 장소 1000-1099 와 2000-2099 를 번갈아 참조하게 만드는

것이다 .

Page 9: 1.4.4 입력과 출력

한 버퍼 영역을 읽는 동안 프로그램은 다른 버퍼 영역에서 작업을 진행

다음 번에는 읽기용 버퍼를 작업용 버퍼로 ,

작업용 버퍼를 읽기용 버퍼로 사용

Page 10: 1.4.4 입력과 출력

입력에서 다음 워드를 얻되만일 현재 블록을 다 소비했다면 새 블록을 읽기 시작하는 서브루틴이다

01 WORDIN STJ 1F 복귀 장소를 저장한다 .02 INC6 1 다음 워드로 넘긴다 . 03 2H LDA 0, 6 버퍼의 끝에04 CMPA =SENTINEL= 도달 했는가 ?05 1H JNE * 아니라면 나간다06 IN -100, 6(U) 이 버퍼를 다시 채운다 . 07 LD6 1, 6 다른 버퍼로 교환하고 08 JMP 2B 돌아간다 .09 INBUF1 ORIG *+100 첫째 버퍼10 CON SENTINEL 버퍼 끝을 의미하는 경계값11 CON *+1 다른 버퍼의 주소12 INBUF2 ORIG *+100 둘째 버퍼13 CON SENTINEL 버퍼 끝을 의미하는 경계값14 CON INBUF1 다른 버퍼의 주소

Page 11: 1.4.4 입력과 출력

1) 경계 상수는 각 버퍼의 101 번째 단어에 나타난다 . 이런 경계 값을 이용하면 버퍼의 끝을 간편하게 점검 가능

2) 각 버퍼는 다른 버퍼의 주소를 담고 있다 . (07, 11, 14)

3) 이전 블록의 어떤 단어에 접근하기 전에 다음 번 입력이 시작되므로 JBUS 명령을 사용하지 않아도 된다 .

4) 서버루틴 (4) 가 제대로 작동하려면 , 프로그램 시작 시점에서 모든 것이 제대로 갖추어지게 만들 필요가 있다 .

5) WORDIN 서버루틴을 사용하는 프로그램의 이방에서는 테이프 유닛의 한 블록 길이가 100 워드가 아니라 1 워드로 보이게 된다 .

Page 12: 1.4.4 입력과 출력

다중 버퍼

단계 1. 블록 다섯 개를 연달아 빠르게 읽는다 .

단계 2. 그 자료를 기반으로 상당히 긴 계산을 수행한다 .

단계 3. 단계 1 로 돌아 간다 .

Page 13: 1.4.4 입력과 출력

ASSIGN... RELEASE... ASSIGN... RELEASE...

프로그램은 "ASSIGN" 이라는 행동과 "RELEASE" 라는 행동을 번갈아 수행하면서 그 사이 에서 버퍼 할당에 영향을 주지 않는 다른 계산을 처리하는 것이다 .

Page 14: 1.4.4 입력과 출력

카드 판독기를 다룬다고 가정하면 ASSIGN 행동은 프로그램이 새 카드에서 정보를 읽어야 함을 의미한다 .

RELEASE 행동은 현재 카드 이미지의 정보가 더 이상 필요하지 않을 때 일어 난다 .

Page 15: 1.4.4 입력과 출력

녹색은 그 영역이 ASSIGN 될 준비가 되었음을 뜻한다 .

노란색은 그 영역이 ASSIGN 되었고 아직 RELEASE 되는 않았음을 뜻한다 .

빨간색은 RELEASE 되었음을 뜻한다 .

Page 16: 1.4.4 입력과 출력

R R

GGG

G

NEXTR

NEXTG

Page 17: 1.4.4 입력과 출력

R R

YGG

G

NEXTR

NEXTG

Page 18: 1.4.4 입력과 출력

G R

YGG

G

NEXTR

CURRENTNEXTG

Page 19: 1.4.4 입력과 출력

G R

RGG

G

NEXTR

NEXTG

Page 20: 1.4.4 입력과 출력

1) NEXTG 가 NEXTR 을 지나치려고 할 때 -> 프로그램이 I/O 장치를 앞 지른 것

2) NEXTR 이 NEXTG 를 지나치려고 할 때 -> I/O 장치가 프로그램을 앞 지른 것

Page 21: 1.4.4 입력과 출력

n < N

A1

CURRENT <- NEXTGA2

NEXTG A3

ASSIGN N = 버퍼 전체 개수n = 현재의 빨간색 버퍼 개수

알고리즘 A (ASSIGN) A1. [n < N 이 될 때까지 대기 ] 만일 n= N 이면 n < N 이 될 될때까지 대기만일 n=N 이면 배정할 준비가 된 버퍼가 없다는 것이다 . A2. [CURRENT <- NEXTG] CURRENT <- NEXTG 로 설정한다 . A3. [NEXTG 를 전진 ] NEXTG 를 시계 방향의 다음 버퍼로 옮긴다 .

Page 22: 1.4.4 입력과 출력

N R1

ASSIGN

알고리즘 R (RELEASE)

R1. [n 을 증가 ] n 을 1 증가 시킨다 .

Page 23: 1.4.4 입력과 출력

B1

n = 0?B2

I/O B3

B4

NEXTR B5

n B6

알고리즘 B ( 버퍼제어 )B1. [ 계산 ] 주 프로그램이 짧은

시간 동안 계산을 수행하게 한다 B2. [n=0?] 만일 n=0 이면 B1 로

간다 . B3. [I/O 를 시작 ] NEXTR 이

가리키는 버퍼 영역과 I/O 장치 사이의 전송을 시작시킨다 .

B4. [ 계산 ] 주 프로그래밍이 일정 시간 동안 계산을 수행하게 한다 .

B5. [NEXTR 을 전진 ] NEXTR 을 시계 방향의 다음 버퍼로 이동한다 .

B6. [n 을 감소 ] n 을 1 감소하고 B2 로 간다 .