블로그 이미지
No pain, no gain!
lepoussin

Tag

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

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 31
  • total
  • today
  • yesterday
05-17 17:11
1. 기본적인 SELECT 문

※ 출처: Beginning SQL Server 2005 Programming
posted by lepoussin
1. 온라인 도움말

※ 출처: Beginning SQL Server 2005 Programming
posted by lepoussin

1. 데이터베이스 개체의 개요

※ 출처: Beginning SQL Server 2005 Programming

posted by lepoussin
2007. 3. 8. 07:58 Lecture/열혈강의 Python
1. 파일쓰기
  - open(file) 내장 함수로 파일 객체를 얻음
  - 얻어진 파일 객체서 자료를 읽고 씀
  - close로 객체 사용을 종료(생략 가능)
>>> s = '''
Its power: Python developers typically report
they are able to develop application in a half
to a tenth the amount of time it takes them to do
the same work in such langueges as C.
'''
>>> f = file('t.txt', 'w')
>>> f.write(s)
>>> f.close()


2. 파일 읽기

>>> f = file('t.txt') # 두 번째 인수 생략 시, 읽기 모드로 동작
>>> s = f.read()
>>> print s

Its power: Python developers typically report
they are able to develop application in a half
to a tenth the amount of time it takes them to do
the same work in such langueges as C.

3. 라인 단위로 파일 읽기
  - 파일 객체의 반복자(Iterator) 이용하기(가장 효과적인 방법)

>>> f = open('t.txt')
>>> for line in f:
 print line,

  - readline : 한 번에 한 줄씩 읽는다.

>>> f = open('t.txt')
>>> line = f.readline()
>>> while line:
 print line, # line 자체에 \n이 포함되어 있어 콤마(,)를 사용
 line = f.readline()

  - readlines : 파일 전체를 라인 단위로 끊어서 리스트에 저장한다.

>>> f = open('t.txt')
>>> for line in f.readlines():
 print line,

  - xreadlines : readlines와 유사하지만 파일 전체를 한꺼번에 읽지는 않고, 필요할 때만 읽어서 공급한다. 큰 파일을 for 문으로 라인 단위로 읽을 때 편리하다.

>>> f = open('t.txt')
>>> for line in f.xreadlines():
 print line,

4. 라인 단위로 파일 쓰기

>>> lines = ['first line\n', 'second line\n', 'third line\n']
>>> f = open('t1.txt', 'w')
>>> f.writelines(lines)
>>>
>>> lines = ['first line', 'second line', 'third line']
>>> f = open('t1.txt', 'w')
>>> f.write('\n'.join(lines))

※ 단어의 수 구하기

>>> n = len(open('t.txt').read().split())
>>> print n
35

※ 라인의 수 구하기

>>> len(open('t.txt').readlines())
5
>>> open('t.txt').read().count('\n')
5

※ 문자의 수 구하기

>>> f = open('t.txt')
>>> len(f.read()) # 줄바꾸기 : '\012'
182
>>> os.path.getsize('t.txt') # 줄바꾸기 : '\015\012'
187L

5. 파일에서 원하는 만큼의 문자 읽기

>>> f = open('t.txt')
>>> f.read(10) # 10바이트 만큼만 읽기
'\nIts power'
>>> f.read(10)
': Python d'

6. 파일 처리 모드
  - 'r' : 읽기 전용
  - 'w' : 쓰기 전용
  - 'a' : 파일 끝에 추가(쓰기 전용)
  - 'r+' : 읽고 쓰기
  - 'w+' : 읽고 쓰기(기존 파일 삭제)
  - 'a+' : 파일 끝에 추가(읽기도 가능)
  - 'rb' : 이진 파일 읽기 전용
  - 'wb' : 이진 파일 쓰기 전용
  - 'ab' : 이진 파일 끝에 추가(쓰기 전용)
  - 'rb+' : 이진 파일 읽고 쓰기
  - 'wb+' : 이진 파일 읽고 쓰기(기존 파일 삭제)
  - 'ab+' : 이진 파일 끝에 추가(읽기도 가능)
