Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 파이썬 #python #Comprehension
- 파이썬 #python #전역변수 #지역변수 #eval
- 배포
- 파이썬 #python #file #i/o #input #output
- 사용자정의예외
- jsonb
- aws
- Git
- aw3
- 파이썬 #python #enumerate
- 파이썬 #python #filter #map #reduce
- EC2
- 파이썬 #python #가변매개변수 #키워드가변매개변수 #args #kwargs
- spring boot
- 파이썬 #python #예외처리 #exception
- 약수 수하기
- 연산자메서드
- redis
- 민감 정보 관리
- 파이썬 #python #함수 #function
- 파이썬 #python #지역함수
- 파이썬기본문법 #파이썬 #python
- 파이썬 #python #모듈 #module #import #random #time #calendar #sys
- 파이썬 #python #os #os.path #glob
- 파이썬 #python #docstring
- 파이썬 #python #class #클래스 #상속
- PostgreSQL
- 파이썬 #python #lambda #람다
- docker
- 프로그래머스
Archives
- Today
- Total
Yeonnnnny
[xv6] 데이터를 청크 단위로 읽다 본문
"데이터를 청크 단위로 읽는다"는 표현은 데이터를 한 번에 일정한 크기(block size)로 나누어 처리한다는 의미이다.
이해를 위해 readi() 라는 함수의 동작을 예로 설명해보겠다.
청크단위로 읽는 이유?
- 효율성
- 파일 데이터를 한 번에 전체를 처리하기보다는, 작은 크기(블록 또는 청크 단위)로 나누어 작업하면 메모리 사용을 최적화할 수 있다.
- xv6에서는 디스크 I/O 연산이 디스크 블록 (BSIZE, 512바이트) 단위로 이루어진다.
- 파일 크기와 디스크 블록 구조
- 디스크는 데이터를 블록 단위로 저장한다.
- 파일의 데이터가 여러 블록에 걸쳐 저장될 수 있으므로, 읽기 작업은 한 번에 블록 크기만큼 수행된다.
readi에서 청크 단위 읽기의 예
// tot : 지금까지 읽은 바이트 수, m : 현재 읽는 바이트 수
for(tot=0 ; tot < n ; tot += m, off += m, dst += m){
bp = bread(ip->dev, bmap(ip, off/BSIZE)); // 현재 블록을 읽어 옴
m = min(n-tot, BSIZE - off % BSIZE); // 현재 읽을 바이트 크기 계산
memmove(dst, bp->data+off % BSIZE, m); // 블록 데이터를 dst로 복사
brelse(bp); // 사용한 버퍼 해제
}
과정 설명
- off / BSIZE :
- 현재 읽으려는 오프셋이 위치한 디스크 블록 번호를 계산한다.
- 예 : 오프셋이 600이면, 이는 512 바이트 단위로 나눠서 1번째 블록에 해당한다.
- bread :
- 해당 블록의 데이터를 메모리 버퍼에 로드한다.
- min(n-tot, BSIZE - off % BSIZE)
- 현재 읽으려는 총 데이터 크기와, 현재 블록에서 읽을 수 있는 크기 중 더 작은 값을 계산한다.
- 예 : 총 600바이트를 읽으려고 한다면,
- 첫 번째 블록에서 읽을 수 있는 크기 : 512 - (600%512) = 512
- 두 번째 블록에서 남은 88바이트 읽는다.
- memmove
- 블록의 데이터를 계산된 크기만큼 dst에 복사한다.
- brelse
- 현재 사용한 블록 캐시를 해제하여 다른 작업이 디스크 캐시를 사용할 수 있도록 만든다.
청크 단위 읽기의 이점
- 메모리 효율성
- 한 번에 처리 가능한 메모리 크기만큼 작업을 수행하므로 메모리 낭비를 줄일 수 있다.
- 디스크 효율성
- 디스크는 데이터를 블록 단위로 읽고 쓰기 때문에, 한 번에 블록 크기만큼 작업하는 것이 I/O 성능을 최적화한다.
- 큰 파일 처리
- 파일이 메모리보다 클 경우, 데이터를 나눠서 처리하지 않으면 메모리 부족 문제가 발생할 수 있다.
결론
"데이터를 청크 단위로 읽는다"는
- 512 바이트 크기의 블록(청크)를 기준으로 데이터를 읽어오는 것이다.
- 파일이 여러 블록에 걸쳐 저장되어 있으면, 한 블록씩 데이터를 읽어 필요한 만큼 복사하고 작업을 진행한다.