※ 플랫폼에 의존하지 않는 코드를 작성하려 한다면 이진 파일을 다룰 때 b 플래그를 사용하는 것이 좋다.

7. 임의 접근 파일
  - seek(n) : 파일의 n번째 바이트로 이동
  - seek(n, 1) : 현재 위치에서 n바이트 이동(n이 양수이면 뒤쪽으로, 음수이면 앞쪽으로 이동)
  - seek(n, 2) : 맨 마지막에서 n바이트 이동(n은 보통 음수)
  - tell() : 현재의 파일 포인터 위치를 돌려줌

>>> fn = 't.txt'
>>> f = open(fn, 'w+')
>>> s = '0123456789abcdef'
>>> f.write(s)
>>> f.seek(5)
>>> print f.tell() # 현재 위치를 돌려줌
5
>>> print f.read(1) # 1바이트 읽기
5
>>> f.seek(-3, 2) # 끝부터 앞으로 3번째 지점
>>> print f.tell()
13
>>> print f.read(1)
d

8. 파일 객체 속성들
  1) 기본 파일 메쏘드
    - file.close() : 파일을 닫는다. 더 이상 입ㆍ출력할 수 없게 된다.
    - file.read([size]) : 원하는 바이트 수만큼 파일에서 읽어 온다. 인수를 지정하지 않으면 전체 파일을 읽어 온다.
    - file.readline([size]) : 라인 하나를 읽어 들인다. size가 지정되면 읽을 수 있는 최대 바이트 수가 된다.
    - file.readlines() : 전체 라인을 readline()을 이용하여 읽어 들인 라인을 리스트에 넣어서 리턴한다.
    - file.write(str) : 문자열 str을 파일에 쓴다.
    - file.writelines(list) : 문자열 리스트를 파일에 쓴다. 줄바꾸기가 자동으로 삽입되지는 않는다.
    - file.seek(offset[, whence]) : whence의 기본 값은 0이다. 0이면 시작 기준, 1이면 현재 위치 기준, 2이면 끝 기준에서 offset만큼 떨어진 위치에 파일 포인터를 위치시킨다.
    - file.tell() : 파일의 현재 위치를 리턴한다.
  2) 기타의 파일 메쏘드
    - file.flush() : 버퍼가 다 채워지지 않았어도 내부 버퍼의 내용을 파일에 보낸다.
    - file.fileno() : file 객체의 파일 기술자(File Descriptor)(정수)를 리턴한다.
    - file.isatty() : 만일 file 객체가 tty와 같은 장치이면 1이면 0을 리턴
    - file.truncate([size]) : 파일 크기를 지정된 크기로 잘라 버림. 인수를 주지 않으면 현재 위치에서 자른다.
  3) 파일 객체 속성
    - file.closed : file이 close 되었으면 1 아니면 0
    - file.mode : 파일이 오픈된 모드
    - file.name : open()할 때 사용된 파일 이름
    - file.softspace : 1이면 print문을 사용할 때 값 출력 사이에 자동적으로 스페이스가 출력됨. 0이면 스페이스가 자동으로 삽입되지 않음

9. 파일 입ㆍ출력 예제

## 지정한 파일의 특정 문자열을 다른 문자열로 변환
# @file repalce.py

import sys  # argv를 위해서 사용
import re   # 정규식 처리 모듈, subn을 위해서 사용

def replace(fName, srcStr, desStr):
    f = open(fName)
    txt = f.read()
    txt = re.subn(srcStr, desStr, txt)[0]
    return txt

if __name__ == '__main__':
    if len(sys.argv) != 4:
        print '''Usage : replace fileName srcStr desStr'''
        sys.exit()
    print replace(sys.argv[1], sys.argv[2], sys.argv[3])


10. 표준 입ㆍ출력 방향 전환
  1) 표준 출력을 파일로 저장하기
    - 출력 방향 전환하기

import sys

f = open('t.txt', 'w')
stdout = sys.stdout # 표준 출력 파일 저장해 두기
sys.stdout = f  # 파일 객체로 변경
print 'Sample output'
print 'Good'
print 'Good'
f.close()
sys.stdout = stdout # 필요하면 복구

    - print 문을 직접 이용하기

>>> import sys
>>> print >> sys.stderr, 'Warning: action filed not supplied'
Warning: action filed not supplied
>>> f = open('t.txt', 'w')
>>> print >> f, 'spam string'
>>> f.close()


  2) 표준 출력을 문자열로 저장하기

import sys
import StringIO

stdout = sys.stdout # 표준 출력 파일 저장해 두기
sys.stdout = f = StringIO.StringIO()    # 출력 파일 방향 전환

print 'Sample output'
print 'Good'
print 'Good'

sys.stdout = stdout # 표준 출력 복구
s = f.getvalue()    # 내부 문자열 가져오기

print 'Done-----'
print s

  3) 문자열을 파일 객체처럼 읽어 내기

try:
    import cStringIO    # 빠른 처리를 원한다면 C 버전 모듈인 cStringIO 사용
    StringIO = cStringIO
except:
    import StringIO
s = '''
Python is a cool little language.
It is wall designed, compact, easy to learn and fun to program in.
'''
f = StringIO.StringIO(s)    # 문자열 객체에서 파일 객체 얻어내기
print f.read().upper()  # 대문자로 변환


11. 지속 모듈 : 프로그램이 종료되고 나서도 존재하게 하고, 그 후에 다시 그 데이터를 프로그램에서 사용
  1) 종류
    - DBM 관련 모듈
    - pickle 모듈
    - marshal 모듈
    - shelve 모듈
  2) DBM 파일 관련 모듈 사용하기
    - anydbm, dbm, gdbm, dbhash, dumbdbm 등
    - anydbm 모듈 : 사용 가능한 DBM 호환 가능 최적의 모듈을 찾아 준다.
    - 키에 의한 참조(인덱싱)로 파일에서 자료를 읽어 오고, 인덱싱으로 치환하는 것으로 파일에 자료를 저장
    - 키와 값은 반드시 문자열이어야 한다.

>>> import anydbm
>>> f = anydbm.open('music', 'c') # 'c'(create)는 파일이 없으면 생성, 있으면 읽기로 오픈
>>> f['flute'] = 'wood wind' # 인덱싱으로 치환
>>> f['violin'] = 'string'
>>> f['piano'] = 'keyboard'
>>> f.keys() # keys() 메쏘드
['flute', 'violin', 'piano']
>>> f.values()
['wood wind', 'string', 'keyboard']
>>> f.items()
[('flute', 'wood wind'), ('violin', 'string'), ('piano', 'keyboard')]
>>> len(f) # 레코드 수
3
>>> 'oboe' in f # 멤버십 테스트
False
>>> f['flute'] # 인덱싱으로 값 읽어 오기
'wood wind'
>>> f['violin']
'string'
>>> f.close() # 파일 닫기
>>> ========================== RESTART ==========================
>>> import anydbm
>>> f = anydbm.open('music', 'c') # 'music' 파일 열기
>>> f.keys() # 키 목록 얻기
['flute', 'violin', 'piano']
>>> for k in f: # 전체 내용 출력
 print k, f[k]

flute wood wind
violin string
piano keyboard

>>> f['oboe'] = 'wood wind' # 내용 추가
>>> f['piano'] = 'keyboard instrument' # 내용 변경
>>> del f['violin'] # 내용 삭제
>>> for k in f: # 다시 전체 내용 출력
 print k, f[k]

flute wood wind
piano keyboard instrument
oboe wood wind


  3) 피클링
    - 모든 객체 저장
    - 재귀적 관계도 모두 처리
    - import pickle(또는 cPickle) : 모듈 import
      pickle.dump(출력할 객체, 파일 객체) : 파일로 객체 출력
      object = pickle.load(파일 객체) : 파일에서 객체를 읽어들임
      s = pickle.dumps(출력할 객체) : 문자열로 객체 출력
      object = pickle.loads(s) : 문자열에서 객체를 읽어들임
    - 장점 : 디버깅을 쉽게하고 문제가 생겼을 때 일반 텍스트 에디터로 복구를 쉽게할 수 있다.
    - 단점 : 파일 크기도 크고 또한 처리 속도도 느리다.
    ※ cPickle 모듈은 pickle 모듈과 같은 인터페이스를 가지고 있지만 약 1000배 빨리 수행되도록 설계되었다.

## pickle sample

# @file pickleSample1.py
try:
    import cPickle
    pickle = cPickle
except:
    import pickle

phone = {'tom': 4358382, 'jack': 9465215, 'jim': 6851325, 'Joseph': 6584321}
List = ['string', 1234, 0.2345]
Tuple = (phone, List)   # 리스트, 튜플, 사전의 복합 객체

f = open('t2.txt', 'w') # 파일 객체를 얻는다.

pickle.dump(Tuple, f)   # 파일로 복합 객체 출력(pickling)
f.close()

f = open('t2.txt')

x, y = pickle.load(f)   # 파일에서 읽어 오기(unpickling)
print x # x는 사전
print y # y는 리스트


# @file pickleSample2.py
try:
    import cPickle
    pickle = cPickle
except:
    import pickle
class Simple:   # 가장 단순한 클래스를 정의
    pass

s = Simple()    # 인스턴스 객체 생성
s.count = 10    # 인스턴스 이름 공간에 변수 생성

f = open('t3.txt', 'w') # 인스턴스 저장
pickle.dump(s, f, 1)    # bin=1 : 이진 모드로 저장
f.close()

f = open('t3.txt')
t = pickle.load(f)  # 인스턴스 가져오기

print t.count




 

posted by lepoussin
1) 캐시의 목적 : 느린 메모리 때문에 발생되는, 프로세서 코어에 가해지는 메모리 액세스 병목 현상(bottleneck)의 감소
2) 쓰기 버퍼
  - 프로세서 코어와 주 메모리 사이에 놓여 있는 매우 작은 FIFO 메모리
  - 주메모리에 쓰는 것과 관련된 느린 쓰기 시간으로부터 프로세서 코어와 캐시 메모리를 자유롭게 하는데 있음.
3) 캐시의 단점 : 프로그램의 실행 시간을 결정하기가 어려워진다.

12.1 메모리 계층 구조와 캐시 메모리
  1) 메모리 계층 구조 : 주변의 기술에 의존해 있기 때문에 아키텍처 설계에 많이 의존
    - 칩 : 프로세서 코어 내 레지스터 파일
    - 보드 : 주메모리(TCM, SRAM, DRAM, 플래시와 다른 보드 레벨 비휘발성 메모리)
    - 디바이스 : 보조 기억 장치(디스크, 테이프, 네트워크 저장 장치)
  2) 캐시 메모리
    - 레벨(L1) 캐시(기본 캐시) : 가장 낮은 레벨에서부터 코드와 데이터를 임시로 저장하는 고속의 온칩 메모리
    - 레벨(L2) 캐시(보조 캐시) : L1 캐시와 더 느린 메모리 사이에 위치
    - 쓰기 버퍼 : 캐시로부터 주메모리에 쓰기를 지원하는 매우 작은 FIFO 버퍼
    - 캐시 라인 : 주메모리와 캐시의 관계에서 더 느린 주메모리 사이에 전송하는 데이터의 작은 블록

12.1.1 캐시와 메모리 관리 장치
  1) 논리 캐시(가상 캐시)
    - 가상 주소 공간 안에 데이터를 저장
    - 프로세서와 MMU 사이에 위치
    - StrongARM, XScale, 제품군 ARM7 ~ ARM10
  2) 물리 캐시
    - 물리 주소를 사용해서 메모리에 저장
    - MMU와 주메모리 사이에 위치
    - 프로세서가 메모리를 액세스하기 위해서는 MMU는 먼저 가상 주소를 물리 주소로 변경해야 함
    - ARM11 제품군
  3) 캐시의 의한 성능 향상
    - 가능 이유 : 컴퓨터 프로그램이 랜덤하지 않은 방식으로 실행되기 때문(예측 가능)
    - 참조의 지역성 : 컴퓨터 소프트웨어 프로그램은 데이터 메모리의 집약되어 있는 부분에서 작은 코드들이 반복적으로 실행
    - 시간과 공간에서의 반복적인 국부적 참조성을 사용 : 시간적 지역성(temporal locality), 공간적 지역성(spatial locality, 주소의 근접성에 의해 참조)

12.2 캐시 아키텍처
  1) 폰노이만 아키텍처 : 통합 캐시(uified cache)
  2) 하버드 아키텍처 : 분할 캐시(split cache)
  3) 캐시의 주요 요소
    - 캐시 컨트롤러 : 캐시 메모리의 일부분을 선택하기 위해 메모리를 요청하는 동안 프로세서에 의해 이슈되는 주소의 다른 부분을 사용
    - 캐시 메모리 : 캐시 라인이라는 장치 안에서 액세스되는 전용 메모리 열

12.2.1 캐시 메모리의 기본 아키텍처
  1) 캐시 라인의 구성
    - 디렉토리 저장소(directory store) : 주메모리에서 캐시 라인으로 복사된 주소를 구분하기 위해서 이용(디렉토리 엔트리는 캐시 태그(cache-tag))
    - 데이터 영역
    - 상태 정보 영역
  2) 캐시의 크기 : 캐시가 주메모리에서 저장할 수 있는 실제 코드나 데이터로 정의(캐시 태그와 상태 비트는 캐시 크기 안에 포함 안됨)
  3) 상태 비트
    - 유효 비트(valid bit) : 캐시 라인이 활성화되어 있음을 표시하기 위한 것
    - 더티 비트(dirty bit) : 캐시 라인이 주메모리 안에 저장되어 있는 값과 다른 데이터를 포함하고 있는지 아닌지를 결정

12.2.2 캐시 컨트롤러의 기본 동작
  1) 캐시 컨트롤러 : 주메모리에서 캐시 메모리로 코드나 데이터를 자동으로 복사해주는 하드웨어
    - 요청 처리 : 요청한 주소를 태그(tag), 세트 인덱스(set index), 데이터 인덱스(data index)를 나누어서 처리
    - 처리 과정
      ① 필요로 하는 캐시 메모리의 캐시 라인을 찾기 위해 세트 인덱스 이용
      ② 유효 비트 확인, 요청된 주소의 태그 영역과 캐시 태그 비교 → 모두 성공 시 캐시 적중(hit), 둘 중에 하나가 실패할 경우 캐시 미스(miss)
      ③ 캐시 미스시, 컨틀로러는 주메모리에서 모든 캐시 라인을 캐시 메모리로 복사하고 요청된 코드나 데이터를 프로세서에 보냄
        ※ 캐시 라인 채우기(cache line fill) : 캐시 라인을 주메모리에서 캐시 메모리로 복사하는 것
      ④ 캐시 적중시, 컨트롤러는 캐시 메모리에서 프로세서로 직접 코드 또는 데이터를 공급

12.2.3 캐시와 주메모리 사이의 관계
  1) 데이터 스트림 : 캐시 라인을 채우는 동안 캐시 컨트롤러가 이것을 캐시에 복사하면서 동시에 코어에 데이터를 로딩할 수 있는 것
  2) eviction : 캐시 미스가 발생하여 기존의 캐시 라인을 제거하는 과정
  3) 스래싱 : 캐시 메모리 안에 동일한 위치에 대한 소프트웨어 병목 현상

12.2.4 세트 연상
  1) 세트 연상 : 세트 인덱스가 가리키는 캐시 라인의 세트
  2) 세트 연상 증가
    - 연상이 증가할때마다 스래싱의 가능성이 감소, 대신 지원하는 하드웨어의 복잡도도 증가
    - 완전 연상 캐시(fully associative cache) : 캐시의 세트 연상을 최대화하여 설계된 캐시
    - CAM(content addressable memory) : 각각의 유효한 캐시 라인 안에 저장되어 있는 캐시 태그와 입력 태그 주소를 비교하는 비교기 세트를 사용 → 더 많은 캐시 태그를 동시에 비교할 수 있으므로 한 세트 안에 포함될 수 있는 캐시 라인의 수를 늘릴 수 있음

12.2.5 쓰기 버퍼 : 프로세서가 주메모리에 쓸 데이터를 임시로 저장하고 있는 작고 빠른 FIFO 메모리 버퍼
  - 실행되는 명령어 수에 대한 주메모리 쓰기 비율에 따라 효과가 달라짐
  - 쓰기 버퍼로 인한 캐시 성능 향상 : 더티 캐시 라인 제거시 주메모리 대신 쓰기 버퍼에 캐시 라인 쓰여짐 → 새로운 캐시 라인 데이터 사용이 빨라짐
  - 엄격한 FIFO 버퍼가 아닐 수 있음 ex) ARM 10 제품군 : 합성(coalescing) 방식 지원

12.2.6 캐시 효율성 측정
  1) 적중률
    - 적중률 = (캐시 적중 수 / 메모리 요청 수) x 100
    - 미스율 = 100 - 적중률
    - 읽거나 쓰거나 또는 둘 다를 측정하는데 사용될 수 있음
  2) 측정 관련된 다른 용어
    - 적중 시간(hit time) : 캐시에서 어떤 메모리 위치를 액세스하는 데 걸리는 시간
    - 미스 패널티 : 주메모리에서 캐시로 캐시 라인을 로드하는 데 걸리는 시간

12.3 캐시 정책
  1) 쓰기 정책(write policy) : 프로세서가 쓰기 동작을 할 때, 데이터를 어디에 저장할지를 결정
  2) 교체 정책(replacement policy) : 캐시 미스가 발생하였을 때, 다음 라인을 채우는 데 사용될 세트 안에 있는 캐시 라인을 선택
  3) 할당 정책(allocation policy) : 캐시 컨트롤러가 캐시 라인을 언제 할당할 지를 결정

12.3.1 쓰기 정책 : 후기입 방식 또는 연속기입 방식
  1) 연속기입 방식
    - 저장할 때 캐시가 적중이라면 캐시와 주메모리에 모두 값을 저장
  2) 후기입 방식
    - 유요한 캐시 데이터 메모리에만 저장하고 주메모리에는 저장하지 않는다.
    - 연속기입 방식보다 성능 우수 ex) 서브루틴에 의해 임시 지역 변수를 반복적으로 사용할 때

12.3.2 캐시 라인 교체 정책
  1) 캐시 라인 교체
    - victim : 교체를 위해 선택된 캐시 라인
    - eviction : victim 캐시 라인을 선택하고 교체하는 과정
  2) 교체 방식
    - 의사 랜덤 방식(pseudorandom) : 캐시 컨트롤러가 무작위로 증가값을 선택하고 이를 victim 카운터에 더해서 증가시킴
    - 라운드 로빈 방식 : 캐시 컨트롤러가 캐시 라인을 할당할 때마다 순차적으로 증가하는 victim 카운터 사용
    - LRU(Least Recently Used) 방식 : 캐시 라인의 사용에 대해 조사해본 다음, 가장 오랜 시간 동안 사용되지 않는 캐시 라인을 다음의 victim으로 선택

12.3.3 캐시 미스시의 할당 정책
  1) 할당 방식
    - read-allocate : 주메모리에 읽는 동안 캐시 라인을 할당
    - read-write-allocate : 메모리를 읽고 쓰기 위해서 캐시 라인을 할당

12.4 코프로세서 15와 캐시
  - CP15:c7(+ c5, c6, c7, c10, c13, c14): 쓰기만 가능, 캐시를 클린(clean)하고 플러시(flush)하는데 사용
  - CP15:c7(+ c10) : 드레인 쓰기 버퍼
  - CP15:c9(+ c0) : victim 포인터 베이스 주소를 정의, 캐시 안에서 락(lock)되어 있는 코드 또는 라인수를 결정
  - CP15:c15(+ c0) : 라운드 로빈 교체 정책

12.5 캐시 메모리의 플러시와 클린
  1) 캐시 플러시 : 유효한 캐시 라인 안에 있는 유효 비트를 0으로 클리어시키는 것
  2) 캐시 클린 : 캐시로부터의 더티 캐시 라인의 값을 강제로 주메모리에 쓴 다음, 캐시 라인 안에 있는 더티 비트를 0으로 초기화하는 것 → 캐시된 메모리와 주메모리 사이의 일관성 재정립
  3) 시스템의 메모리 설정을 변경하거나 불할 캐시 안에서 자체 수정 코드를 실행하기 전에 클린이나 플러시를 해줄 필요가 있다.

12.5.1 ARM 캐시 코어 플러시하기

12.5.2 ARM 캐시 코어 클린하기

12.5.3 D 캐시 클린

12.5.4 WAY 및 세트 인덱스 어드레싱을 사용해서 D 캐시 클린하기

12.5.5 테스트 클린 명령어를 사용해서 D 캐시 클린하기

12.5.6 인텔 XScale SA-110과 인텔 StrongARM 코어에서 D 캐시 클린하기

12.5.7 캐시의 일부분을 클린하고 플러시하기

12.6 캐시 락다운 : 프로그램이 시간에 민감한 코드와 데이터를 캐시 메모리에 로드하고, 이것을 eviction에서 면제되었음을 표시하는 것
  1) 목적 : 캐시 미스 문제를 피하기 위함
  2) 장단점
    - 장점 : 빠른 시스템 반응 제공
    - 단점 : 사용한 가능한 캐시 크기가 감소
  3) 캐시 안에서 락을 해주어야 하는 것들
    - 벡터 인터럽트 테이블
    - 인터럽트 서비스 루틴
    - 시스템이 배타적으로 사용하는 크리티컬한 알고리즘
    - 자주 사용되는 전역변수들
  4) 교체에서는 면제가 되지만 플러시에서는 면제가 안되어 캐시 메모리로 사용이 안되게 됨 → 캐시 락다운 루틴은 락다운 정보가 복원될 수 있도록 리턴이 필요

12.6.1 캐시 안에서 코드와 데이터 락하기

12.6.2 WAY 인덱스를 증가시켜 캐시 락하기

12.6.3 락비트를 사용하여 캐시 락하기

12.6.4 인텔 XScale SA-110에서 캐시 라인 락하기

12.7 캐시와 소프트웨어 성능
  1) 메모리 매핑된 주변 장치들은 캐시나 쓰기 버퍼를 사용하지 않도록 설정하는 것이 좋다.
  2) 자주 액세스하는 데이터는 메모리 안에 연속적으로 저장하려고 노력해야 한다.
  3) 코드 루틴을 작게 유지하고 관련된 데이터를 가까이에 함께 묶어두는 것이 좋다.
  4) 캐시를 효과적으로 활용하는 코드를 작성하는 것보다 시스템의 성능에 더 많은 영향을 끼치는 다른 요소들도 있다.
posted by lepoussin