bong-u/til

๐Ÿ  home ๐Ÿˆ repository ๐Ÿ“ก rss
new RAG ์ด๋ก  ์ •๋ฆฌ + OpenSearch
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
RAG (Retrieval-Augmented Generation) RAG๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ LLM์˜ ๋ฌธ์ œ์  ํ• ๋ฃจ์‹œ๋„ค์ด์…˜: ์ƒ์„ฑ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์—†๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ ์ตœ์‹ ์˜ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ RAG๋Š” ์œ„์—์„œ ์„œ์ˆ ํ•œ LLM ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด๋‹ค. OpenSearch OpenSearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ํฌํฌ ๋ฒ„์ „ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์š” ๊ธฐ๋Šฅ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๋ณด์•ˆ ์‹œ๊ฐํ™”์™€ ๋Œ€์‹œ๋ณด๋“œ ์ง€์› index์™€ document index : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค document : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์„๊ธฐ Analyzer (Character Filter + Tokenizer + Token Filter) ํ…์ŠคํŠธ๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ ๋ถ„์„ ๊ณผ์ • Character Filter ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ Tokenizer ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ OpenSearch์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ Tokenizer Standard Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ, ๋ฌธ์žฅ ๋ถ€ํ˜ธ ์‚ญ์ œ Letter Tokenizer : ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Whitespace Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Ngram Tokenizer : ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter Standard Token Filter : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ Lowercase Token Filter : ํ…์ŠคํŠธ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Synonym Token Filter : ๋™์˜์–ด ์ฒ˜๋ฆฌ Analyzer Standard Analyzer : Standard Tokenizer + Standard Token Filter Simple Analyzer : Letter Tokenizer + Lowercase Token Filter Whitespace Analyzer : Whitespace Tokenizer + Lowercase Token Filter OpenSearch ์ ‘๊ทผ์„ ์œ„ํ•œ cURL ๋ช…๋ น์–ด ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/_cat/indices" ํŠน์ • ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}" ์ „์ฒด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" ํŠน์ • ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" \ 3-H "Content-Type: application/json" \ 4-d '{"query": {"match": {"field": "value"}}}' ์ธ๋ฑ์Šค ์‚ญ์ œ 1curl -X DELETE -u {username}:{password} \ 2"http://localhost:9200/{index_name}"
new OpenSearch๋ฅผ ํ™œ์šฉํ•œ RAG ์‹ค์Šต
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์˜ ์ฃผ์ œ๋Š” ํŠน์ • ์ธ๋ฌผ์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠน์ • ์ธ๋ฌผ์ด ํ–ˆ๋˜ ๋ง์„ ๋ชจ์•„ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ RAG ๋ชจ๋ธ์— ์ ์šฉ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ TED์—์„œ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉํ•ด์„œ OpenSearch์— ์ €์žฅํ•œ๋‹ค. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 1. ์ผ๋ก  ๋จธ์Šคํฌ ์ธํ„ฐ๋ทฐ ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํŠœ๋ธŒ์—์„œ “์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ"๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ทฐ ์ž๋ง‰์„ ๊ฐ€์ ธ์˜จ๋‹ค. 122:03 2EM: ์ด ํฐ ํŠธ๋Ÿญ์„ ๋ชฐ๋ฉด์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์›€์ง์ž„์„ ๋ณด์˜€์ฃ . 3CA: ์•„์ฃผ ๋ฉ‹์ง€๋„ค์š”. ์ž, ๊ทธ๋Ÿผ ์ •๋ง ๊ต‰์žฅํ•œ ์‚ฌ์ง„์—์„œ 422:09 5์กฐ๊ธˆ์€ ๋œ ๊ต‰์žฅํ•œ ์‚ฌ์ง„์„ ๋ณด์ฃ . "์œ„๊ธฐ์˜ ์ฃผ๋ถ€๋“ค"์ธ๊ฐ€์—์„œ ๋‚˜์˜ค๋Š” ๊ท€์—ฌ์šด ์ง‘ ์‚ฌ์ง„์ธ๋ฐ์š”. 622:15 7์ด๊ฒŒ ๊ฐ‘์ž๊ธฐ ์™œ ๋‚˜์˜จ๊ฑฐ์ฃ ? 8... ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ ํ•œ ๋ง๋งŒ ์†์ˆ˜ ์ •๋ฆฌํ•œ๋‹ค. 1๋„ค. ์ œ ์Šค์Šค๋กœ๋„ ๊ทธ ์งˆ๋ฌธ์„ ์ž์ฃผ ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. 2์ €ํฌ๋Š” LA์˜ ์ง€ํ•˜์— ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ด๋Š” ๊ตํ†ต ์ฒด์ฆ์„ ์™„ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•œ 33์ฐจ์› ๋„คํŠธ์›Œํฌ์˜ ํ„ฐ๋„์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๋ฐœ์ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. 4๊ตํ†ต ์ฒด์ฆ์€ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์˜ ์˜ํ˜ผ์„ ํƒˆํƒˆ ํ„ฐ๋Š” ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 5์„ธ๊ณ„ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ณ  ์žˆ์ฃ . ์ธ์ƒ์—์„œ ๋„ˆ๋ฌด๋„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 6... 2. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ 1docker create -it -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} -e "discovery.type=single-node" -v opensearch_vol:/usr/share/opensearch/data --name opensearch opensearchproject/opensearch ์„ค๋ช… -p 9200:9200 : OpenSearch HTTP ํฌํŠธ -p 9600:9600 : OpenSearch ๋ชจ๋‹ˆํ„ฐ๋ง ํฌํŠธ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} : ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • -e “discovery.type=single-node” : ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰ -v opensearch_vol:/usr/share/opensearch/data : ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ SSL ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ ํ•˜์ง€๋งŒ ์œ„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 12024-07-05 22:15:12 Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: ... 22024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1314) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 32024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 42024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 52024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 62024-07-05 22:15:12 ... 16 more ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š๊ณ , ํ•ด๋‹น ํฌํŠธ๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ SSL์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1/usr/share/opensearch/config/opensearch.yml 2# ๋ณ€๊ฒฝ ์ „ 3plugins.security.ssl.http.enabled: true 4# ๋ณ€๊ฒฝ ํ›„ 5plugins.security.ssl.http.enabled: false 3. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ž„๋ฒ ๋”ฉ ๋ฐ OpenSearch์— ์ €์žฅ RAG ์„ธ์…˜์„ ํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์ด ์งœ์ค€ ์ฝ”๋“œ๋ฅผ ์ ๊ทน! ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. OpenSearch ์ธ๋ฑ์Šค ์ƒ์„ฑ 1from opensearchpy import OpenSearch 2import torch 3from transformers import AutoTokenizer, AutoModel 4from langchain.text_splitter import RecursiveCharacterTextSplitter 5from langchain_community.document_loaders import TextLoader 6from langchain_community.vectorstores import OpenSearchVectorSearch 7 8INDEX_NAME = "elon_musk" 9FILE_NAME = "ted_elon_musk_script.txt" 10 11## OpenSearch ์—ฐ๊ฒฐ ์„ค์ • 12client = OpenSearch( 13 hosts=[{"host": "localhost", "port": 9200}], http_auth=("admin", {password}) 14) 15 16## ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 17loader = TextLoader(file_path=FILE_NAME, encoding="utf-8") 18docs = loader.load() 19 20text_splitter = RecursiveCharacterTextSplitter( 21 chunk_size=100, 22 chunk_overlap=0, 23 separators=["\n"], 24 length_function=len, 25) 26 27documents = text_splitter.split_documents(docs) 28 29# print(documents) 30 31## Embedding ๋ชจ๋ธ ์ •์˜ 32class MyEmbeddingModel: 33 def __init__(self, model_name): 34 self.tokenizer = AutoTokenizer.from_pretrained(model_name) 35 self.model = AutoModel.from_pretrained(model_name) 36 37 def embed_documents(self, doc): 38 inputs = self.tokenizer( 39 doc, return_tensors="pt", padding=True, truncation=True, max_length=512 40 ) 41 42 with torch.no_grad(): 43 outputs = self.model(**inputs) 44 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 45 46 return embeddings 47 48 def embed_query(self, text): 49 inputs = self.tokenizer( 50 [text], padding=True, truncation=True, return_tensors="pt", max_length=512 51 ) 52 with torch.no_grad(): 53 outputs = self.model(**inputs) 54 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 55 return embeddings 56 57 58## index ๊ตฌ์กฐ ์ •์˜ 59index_body = { 60 "settings": { 61 "analysis": { 62 "tokenizer": { 63 "nori_user_dict": { 64 "type": "nori_tokenizer", 65 "decompound_mode": "mixed", 66 "user_dictionary": "user_dic.txt", 67 } 68 }, 69 "analyzer": { 70 "korean_anlyzer": { 71 "filter": [ 72 "synonym", "lowercase", 73 ], 74 "tokenizer": "nori_user_dict", 75 } 76 }, 77 "filter": { 78 "synonym" :{ 79 "type": "synonym_graph", 80 "synonyms_path" : "synonyms.txt" 81 } 82 } 83 } 84 } 85} 86 87## Embedding ๋ชจ๋ธ ์ƒ์„ฑ 88my_embedding = MyEmbeddingModel("monologg/kobert") 89 90## OpenSearch์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 91vector_db = OpenSearchVectorSearch.from_documents( 92 index_name=INDEX_NAME, 93 body=index_body, 94 documents=documents, 95 embedding=my_embedding, 96 op_type="create", 97 opensearch_url="http://localhost:9200", 98 http_auth=("admin", {password}), 99 use_ssl=False, 100 verify_certs=False, 101 ssl_assert_hostname=False, 102 ssl_show_warn=False, 103 bulk_size=1000000, 104 timeout=360000, 105) 106 107result = vector_db.add_documents(documents, bulk_size=1000000) tokenizer๋Š” ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” “nori_tokenizer"๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. embedding ๋ชจ๋ธ์€ ์ €๊ฑฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋ชจ๋ธ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๋ชจ๋ธ์ธ์ง€๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. curl์„ ํ†ตํ•ด localhost:9200/elon_musk/_search๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 4. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต ์ƒ์„ฑ 1from langchain.prompts import PromptTemplate 2from langchain.chains import LLMChain 3from langchain_openai import ChatOpenAI 4from opensearchpy import OpenSearch 5import os 6 7INDEX_NAME = "elon_musk" 8 9# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 10os.environ["OPENAI_API_KEY"] = {api_key} 11 12llm = ChatOpenAI( 13 model_name="gpt-3.5-turbo", 14) 15 16prompt_template = PromptTemplate( 17 input_variables=["context", "question"], 18 template=""" 19Imagine you are {character_name}, 20a wise and experienced advisor. Given the context: "{context}", 21how would you respond to this inquiry: "{question}"?', 22(in korean) 23""", 24) 25 26 27llm_chain = LLMChain(llm=llm, prompt=prompt_template) 28 29client = OpenSearch( 30 hosts=["http://localhost:9200"], 31 http_auth=("admin", {password}), 32 use_ssl=False, 33 verify_certs=False, 34 ssl_assert_hostname=False, 35 ssl_show_warn=False, 36) 37 38def search_documents(query): 39 search_body = {"query": {"match": {"text": query}}} 40 response = client.search(index=INDEX_NAME, body=search_body) 41 hits = response["`its"]["hits"] 42 return [hit["_source"]["text"] for hit in hits] 43 44if __name__ == "__main__": 45 question = input("Enter your question\n") 46 search_results = search_documents(question) 47 48 print(search_results) 49 50 # context = " ".join(search_results) 51 context = "" 52 53 response = llm_chain.invoke({"character_name": INDEX_NAME, "context": context, "question": question}) 54 55 print (response["text"]) OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ RAG ๋ชจ๋ธ์— ๋„ฃ์–ด ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. search_documents ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด OpenSearch์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ context๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ ์งˆ๋ฌธ ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋Œ€๋‹ต ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์—…์œผ๋กœ์„œ ๋ฏธ๋ž˜๋ฅผ ํ–ฅํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ „๊ธฐ ์ž๋™์ฐจ ๊ธฐ์ˆ ๊ณผ ์—๋„ˆ์ง€ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ํ˜์‹ ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ ์šฉ๋œ context [‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’, ‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’] RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋Œ€๋‹ต ์ €๋Š” ํ…Œ์Šฌ๋ผ๋ฅผ ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋น„์ „์„ ๊ฐ–์ถ˜ ๊ธฐ์—…์œผ๋กœ์„œ, ์ž์œจ ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๊ธฐ์ฐจ ์‹œ์žฅ์„ ์„ ๋„ํ•˜๊ณ  ํ™˜๊ฒฝ์— ์นœํ™”์ ์ธ ์ฐจ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ‹์ง„ ๊ธฐ์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฐ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ผ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ณ ์ฐฐ ํ™•์‹คํžˆ RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ฐ๊ด€์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๋ฐ˜๋ฉด, RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด ๊ธ์ •์ ์ธ ์ผ๋ก  ๋จธ์Šคํฌ์˜ ๋Œ€๋‹ต๊ณผ, ์ž์œจ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.
new Nginx์—์„œ HTTPS ์„ค์ •ํ•˜๊ธฐ
๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ง„ํ–‰์ค‘์ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ docker-compose๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. AWS EC2์— ๊ตฌ๋™ ์ค‘์ธ ์„œ๋ฒ„์— HTTPS๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋„๋ฉ”์ธ ๊ตฌ๋งค ์—†์ด ์‹œ๋„๋ฅผ ํ–ˆ์œผ๋‚˜, AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋„๋ฉ”์ธ์œผ๋กœ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ณ , Route 53์„ ํ†ตํ•ด ๋„๋ฉ”์ธ์„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ๋ชฉํ‘œ Nginx๋ฅผ ์ด์šฉํ•˜์—ฌ HTTPS๋ฅผ ์ ์šฉํ•œ๋‹ค. ๋ฐฉ๋ฒ• 1. docker-compose.yml์— certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 1certbot: 2 image: certbot/certbot 3 container_name: certbot 4 volumes: 5 - ./certbot/conf:/etc/letsencrypt 6 - ./certbot/www:/var/www/certbot 7 depends_on: 8 - nginx 9 10 # certbot์„ ๋ฌดํ•œ๋ฃจํ”„๋กœ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 11 entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 6h & wait $${!}; done;'" 2. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. # certbot์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • location /.well-known/acme-challenge/ { allow all; root /var/www/certbot; } 3. certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•ด์„œ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. 1docker exec -it certbot certbot certonly \ 2 # ์›น ๋ฃจํŠธ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑ 3 --webroot \ 4 # ์›น ์„œ๋ฒ„์˜ ์›น ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ • 5 --webroot-path=/var/www/certbot \ 6 # ์ธ์ฆ์„œ ๊ฐฑ์‹  ๋ฐ ์ค‘์š”ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ง€์ • 7 --email {์ด๋ฉ”์ผ ์ฃผ์†Œ} \ 8 # Let's Encrypt ์„œ๋น„์Šค ์•ฝ๊ด€์— ๋™์˜ 9 --agree-tos \ 10 # EFF(Electronic Frontier Foundation) ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ • 11 --no-eff-email \ 12 # SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ง€์ • 13 -d {๋„๋ฉ”์ธ ์ด๋ฆ„} 4. Nginx ์›น ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  SSL ์„ค์ • ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋‹ค์šด ๋ฐ›์€ ํ›„ ํŒŒ์ผ์„ ์•Œ๋งž์€ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” /etc/letsencrypt/๋กœ ์ด๋™์‹œ์ผฐ๋‹ค. 1sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "./options-ssl-nginx.conf" 2 3sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "./ssl-dhparams.pem" 5. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. server { listen 80; charset utf-8; server_name {๋„๋ฉ”์ธ ์ด๋ฆ„}; # HTTP ์š”์ฒญ์„ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; charset utf-8; server_name { ๋„๋ฉ”์ธ ์ด๋ฆ„ }; # SSL ์ธ์ฆ์„œ ์„ค์ • ssl_certificate /etc/letsencrypt/live/api.forest-of-thoughts.site/fullchain.pem; # SSL ์ธ์ฆ์„œ ํ‚ค ์„ค์ • ssl_certificate_key /etc/letsencrypt/live/api.forest-of-thoughts.site/privkey.pem; # SSL ์„ค์ • ํŒŒ์ผ ํฌํ•จ include /etc/letsencrypt/options-ssl-nginx.conf; # Diffie-Hellman ํ‚ค ์„ค์ • ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } 6. nginx ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ์ˆ˜์ •ํ•œ๋‹ค. 1nginx: 2 image: nginx:stable 3 ports: 4 - "80:80" 5 - "443:443" 6 volumes: 7 - ./nginx.conf:/etc/nginx/nginx.conf 8 - ./certbot/conf:/etc/letsencrypt 9 - ./certbot/www:/var/www/certbot ํ•ด ํšŒ๊ณ  ๋ณดํ†ต crontab์„ ํ™œ์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š”๋‹ค. ์ด๋ฒˆ์—๋Š” ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š์•„์„œ, ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ๋„์ „ํ•ด๋ณด์ž.
new ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Ocaml Functional Programming ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํŠน์ง• Immutable ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค First-class function Higher-order function Referential transparency ๋™์ผํ•œ ์ธ์ž์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค Lazy evaluation (์ง€์—ฐ ๊ณ„์‚ฐ) ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ Primitive Types unit int float int_of_float : float->int float_of_int : int->float bool : true/false x = y : x equals y (structural equality) x <> y : x not equals y (structural equality) x == y : x equals y (physical equality) x != y : x not equals y (physical equality) char string ^ : string concatenation .[n] : n-th character .length : length of string .sub n m : substring from n to m Statement์™€ Expression Statement ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์ „์ด(๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ Expression ์‹คํ–‰ ์‹œ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ์™ธ๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ์š”์†Œ Statement๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค Expression์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋Š” Expression๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค Tuple 1let x = (1, 2, 3) Function first-class object (1๊ธ‰ ๊ฐ์ฒด) ํ• ๋‹น์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™”๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๋น„๊ต์—ฐ์‚ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค Higher Order Function (๊ณ ์ฐจํ•จ์ˆ˜) ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์žฌ๊ท€ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ rec ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค Conditional branch 1if [expression1] then [expression2] else [expression3] Pattern Matching binding occurrence Ocaml ์ปดํŒŒ์ผ๋Ÿฌ๋Š” expression์˜ ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ„ด๋งค์นญ์˜ ์™„์ „์„ฑ์„ ๊ฒ€์‚ฌ Lists :: : ๋ฆฌ์ŠคํŠธ ์•ž์— ์›์†Œ๋ฅผ ์‚ฝ์ž… @ : ๋ฆฌ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐ Type definition Disjoint union : ๊ตฌ๋ถ„๋˜๋Š” ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฌถ์€ ํƒ€์ž… Varient records๋ผ๊ณ ๋„ ๋ถ€๋ฆ„ type [type_name] = [constructor] (of [type])? (| [name] (of [type])?)* 1type number = 2 | Int of int 3 | Float of float Tail Call Optimization ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ํ–‰์œ„์ผ ๋•Œ, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ตœ์ ํ™” Syntax and Semantics Compilation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ํฐ ๊ทœ๋ชจ์˜ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ : ๊ฒ€์ฆ์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ ๊ณ ์„ฑ๋Šฅ ์†Œํ”„ํŠธ์›จ์–ด : ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ €์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด : ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ ๋‹จ์  ํ•™์Šต ๊ณก์„ ์ด ๋†’๋‹ค Compilation ๊ณผ์ •์ด ๋น„์‹ธ๊ณ  ๋ณต์žก Interpretation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ๋†’์€ ์–ธ์–ด์˜ ์ž์œ ๋„๋ฅผ ํ™œ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด prototyping : ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๋‹ค์–‘ํ•œ ๋™์  ํŠน์„ฑ ์กด์žฌ ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ๊ตฌ์กฐ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต์œก : ๊ตฌ๋ฌธ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœ ์‹คํ–‰ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” cross-platform ์†Œํ”„ํŠธ์›จ์–ด : platform ๋ณ„๋กœ ๊ตฌํ˜„๋œ interpreter๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๋‹จ์  ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์กด์žฌ ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๊ฒฐํ•จ ํƒ์ง€ ๋ฐ ์ˆ˜์ •์˜ ์–ด๋ ค์›€ Syntax (๊ตฌ๋ฌธ ๊ตฌ์กฐ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ “ํ˜•ํƒœ” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜ Concrete syntax : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ์„ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ Abstract syntax : Concrete syntax๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ Semantics (์˜๋ฏธ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ตฌ๋ฌธ์˜ “์‹คํ–‰๋™์ž‘” Unspecified Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜ํ•˜์ง€ ์•Š์€ ๋™์ž‘ Undefined Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ Programming Language Syntax and Parsing ์–ธ์–ด : L(G) The Chomsky Hierarchy Regular Language : Finite-State Automation Context-Free Language : Pushdown Automation Context-Sensitive Language : Linear-Bounded Automation Recursively Enumerable Language : Turing Machine AST (Abstract Syntax Tree) ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์ƒ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠธ๋ฆฌํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ CFG (Context-Free Grammar) ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ๋ฒ• G = ($\sum$, N, P, S) $\sum$ : terminal์˜ ์œ ํ•œ์ง‘ํ•ฉ N : non-terminal ์œ ํ•œ์ง‘ํ•ฉ P : production์˜ ์ง‘ํ•ฉ S : ์‹œ์ž‘ nonterminal BNF (Backus-Naur Form) CFG์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ• ์˜ˆ์‹œ 1S ::= aAc 2A ::= aA 3| b 4| ๐œ– Derivation ๋ฌธ๋ฒ•์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • Leftmost derivation Rightmost derivatio Parse Derivation์˜ ์—ญ๊ณผ์ • Source code –lexing–> Token –parsing–> AST leftmost derivation rightmost derivation ambiguous grammer leftmost derivation๊ณผ rightmost derivation์ด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ๋ฒ• AE (Arithmetic Expression) Language Syntax ์ •์˜ Concrete syntax (syntax ํ˜•ํƒœ) Abstract syntax (tree ํ˜•ํƒœ) Semantics ์ •์˜ eโ‡“n : e๋Š” n์œผ๋กœ ๊ณ„์‚ฐ๋จ Inference rule (์ถ”๋ก  ๊ทœ์น™) ์ „์ œ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๋ก ์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ทœ์น™ $$\frac{H_1 H_2 H_3 … H_n}{P}$$ $H_1, H_2, H_3, …, H_n$ : ์ „์ œ P : ๊ฒฐ๋ก  ์ „์ œ๊ฐ€ ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๊ฒฐ๋ก ๋„ ์ฐธ Bigstep operational semantics Big-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•˜๋‚˜์˜ ํฐ ๋‹จ๊ณ„์— ์˜ํ•ด ์ˆ˜ํ–‰ Small-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•œ ์Šคํ… ๊ณ„์‚ฐ๋“ค์˜ ์—ฐ์†์— ์˜ํ•ด ์ˆ˜ํ–‰ Operational : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์„ ๊ฐ€์ƒ ๊ธฐ๊ณ„์˜ ๋™์ž‘(๊ณ„์‚ฐ)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ธฐ์ˆ  Proof tree Inference rule์„ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๋ก ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” treeํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ Syntactic Sugar and Identifier Syntactic Sugar ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ตฌ๋ฌธ ์ฃผ๋กœ concrete syntax์˜ ํ™•์žฅ์„ ํ†ตํ•ด ์ œ๊ณต Desugaring ~(e) => 0 - e Sugaring 0 - e => ~(e) Identifier ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋–ค ์š”์†Œ์™€ ์—ฐ๊ด€๋œ ์ด๋ฆ„ Identifier ๋“ฑ์žฅ binding occurence : ์ •์˜๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅ bound ocurrence : ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋“ฑ์žฅ free identifier : ์œ„ ๋‘๊ฐ€์ง€์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋“ฑ์žฅ (์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ ‘๊ทผ) Identifier Scope Identifier๋Š” scope(๋ฒ”์œ„)๋‚ด์—์„œ binding-bound ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ Scope : binding ocurrence identifier๊ฐ€ bound ๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ Scope๋ฅผ ๋ฒ—์–ด๋‚œ ์ ‘๊ทผ : free identifier Shadowing : ๋™์ผํ•œ ์ด๋ฆ„์˜ identifier๊ฐ€ ์ค‘์ฒฉ๋œ scope์—์„œ binding๋˜๋Š” ๊ฒฝ์šฐ, ๋ฐ”๊นฅ์ชฝ scope์˜ identifier๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ Abstract Memory $\sigma$(x) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ $\sigma$[xโ†ฆn](x’) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x๋ฅผ n์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ƒˆ๋กœ์šด ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ โ†ฆ (mapsto) : ์™ผ์ชฝ ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋งคํ•‘ํ•œ๋‹ค First Order Function (F1VAE) F1VAE VAE์— first-order function์„ ์ถ”๊ฐ€ํ•œ ์–ธ์–ด First-order function ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ Higher-order function ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ Concrete syntax 1// single function 2prog ::= decl expr 3// multiple functions 4prog ::= decl_list expr 5decl_list ::= decl decl_list | decl 6// single parameter 7decl ::= def var var = expr endef 8// multiple parameters 9decl ::= def var var_list = expr endef | def var = expr endef 10var_list ::= var var_list | var 11expr_list ::= expr, expr_list | expr 12 13// ๊ณตํ†ต 14expr ::= let var = expr in expr 15 | var(expr) 16 | expr + expr 17 | expr - expr 18 | (expr) 19 | number 20 | ~ (expr) 21 | var Abstract syntax ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณด์กฐํ•จ์ˆ˜ ฮ›(x) : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์—์„œ ํ•จ์ˆ˜์ด๋ฆ„ x์˜ ๊ฐ’์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ ฮ›[x1 โ†ฆโ†’ (x2, e)] : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์— ํ•จ์ˆ˜์ด๋ฆ„ x1์˜ ๊ฐ’์„ (x2, e)๋กœ ์—…๋ฐ์ดํŠธํ•œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ Multiple parameters $$ p ::= \overline{d}\ e \ d ::= def\ x\ \overline{x} = e \ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ x(\overline{e}) \ n \in Z\ x \in Var $$ Semantics e[n/x] ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ๋œ ์ด์ž๋กœ ์น˜ํ™˜ํ•œ ํ›„ ๊ณ„์‚ฐ Lexical scope vs dynamic scope Lexical scope : identifier์˜ scope๊ฐ€ ์ปดํŒŒ์ผ์‹œ์ ์— ์ €์˜ Dynamic scope : identifier์˜ scope๊ฐ€ ์‹คํ–‰์‹œ์ ์— ๊ฒฐ์ • First Class Function (FVAE) First-class function ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŠน์„ฑ Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 3 | expr expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ํ˜ธ์ถœ 4 | expr + expr 5 | expr - expr 6 | (expr) 7 | number 8 | ~ (expr) 9 | var function applications ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€์‹  ํ•จ์ˆ˜ ์ ์šฉ Abstract syntax $\lambda x.e$ $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e \ n \in Z\ x \in Var $$ $\lambda x.e$ : ํ•จ์ˆ˜ ์ •์˜ (x๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ, e๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด) x๋Š” binding occurence x์˜ scope๋Š” e $e\ e$ : ํ•จ์ˆ˜ ์ ์šฉ e1 : ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐ๋˜๋Š” expression e2 : ์ธ์ž Closure Closure = Var X Expr X Store FVAE์—์„œ๋Š” ํ•จ์ˆ˜๋„ “๊ฐ’"์ด๋ฏ€๋กœ “๊ฐ’"์˜ ํ™•์žฅ์ด ์š”๊ตฌ๋œ๋‹ค Multiple parameters Concrete syntax 1expr ::= let var = expr in expr 2 | let var var = expr in expr 3 | (fun var_list -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | (expr) 8 | number 9 | ~ (expr) 10 | var 11var_list ::= var var_list | var // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ Conditional Branch (CFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var_list -> expr) 3 | if expr then expr else expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์กฐ๊ฑด๋ฌธ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | expr < expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ๋น„๊ต์—ฐ์‚ฐ 8 | (expr) 9 | number 10 | bool 11 | ~ (expr) 12 | var if-then-else๊ฐ€ ๋‹ค๋ฅธ expression์— ๋น„ํ•ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ๊ฐ€์ • Abstract syntax $$ e ::= n\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e?e\ : e\ |\ e\ <\ e \ n \in Z\ b \in {true, false } x \in Var $$ Boolean support as syntatics sugar true์™€ false๋ฅผ ์ •์ˆ˜๋กœ ํ‘œํ˜„ true์™€ false๋ฅผ closure๋กœ ํ‘œํ˜„ Option 1. C style $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ ?\ e\ :\ e\ |\ e\ <\ e\ n \in Z\ x \in Var $$ Option 2. Church boolean $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e\ n \in Z\ b \in {true, false }\ x \in Var $$ Recursion (RCFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | let rec var = expr in expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์žฌ๊ท€ํ•จ์ˆ˜ 3 | (fun var -> expr) 4 | if expr then expr else expr 5 | expr expr 6 | expr + expr 7 | expr - expr 8 | expr < expr 9 | (expr) 10 | number 11 | bool 12 | ~ (expr) 13 | var Abstract syntax $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ let\ rec\ x\ =\ e\ in\ e |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e \ n \in Z\ x \in Var $$ minic 1 Imperative language (๋ช…๋ นํ˜• ์–ธ์–ด) ์—ฐ์†๋œ command(๋ช…๋ น)์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋ฏธ๋ฅผ ์ˆ˜ํ–‰ Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= var = expr; 4 | if expr {stmts} 5 | if expr {stmts} else {stmts} 6expr ::= number 7 | var 8 | true 9 | false 10 | (expr) 11 | expr + expr 12 | expr - expr 13 | expr < expr 14 | expr > expr 15 | expr == expr 16 | expr && expr 17 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= x = e\ |\ e?\ \overline{s} : \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e \ n \in Z\ b \in {true, false}\ x \in Var $$ Semantics p : MiniC program Prog -> Store s : MiniC statement Store X Stmt -> Store e : MiniC expression Store X Expr -> Value Short circuit evaluation ๋…ผ๋ฆฌ์‹ ์—ฐ์‚ฐ์— ์žˆ์–ด ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ•ด์ง„ ๊ฒฝ์šฐ ๋‚จ์€ expression ๊ณ„์‚ฐ minic 2 &x: reference *e: dereference Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= def var; 4 | var = expr; 5 | *expr = expr; 6 | if expr {stmts} 7 | if expr {stmts} else {stmts} 8 | while expr {stmts} 9expr ::= number 10 | var 11 | true 12 | false 13 | &var 14 | *expr 15 | (expr) 16 | expr + expr 17 | expr - expr 18 | expr < expr 19 | expr > expr 20 | expr == expr 21 | expr && expr 22 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= def\ x\ |\ x = e\ |\ *e = e\ |\ e?\ \overline{s} : \overline{s}\ |\ while\ e\ \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e\ |\ &x\ |\ *e \ b \in {true, false}\ n \in Z\ x \in Var $$ Semantics
new ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ฐœ์š” ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์ด ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ผ๊ณ  ํ•œ๋‹ค cpu์นฉ์…‹์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊ฐ€ ๋ฐ”๋€๋‹ค ๊ณ ๊ธ‰์–ธ์–ด ๊ณ ๊ธ‰์–ธ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(Compiler)๋ผ๊ณ  ํ•œ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ •ํ™•ํ•œ ์ •์˜ ์–ด๋–ค ์–ธ์–ด๋กœ ์“ฐ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์€ ์—ญํ• ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ 1952๋…„ ๊ทธ๋ ˆ์ด์Šค ํ˜ธํผ(Grace Hopper)๊ฐ€ UNIVAC์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด A-0 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ œ์ž‘ ์ปดํŒŒ์ผ๋Ÿฌ vs ์ธํ„ฐํ”„๋ฆฌํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ๊ณผ์ • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ • Lexical analysis (์–ดํœ˜ ๋ถ„์„) token์„ ์ƒ์„ฑํ•˜๋Š”์ผ, token์€ ์–ดํœ˜์˜ ์ตœ์†Œ ๋‹จ์œ„ Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค (์ฃผ๋กœ ํŠธ๋ฆฌํ˜•ํƒœ) Semantic analysis (์˜๋ฏธ ๋ถ„์„) type checking Intermediate code generation (์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ) ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ Code optimization (์ฝ”๋“œ ์ตœ์ ํ™”) ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ™˜ Code generation (์ฝ”๋“œ ์ƒ์„ฑ) ๋ชฉ์  ์ฝ”๋“œ ์ƒ์„ฑ Lexical analysis (์–ดํœ˜ ๋ถ„์„) token : ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜๋ฏธ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„ FSA (Finite State Automata, ์œ ํ•œ ์ƒํƒœ ์˜คํ† ๋งˆํƒ€) token์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹œ์ž‘ ์ƒํƒœ ํ•œ ๊ฐœ์™€ ๋ ์ƒํƒœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ€์ง DFA (Deterministic Finite Automata) FSA์˜ ํ•œ ์ข…๋ฅ˜ ๊ฐ ์ƒํƒœ์—์„œ ๋ป—์–ด๋‚˜๊ฐ€๋Š” edge๊ฐ€ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌ ฮต๊ฐ€ ๋ถ™์€ edge ์—†์Œ ๋ถ„์„ํ•œ ํ† ํฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• Lexeme = <ํ† ํฐ๋ฒˆํ˜ธ, ํ† ํฐ ๊ฐ’> ์˜ˆ์‹œ if X < Y … (29, 0) (1, X) (18, 0) (1, Y) … ์‹๋ณ„์ž์˜ ํ† ํฐ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ, ์ƒ์ˆ˜๋Š” 2๋ฒˆ ๋“ฑ์œผ๋กœ ๊ณ ์ • Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, parse tree๋ฅผ ๋งŒ๋“ ๋‹ค CFG (Context Free Grammer) ๊ตฌ๋ฌธ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• G = (N, T, P, S) N = nonterminal symbol ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ T = terminal symbol (token) ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž+์ˆซ์ž, ์—ฐ์‚ฐ์ž, ๊ตฌ๋ถ„์ž, ํ‚ค์›Œ๋“œ ๋“ฑ P = production rule ์˜ˆ) S -> T+T, T -> ‘0’|‘1’|‘2’ S = start symbol L(G) : ์ด ๋ฌธ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์–ธ์–ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ CFG ํ‘œํ˜„๋ฒ• BNF (Backus-Naur Form) EBNF (Extended BNF) ์œ ๋„ (derivation) ์ƒ์„ฑ ๊ทœ์น™๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์žฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ์œ ๋„๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ์„œ ๋ฐ”๊ฟˆ ์œ ๋„ ํŠธ๋ฆฌ : ์œ ๋„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ƒํ™” ์‹œ์ผœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ขŒ์ธก ์œ ๋„(leftmost derivation) ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ์šฐ์ธก ์œ ๋„(rightmost derivation) ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ๋ชจํ˜ธ์„ฑ (ambiguity) ๋ฌธ๋ฒ• G์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์–ด๋–ค ๋ฌธ์žฅ์ด ๋‘๊ฐœ ์ด์ƒ์˜ ์œ ๋„ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด ๋ฌธ๋ฒ• G๋Š” ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•์€ ์ขŒ์ธก ์œ ๋„์™€ ์šฐ์ธก ์œ ๋„๊ฐ€ ๊ฐ™๋‹ค ๋ชจํ˜ธ์„ฑ ํ•ด๊ฒฐ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋„์ž… ๊ฒฐํ•ฉ ๋ฒ•์น™ ๋„์ž… Left Recursion์€ ์ขŒ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> A+a | a Right Recursion์€ ์šฐ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> a+A | a ๊ตฌ๋ฌธ ๋ถ„์„์˜ 2๊ฐ€์ง€ ๋ฐฉ์‹ top-down, bottom-up Top-down parsing Top-down ๋ฐฉ์‹ ์ขŒ์ธก ์œ ๋„์™€ ๊ฐ™์€ ์ˆœ์„ ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ backtracking : ์œ ๋„๋œ ๋ฌธ์ž์—ด๊ณผ ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ƒ์„ฑ๊ทœ์น™ ์ ์šฉ Bottom-up ๋ฐฉ์‹ ์šฐ์ธก ์œ ๋„์˜ ์—ญ์ˆœ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ LL ํŒŒ์‹ฑ ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์–ด์„œ ์ขŒํŒŒ์Šค ์ƒ์„ฑ backtracking X, ๋น ๋ฅด๋‹ค ๊ฒฐ์ •์ ์œผ๋กœ ํŒŒ์‹ฑ ์‚ฌ์šฉ๋œ ์ •์˜ ฮต-์ƒ์„ฑ๊ทœ์น™ Nonterminal A๊ฐ€ ฮต๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด A๋ฅผ nullableํ•˜๋‹ค๊ณ  ๋ถ€๋ฅธ๋‹ค lhs, rhs A->XXX์—์„œ lhs๋Š” A, rhs๋Š” XXX โŠ• (Ring Sum) A์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, AโŠ•B = (A์—์„œ ฮต๋นผ๊ณ  A ํ•ฉ์ง‘ํ•ฉ B) A์— ฮต๊ฐ€ ์—†์œผ๋ฉด, AโŠ•B = A First nonterminal A๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋˜์–ด ์ฒซ๋ฒˆ์งธ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” terminal์˜ ์ง‘ํ•ฉ X->Y1Y2Y3์ผ๋•Œ, FIRST(X) = FIRST(X) U FIRST(Y1) โŠ• FIRST(Y2) โŠ• FIRST(Y3) Follow A ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” terminal์˜ ์ง‘ํ•ฉ A->ฮฑBฮฒ, ฮฒ != ฮต ์ผ๋•Œ, FOLLOW(B) = FOLLOW(B) U (FIRST(ฮฒ)-{ฮต}) A->ฮฑB ๋˜๋Š” A->ฮฑBฮฒ, FIRST(ฮฒ)์— ฮต๊ฐ€ ์†ํ•  ๋•Œ, FOLLOW(B) = FOLLOW(B) U FOLLOW(A) LL์กฐ๊ฑด FIRST(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค FIRST(ฮฑ)์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, FOLLOW(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ๋ฒ• = LL ํŒŒ์‹ฑ ๋˜๋Š” ๋ฌธ๋ฒ• LL(1) ๋ฌธ๋ฒ• ์ž„์˜์˜ ๋ฌธ๋ฒ•์— ๋Œ€ํ•˜์—ฌ LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” CFG 1 : LOOKAHEAD๊ฐ€ 1๊ฐœ๋ผ๋Š” ์˜๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ LL(1)๋ฌธ๋ฒ•์ด ๋˜์ง€ ์•Š๋Š”๋‹ค ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ• ์šฐ์„ ์ˆœ์œ„ ์ฃผ๊ธฐ, ๊ฒฐํ•ฉ๋ฒ•์น™ ๋ฐ˜์˜์œผ๋กœ ํ•ด๊ฒฐ left-factoring์ด ๋˜๋Š” ๊ฒฝ์šฐ ๊ณตํ†ต ์•ž๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด nonterminal๋กœ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐ left-recursiveํ•œ ๊ฒฝ์šฐ ์ง์ ‘ recursion : A -> Aฮต ์ธ๊ฒฝ์šฐ ๊ฐ„์ ‘ recursion : A -> B, B -> A ์ธ๊ฒฝ์šฐ LOOKAHEAD ์–ด๋–ค ๊ทœ์น™์ด ์ ์šฉ๋˜์—ˆ์„๋•Œ ๋งจ ์ฒ˜์Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” terminal ์ง‘ํ•ฉ A->X1X2X3์ผ๋•Œ, LOOKAHEAD(A) = FIRST(X1) โŠ• FIRST(X2) … โŠ• FOLLOW(A) Strong LL(1) LL(1)๊ณผ ํ•ญ์ƒ ๋™์ผ (1์ด ์•„๋‹๋•Œ๋Š” ๋‹ค๋ฆ„) LOOKAHEAD(A->ฮฑ)์™€ LOOKAHEAD(A->ฮฒ)๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ• LL(1) ํŒŒ์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• Recursive descent parser ์žฅ์  : ์ง๊ด€์  ์‰ฝ๋‹ค ๋‹จ์  : ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค Predictive parser PDA(PushDown Automata)์— ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”๋งŒ ์ˆ˜์ • ํŒŒ์‹ฑํ…Œ์ด๋ธ” ์˜ˆ์‹œ (?์—๋Š” ๊ทœ์น™๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค) a b S ? ? A ? ? ํŒŒ์‹ฑํ…Œ์ด๋ธ”์— ๋‘๊ฐœ ์ด์ƒ์˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ -> NOT LL(1) Stack์˜ ์˜ˆ์‹œ Bottom-up parsing left-recursive ๋ฌธ๋ฒ•๋„ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ LL(k) ์ขŒ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Top-down parsing, recursive descent parsing, predictive parsing, LL parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ pre-roder๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ LR(k) ์šฐ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Bottom-up parsing, shift-reduce parsing, LR parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ post-order๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ Reduce S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ A๋กœ ๋Œ€์น˜ํ•˜๋Š” ๊ฒƒ : S=>ฮฑAฯ‰ ์‹œ์ž‘ symbol์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ reduce ํ•œ๋‹ค Handle S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ ฮฑฮฒฯ‰์˜ handle์ด๋ผ๊ณ  ํ•œ๋‹ค ๋‘ ๊ฐœ ์ด์ƒ์˜ handle์ด ์กด์žฌํ• ๋•Œ -> ๋ชจํ˜ธํ•˜๋‹ค Shift์™€ Reduce๋กœ Parsing ํ•˜๊ธฐ Stack์˜ ์˜ˆ์‹œ Issue Shift์™€ Reduce ์ค‘ ์–ด๋А ๊ฒƒ์„ ํ• ๊นŒ? Stack์˜ top์—์„œ ์–ผ๋งˆ๋งŒํผ์„ handle๋กœ ๋ณผ ๊ฒƒ์ธ๊ฐ€? ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: LR Parsing Table YACC LALR ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ foo.y –(yacc)–> y.tab.c –(gcc)–> a.out *.y ํŒŒ์ผ ๊ตฌ์กฐ 1<์„ ์–ธ๋ถ€> 2... 3%% 4... 5exp : exp '+' term; 6factor : ident; 7... 8%% 9<์—ฌ๋Ÿฌ ํ•จ์ˆ˜> ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ•์œผ๋กœ LR Conflict ๋ฐœ์ƒ ์‹œ ์„ ์–ธ๋ถ€์—์„œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐ LR Parsing Table Action table : Action + Parser ์ƒํƒœ Goto table : Parser ์ƒํƒœ LR(0) ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ LR(0) ์•„์ดํ…œ rhs์— ์ (’.’) symbol์„ ๊ฐ€์ง„ ์ƒ์„ฑ ๊ทœ์น™ ex) A->ฮฑ.ฮฒ, A->. closure ์ (’.’)๋’ค์— non-terminal์ด ์˜ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ์ถ”๊ฐ€ S’ -> S, S -> (L)|id, L -> S | L,S closure({[S’->.S]}) = {[S’->.S], [S->.(L)], [S->.id]} goto goto(I, X)์ด๋ฉด ์ ์„ X๋’ค๋กœ ์˜ฎ๊ธฐ๊ณ  closure๋ฅผ ์ทจํ•œ๋‹ค X๊ฐ€ ์—†์œผ๋ฉด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค I={[G->E=E], [E->E.+T]} ์ผ๋•Œ, goto(I, +) = closure({E->E+.T}) : ์ ์„ +๋’ค๋กœ ์˜ฎ๊น€ C0 ์ƒ์„ฑ๊ทœ์น™ S’->S์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ closure์™€ goto๋ฅผ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๋ชจ๋“  ํƒ€๋‹นํ•œ LR(0)์˜ ์•„์ดํ…œ ์ง‘ํ•ฉ๋“ค Item์˜ ์ข…๋ฅ˜ [A->X.Y] : X!=ฮต์ผ๋•Œ kernel item [A->.X] : closure item [A->X.] : reduce item SLR ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ reduce Item์ด [X->ฮฑ.]์ผ๋•Œ, FOLLOW(X)์˜ ๋ชจ๋“  terminal์—๋งŒ reduce action์„ ๋„ฃ๋Š”๋‹ค ๋‚˜๋จธ์ง€๋Š” LR(0)๊ณผ ๋˜‘๊ฐ™๋‹ค LR(0)๋ณด๋‹ค conflict๊ฐ€ ์ ์–ด, ๋” ์ •๊ตํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. LALR Parsing ์ •๊ตํ•œ ์ˆœ์„œ LR(0) < SLR < LALR(1) < LR(1) ํŒŒ์„œ ์ƒํƒœ์˜ ๊ฐœ์ˆ˜ SLR = LALR « LR(1) SDD, AST SDD (Syntax Directed Definition) SDD : semnatic action์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๋ช…์„ธ์„œ Semnatic Actions : ๊ทœ์น™์— ๋Œ€ํ•œ Action Yacc/Bison : $$, $1, $2, ... ์‚ฌ์šฉ ANTLR : $<name> ์‚ฌ์šฉ Type declaration Attribute ์ข…๋ฅ˜ synthesized attr. : children์— ์˜ํ•ด ๊ณ„์‚ฐ (terminal) inherited attr. : parent, sibling์— ์˜ํ•ด ๊ณ„์‚ฐ AST (Abstract Syntax Tree) ํŒŒ์ŠคํŠธ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ AST๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ํŒŒ์‹ฑ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค๊ธฐ : LL, LR ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งŒ๋“ค๊ธฐ : SDD ์‚ฌ์šฉ (Yacc etc.) evaluation : ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ž‘์—…ํ•˜๋Š” ํ–‰์œ„ On-the-fly evaluation S-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” SDD L-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ + ๊ฐ’์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ˜๋Ÿฌ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ IR (Intermediate Representation) IR์ด๋ž€? Tree๋‚˜ Instruction list ํ˜•ํƒœ instruction(node)๊ฐ€ ์ ์–ด์•ผ ์ตœ์ ํ™”/๋ฒˆ์—ญ์— ์ข‹์Œ High Level IR High์™€ Low๋Š” ์ƒ๋Œ€์ ์ธ ๊ฐœ๋… High level IR: ์—ฌ๊ธฐ์„œ๋Š” AST์˜ ๋ณ€ํ˜•๋งŒ ์ƒ๊ฐ ์ข…๋ฅ˜ : AST, TCOL Low Level IR ๋‹จ์ˆœํ•œ instruction์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€์ƒ๊ธฐ๊ณ„(์ฃผ๋กœ RISC)๋ฅผ emulate N-tuple ํ‘œ๊ธฐ๋ฒ• (3-address code) a = b OP c ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๊ณ„์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ํ”ผ์—ฐ์‚ฐ์ž ๊ฐœ์ˆ˜ <= 3 quadruple : (์—ฐ์‚ฐ์ž, ํ”ผ์—ฐ์‚ฐ์ž1, ํ”ผ์—ฐ์‚ฐ์ž2, ๊ฒฐ๊ณผ) Stack machine code Java byte code, U-code : AST๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ์ด ์šฉ์ด Tree ํ‘œํ˜„ ๊ธฐ๊ณ„์–ด ์ƒ์„ฑ ์šฉ์ด IR ์˜ˆ์‹œ GCC - GIMPLE (3-address code) GCC์˜ ์ค‘๊ฐ„์ฝ”๋“œ : GENERIC -> GIMPLE -> RTL 1D.1954 = x*10 // D.1954๋Š” ์ž„์‹œ๋ณ€์ˆ˜ 2gimple_assign <mult_exprt, D.1954, x, 10> LLVM - bit (3-address code) LLVM IR : ์–ธ์–ด์™€ ๋จธ์‹ ์— ๋…๋ฆฝ์  1@var = global i32 14 ; ์ „์—ญ๋ณ€์ˆ˜ var์— 14 ๋Œ€์ž… 2define i32 @main() nounwind { ; i32(int) ๋ฐ˜ํ™˜ํ˜• 3 entry: 4 %a = alloca i32, align 4 ; ์ง€์—ญ๋ณ€์ˆ˜ a ์„ ์–ธ, int ํ• ๋‹น 5 %1 = load i32 * @var ; %1 ์ž„์‹œ๋ณ€์ˆ˜์— var๊ฐ’ ๋Œ€์ž… 6 ret i32 %1 ; ์ž„์‹œ๋ณ€์ˆ˜ ๊ฐ’ ๋ฐ˜ํ™˜ 7} JVM - byte code (stack machine code) ๊ฐ€์ƒ ๊ธฐ๊ณ„ ์ฝ”๋“œ (Bytecode, MSIL) ๊ฐ€์ƒ ๊ธฐ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•จ ์ด์‹์„ฑ, ํ˜ธํ™˜์„ฑ์ด ๋ชฉ์  : java bytecode๋Š” machine ํ˜ธํ™˜์„ฑ, c# msil์€ language ํ˜ธํ™˜์„ฑ 1public Employee(String strName, int num) 2{name = strName; idNumber = num; storeData(strName, num);} 3Method Employee(java.lang.String, int) 4 50 aload_0 ; 0๋ฒˆ์งธ ๋กœ์ปฌ๋ณ€์ˆ˜(this)๋ฅผ ์Šคํƒ์— push 61 invokespecial #3 <Method java.lang.Object()> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 7--- 84 aload_0 95 aload_1 ; strName์„ ์Šคํƒ์— push 106 putfield #5 <Field java.lang.String name> ; name์— strName ๋Œ€์ž… 11--- 129 aload_0 1310 iload_2 ; num์„ ์Šคํƒ์— push 1411 putfield #7 <Field int idNumber> ; idNumber์— num ๋Œ€์ž… 15--- 1614 aload_0 1715 aload_1 ; strName์„ ์Šคํƒ์— push 1816 iload_2 ; num์„ ์Šคํƒ์— push 1917 invokespecial #9 <Method void storeData(java.lang.String, int)> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 2020 return line number : ๋ช…๋ น์ด ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ฃผ์†Œ aload : ๊ฐ์ฒด๋ฅผ push, iload : ์ •์ˆ˜๋ฅผ push ์›๋ž˜๋Š” aload๊ฐ€ ๋ช…๋ น, ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น aload 0์„ ๋ฌถ์–ด์„œ bind -> aload_0 CIL (Common Intermediate Language) (stack machine code) C#, VB.NET, J# ๋“ฑ์—์„œ ์‚ฌ์šฉ MSIL์€ ์˜›๋‚  ์ด๋ฆ„ 1.assembly Hello {} ; .assembly: ์–ด์…ˆ๋ธ”๋ฆฌ ์„ ์–ธ 2.assembly extern mscorlib {} 3.method static void Main() { 4 .entrypoint 5 .maxstack 1 6 ldstr "Hello, world!" ; stack์— ์ €์žฅ 7 call void [mscorlib]System.Console::WriteLine(string) 8 ret 9} GCC RTL(Register Transfer Language) (Tree๊ตฌ์กฐ ์ฝ”๋“œ) Lisp S-expression ์‚ฌ์šฉ 1(set (reg:SI 140) 2 (plus:SI (reg:SI 138) 3 (reg:SI 139))) => reg140 = reg138+reg139 IR generation 3-address Translation ๊ทœ์น™ Binary operations: t = [[el OP e2]] Unary operations: t = [[OP el]] Array access: t = [[ v[e] ]] Structure access: t = [[ v.f ]] Short-circuit OR: t = [[ el SC-OR e2]] Statement sequence: [[s1; s2; ...; sN]] Variable assignment: [[ v = e ]] Array assignment: [[ v[e1] = e2 ]] If: [[ if(e) then s ]], [[ if(e) then s1 else s2]] While: [[ while (e) s ]] Switch: [[ switch (e) case v1:s1, ..., case vN:sN ]] Function Call: [[ call f(e1, e2, ..., eN) ]] Fucntion Return: [[ return e ]] Statement Expression Statement๋„ expression ์ฒ˜๋Ÿผ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ™•์žฅ t = [[ S ]]๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜์ž Nested Expressions t = [[ (a - b) * (c + d) ]] t = [[ if c then if d then a = b ]] ๊ฐ€์žฅ ํฐ ๋ฉ์–ด๋ฆฌ๋ถ€ํ„ฐ ๋ฐ”๊พผ๋‹ค Storage Management 2๊ฐ€์ง€ Storage Register : ๋น ๋ฅธ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€ Memory : ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ 2๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ All memory approach ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ memory์— ์ €์žฅ, ๊ฐ€๋Šฅํ•œ๊ฒƒ๋งŒ register Standard approach Global, Statics, Local(composite)๋Š” memory์— ์ €์žฅ Local(scalar)๋Š” memory ๋˜๋Š” virtual register์— ์ €์žฅ Memory์˜ 4๋Œ€ ์˜์—ญ Code space : ๋ช…๋ น์–ด๋ฅผ ์ €์žฅ read-only์ผ๋•Œ ๋น ๋ฆ„ Static data : ํ”„๋กœ๊ทธ๋žจ๊ณผ lifetime์„ ํ•จ๊ป˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ Stack : Local ๋ณ€์ˆ˜๋“ค Heap : ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ File Format Windows : PE (Portable Executable) Unix : ELF (Executable and Linkable Format) ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ environment : <๋ณ€์ˆ˜, storage location> ์ •๋ณด state: <๋ณ€์ˆ˜, ๊ฐ’> ์ •๋ณด ์–ด๋–ค ๋ณ€์ˆ˜ N์ด storage location S์— ์ง€์ •๋˜๋ฉด ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค Static Allocation ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” location์œผ๋กœ ๋ฐ”์ธ๋”ฉ Heap Allocation ์—ฐ์†์ ์ธ global ์˜์—ญ์˜ ์ผ๋ถ€๋ฅผ OS๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฒƒ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘ ์š”์ฒญ๊ณผ ๋ฐ˜ํ™˜ Stack Management Run-time stack : ํ•œ ํ•จ์ˆ˜ call๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ๋‘๋Š” frames Activation record : ํ•จ์ˆ˜ ์ˆ˜ํ–‰์„ ์œ„ํ•œ execution env(local var, parameter, return address, etc.) Top frame : ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ํ•จ์ˆ˜์˜ frame Stack pointers SP : Frame top FP : Frame base ๋‘ ๊ฐœ๋ฅผ ์“ฐ๋Š” ์ด์œ  ๊ฐ€๊นŒ์šด ๊ฑฐ ๊ธฐ์ค€์œผ๋กœ offset ๊ณ„์‚ฐ -> small offset ์œ ์ง€ ์ˆ˜ํ–‰ ์ค‘ top frame์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ Semantic Analysis - Symbol Tables Scope Identifier: ์‹๋ณ„์ž Lexical Scope: ํŠน์ • ๋ฒ”์œ„ ์‹๋ณ„์ž์˜ Scope: ๊ทธ ์‹๋ณ„์ž์˜ ์„ ์–ธ์ด ์ฐธ์กฐ๋˜๋Š” lexical scope Symbol Table Name Kind Type Attribute foo func int, int -> int extern m arg int tmp var char const ํ•˜๋‚˜์˜ lexical๋งˆ๋‹ค ํ•˜๋‚˜์˜ symbol table symbol table์€ ๊ณ„์ธต์ ์ด๋‹ค ํ˜„์žฌ scope์— ์—†์œผ๋ฉด ์ƒ์œ„ scope๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ฐพ๋Š”๋‹ค Symbol Table Implementation AST๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ๊ฐ€๋Šฅ Local Table์€ hash table ์‚ฌ์šฉ Global Table์€ N-array tree ๊ตฌ์กฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๋งŒ๋“ฌ (scope ์Šคํƒ์„ ์‚ฌ์šฉ) Type Checking Type Expressions Array types: T[], T[10] Structure types : {id1: T1, id2: T2 …} Pointer types: T* Function types: T1 X T2 X … X Tn -> T_return Type Judgement A โ”œ E : T A ์ƒํ™ฉ์—์„œ E๋Š” Tํƒ€์ž…์„ ๋งŒ์กฑํ•œ๋‹ค A โ”œ if(E) S1 else S2 : T ์œ„ ์กฐ๊ฑด์€ ๋ชจ๋“  E, S1, S2, A, T์— ๋Œ€ํ•œ ๊ฐ€์ •์ด ์„ฑ๋ฆฝํ•  ๋•Œ ๊ฒฐ๋ก  T๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค Proof Tree (ํƒ€์ž… ์œ ๋„ ํŠธ๋ฆฌ) ์—ญ์‚ผ๊ฐํ˜• ๋ชจ์–‘ ๋งŒ์กฑํ•˜๋Š” proof tree๊ฐ€ ์žˆ๋‹ค -> ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค ๊ทธ ์™ธ Semantic Analyses break, continue, goto ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ง€ ๋“ฑ ์ปดํŒŒ์ผ๋Ÿฌ ํ›„๋ฐ˜๋ถ€ (๋น ๋ฅด๊ณ , ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ) Instruction Selection Tree ๊ธฐ๋ฐ˜ Intermediate Representation MEM(e) : ์ฃผ์†Œ e๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•œ word์˜ ๋‚ด์šฉ TEMP(t) : ๋ ˆ์ง€์Šคํ„ฐ t SEQ(s1, s2): ๋ฌธ์žฅ s1 ์ˆ˜ํ–‰ ํ›„ s2 ์ˆ˜ํ–‰ ESEQ(s, e): ๋ฌธ์žฅ s ์ˆ˜ํ–‰ ํ›„ (๊ฒฐ๊ณผ ์—†์Œ) e๊ฐ€ ์ถ”๊ฐ€ ์ˆ˜ํ–‰ BINOP(o, e1, e2) : ์—ฐ์‚ฐ์ž o, ํ”ผ์—ฐ์‚ฐ์ž e1, e2, ๊ฒฐ๊ณผ ์ €์žฅ๋œ ์ฃผ์†Œ ๋ฐ˜ํ™˜ const(i): ์ •์ˆ˜ ์ƒ์ˆ˜ i Register Allocation ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ Register์— ์ €์žฅ Interference ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ definition์ด live range ์—์„œ ๊ณตํ†ต operation์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ Interference Graph : ์„œ๋กœ interfere ํ•˜๋ฉด ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„ Graph coloring : ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ์น ํ•˜๊ธฐ Instruction Scheduling instruction์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด stall ๊ฐœ์ˆ˜ ๋“ฑ์„ ์ค„์—ฌ์„œ ์ˆ˜ํ–‰์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ stall : ๋‹ค๋ฅธ ๋ช…๋ น์–ด ์ˆ˜ํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ CPU๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ ๋ชฉํ‘œ Wasting time์„ ์ค„์ธ๋‹ค ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค register spilling์„ ํ”ผํ•ด์•ผํ•œ๋‹ค Static scheduling ๋‹จ๊ณ„ Local basic scheduling, Loop scheduling, global scheduling Local basic scheduling List scheduling : greedy, heuristic, local technique ์‚ฌ์šฉ precedence graph๋ฅผ ๋งŒ๋“ ๋‹ค ๊ฐ ๋…ธ๋“œ์— priority function์„ ์ ์šฉํ•œ๋‹ค “ready-operation queue"๋ฅผ ์—์„œ ready operation์„ ํ•˜๋‚˜ ์„ ํƒ ํ›„ scheduling, ready operation queue๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Longest latency-weighted path๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค ๊ธฐํƒ€ Optimization ๋ฐฉ๋ฒ• addr r1 1 -> inc r1 ํŠน์ˆ˜ ์„ฑ์งˆ์˜ ๋ ˆ์ง€์Šคํ„ฐ ํ™œ์šฉ ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ช…๋ น์–ด ํ™œ์šฉ Register ๊ฐ„ mov ์ œ๊ฑฐ ์ค‘๋ณต๋œ load ์ œ๊ฑฐ Control Flow Optimizations(์ตœ์ ํ™”) ์ฃผ์–ด์ง„ ์ž…๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ข€ ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ„๋ฅ˜ ๋ฐฉ๋ฒ• ๋ถ„์„ : Control Flow Analysis vs Data Flow Analysis ์ตœ์ ํ™” Inner basic block(local) vs Inter basic block(global) Cyclic code opt vs Acyclic code opt Control Flow Analysis Control Flow ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋Šฅํ•œ ์ˆ˜ํ–‰์ˆœ์„œ (๋ถ„๊ธฐ) Branch Execution -> dynamic control flow : ์‹คํ–‰ ํ•ด๋ด์•ผ ํ™•์ธ ๊ฐ€๋Šฅ Compiler -> static control flow : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ„์„ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์Œ Analysis ์ •์  ์„ฑ์งˆ (static property): ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์—†์ด ๋„์ถœ ๋˜๋Š” ์„ฑ์งˆ CFA(Control Flow Analysis) : ์ฝ”๋“œ์˜ ๋ถ„๊ธฐ ๊ตฌ์กฐ๋ฅผ CFG ํ˜•ํƒœ๋กœ ํ‘œํ˜„ Basic Block ๋™์ผํ•œ execution condition์„ ์ ์šฉ๋ฐ›๋Š” instruction ๋ฌถ์Œ instruction ์™ธ์—๋Š” branch๊ฐ€ ์—†์Œ Maximal basic block ๊ตฌํ•˜๊ธฐ BB์˜ leader(์ฒซ๋ฒˆ์งธ instruction)๋ฅผ ์ฐพ๋Š”๋‹ค ๋‹ค์Œ leader ์ด์ „๊นŒ์ง€์˜ instruction์„ ๊ตฌํ•œ๋‹ค Weighted CFG Profiling: ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด์„œ ์‹คํ–‰ํšŸ์ˆ˜๋ฅผ ์–ป์Œ ์–ป์€ weight๋ฅผ edge์— ํ‘œ์‹œ Control Flow Optimization Acyclic Code Loop๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›€ ์ข…๋ฅ˜ Inner basic block opt. = Intra opt. = Local opt. Inter basic block opt. = Global opt. Inner Basic Block Optimization Commn subexpression elimination ๊ณตํ†ต๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Algebraic simplification ๋Œ€์ˆ˜๋ฒ•์น™์„ ์ด์šฉํ•˜์—ฌ ์‹์„ ๊ฐ„์†Œํ™” ex) x=1*y; -> x=y; Strength reduction ์—ฐ์‚ฐ์ž์˜ ๋น„์šฉ์ด ์ ์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ex) x=x*2; -> x=x+x; ex) y=a/4; -> y=a>>2; Constant folding / propagation folding: ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ƒ์ˆ˜์‹์„ ์ง์ ‘์‹œ๊ฐ„ propagation : ๊ณ ์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด Inter Basic Block Optimization Global application of inner basic block optimization Global common subexpression elimination basic block ๊ฐ„์˜ ๊ณตํ†ต ๋ถ€๋ถ„์‹์— ๋Œ€ํ•ด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Global constant folding / propagation basic block ๊ฐ„์˜ ์ƒ์ˆ˜๋ฅผ ์ธ์‹ํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Other transformation Branch to unconditional branch ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ ์ œ๊ฑฐ Unconditional branch to branch ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋ถ„๊ธฐ -> ๋ถ„๊ธฐ ํ•œ๋ฒˆ์œผ๋กœ ๋ณ€๊ฒฝ Branch to next basic block (next instr) ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋‹ค์Œ basic block์œผ๋กœ ๋ถ„๊ธฐ ์ œ๊ฑฐ Basic block merging ๋‘ basic block์„ ํ•ฉ์นจ Branch to same target ๊ฐ™์€ basic block์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ Branch target expansion ๋ถ„๊ธฐ ๋Œ€์ƒ์ด ๋˜๋Š” basic block์„ ํ•ฉ์นจ Unreachable code elimination Entry์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ‘unreachable’ block ์ œ๊ฑฐ Loop Optimization Loop๋Š” ํ•œ๋ฒˆ optimizeํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค Loop unrolling : ๋ฐ˜๋ณต๋ฌธ์„ ํ’€์–ด์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ž„ Loop invarient : ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฐ’์„ ๋‚ด๋Š” ๋ฌธ์žฅ์„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ–์œผ๋กœ ๋นผ๋ƒ„ Count up to zero : i๋ฅผ ๊ฐ์†Œํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ (i๋ฅผ 0๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด n๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„) Dataflow Analysis + Optimization Dataflow Analysis ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ๊ฐ data ๊ฐ’๋“ค์ด ์ƒ์„ฑ/์†Œ๋ฉธ๋˜๋Š” ์ •๋ณด๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ Reaching Definition Analysis definition : ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ assign๋˜๋Š” ๊ฒƒ reach : definition d๊ฐ€ ํŠน์ • ์œ„์น˜ p์— ๋„๋‹ฌํ•œ๋‹ค kill : definition d์˜ ๋‘๊ฐœ์˜ ํฌ์ธํŠธ์‚ฌ์ด์—์„œ ๋‹ค๋ฅธ definition์ด ์กด์žฌํ•œ๋‹ค GEN/KILL GEN: ๋ธ”๋ก ๋‚ด์—์„œ ์ƒ์„ฑ๋œ definition KILL: ๋ธ”๋ก ๋‚ด์—์„œ ์†Œ๋ฉธ๋œ definition IN/OUT IN : ์ด์ „ ๋ธ”๋ก์˜ OUT์˜ ํ•ฉ์ง‘ํ•ฉ OUT : IN์—์„œ GEN์„ ๋”ํ•˜๊ณ  KILL์„ ๋บ€ ๊ฒƒ
new ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ฐœ์š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๊ธฐ๋ฐ€์„ฑ(Confidentiality) ์ •๋ณด๋ฅผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฐœ์ธ์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•จ ๋ฌด๊ฒฐ์„ฑ(Integrity) ์ •๋ณด์™€ ํ”„๋กœ๊ทธ๋žจ์€ ์ธ๊ฐ€๋œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•จ ๊ฐ€์šฉ์„ฑ(Availability) ์ •๋ณด ์ž์‚ฐ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ ๋ณด์•ˆ ๊ณต๊ฒฉ์˜ ์ข…๋ฅ˜ ์†Œ๊ทน์  ๊ณต๊ฒฉ(Passive Attack) ์ •๋ณด๋ฅผ ๋„์ฒญํ•˜๊ฑฐ๋‚˜ ๊ฐ์‹œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ์•”ํ˜ธํ™” ์ ๊ทน์  ๊ณต๊ฒฉ(Active Attack) ์ •๋ณด๋ฅผ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ๋ฉ”์‹œ์ง€ ์ธ์ฆ ๋ณด์•ˆ ์„œ๋น„์Šค ์ธ์ฆ(Authentication) ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ • ๋Œ€๋“ฑ ๊ฐœ์ฒด ์ธ์ฆ, ๋ฐ์ดํ„ฐ-๊ทผ์›์ง€ ์ธ์ฆ ์ ‘๊ทผ ์ œ์–ด(Access Control) ์ž์›์„ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ€์„ฑ(Data Confidentiality) ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ•์  ๋…ธ์ถœ์„ ๋ง‰๋Š” ๊ฒƒ ์—ฐ๊ฒฐ๊ธฐ๋ฐ€์„ฑ, ๋น„์—ฐ๊ฒฐ ๊ธฐ๋ฐ€์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๊ธฐ๋ฐ€์„ฑ, ํŠธ๋ž˜ํ”ฝ-ํ๋ฆ„ ๊ธฐ๋ฐ€์„ฑ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(Data Integrity) ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†ก์‹ ๋œ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์„ ๋ณ„๋œ-ํ•„๋“œ ์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ ๋ถ€์ธ ๋ด‰์‡„ (Non-repudiation) ํ†ต์‹ ์˜ ํ•œ ์ฃผ์ฒด๊ฐ€ ํ†ต์‹ ์— ์ฐธ์—ฌํ–ˆ๋˜ ์‚ฌ์‹ค์„ ๋ถ€์ธํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ๊ฐ€์šฉ์„ฑ ์„œ๋น„์Šค (Availability Service) ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ํ”„๋กœํ† ์ฝœ ๊ณ„์ธต์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ธ์ฆ ์•”ํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช… ์ ‘๊ทผ ์ œ์–ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ธ์ฆ ๊ตํ™˜ ํŠธ๋ž˜ํ”ฝ ํŒจ๋”ฉ ๊ฒฝ๋กœ ์ œ์–ด ๊ณต์ฆ ์ผ๋ฐ˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค์— ๋…๋ฆฝ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‹ ๋ขฐ๋ฐ›๋Š” ๊ธฐ๋Šฅ ๋ณด์•ˆ ๋ ˆ์ด๋ธ” ์‚ฌ๊ฑด ํƒ์ง€ ๋ณด์•ˆ ๊ฐ์‚ฌ ์ถ”์  ๋ณด์•ˆ ๋ณต๊ตฌ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ์ดํ•ด ์ „ํ†ต์ ์ธ ์•”ํ˜ธ ๊ธฐ์ˆ  ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋น„๋ฐ€์„ฑ ์œ ์ง€ (Confidentiality) ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€ (Data Integrity) ์‚ฌ์šฉ์ž ๋˜๋Š” ์ž๋ฃŒ์˜ ์ถœ์ฒ˜ ์ธ์ฆ (Authentication) ๋ถ€์ธ ๋ฐฉ์ง€ (Non-repudiation) ์•”ํ˜ธ ํ•ด๋… ํ•ด๋…์ž๋Š” ์•”ํ˜ธ ์‹œ์Šคํ…œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ํ‚ค๋งŒ ๋ชจ๋ฆ„ Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ ๋‹จ๋… ๊ณต๊ฒฉ Know Plain Text Attack : ์•Œ๋ ค์ง„ ํ‰๋ฌธ ๊ณต๊ฒฉ Chosen Plain Text Attack : ์„ ํƒ์  ํ‰๋ฌธ ๊ณต๊ฒฉ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ์˜ ๋น„๊ต ๊ตฌ๋ถ„ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ ํ‚ค์˜ ๊ด€๊ณ„ ์•”ํ˜ธํ™” ํ‚ค != ๋ณตํ˜ธํ™” ํ‚ค ์•”ํ˜ธํ™” ํ‚ค = ๋ณตํ˜ธํ™” ํ‚ค ํ‚ค์˜ ๊ฐœ์ˆ˜ 2n n(n-1)/2 1์ธ๋‹น ํ•„์š”ํ•œ ๋น„๋ฐ€ํ‚ค 1 n-1 ์†๋„ ๋น„ํšจ์œจ์  ํšจ์œจ์  ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ : ๋ธ”๋ก ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” DES, IDEA, AES ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ : ๋น„ํŠธ ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” RC4, A5/1 ํ•œ๊ตญ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด ๊ธฐ๋ฐ˜ : RSA ์ด์‚ฐ ๋Œ€์ˆ˜ ๊ธฐ๋ฐ˜ : ElGamal ํƒ€์› ๊ณก์„  ๊ธฐ๋ฐ˜ ํ‚ค ์ƒ์„ฑ ์„œ๋กœ์†Œ์ธ ๋‘ ์†Œ์ˆ˜ p, q๋ฅผ ์„ ํƒ n = p * q ฯ†(n) = (p-1)(q-1) gcd(e, ฯ†(n)) = 1์„ ๋งŒ์กฑํ•˜๋Š” e ์„ ํƒ d * e mod ฯ†(n) = 1์„ ๋งŒ์กฑํ•˜๋Š” d ์„ ํƒ ๊ณต๊ฐœํ‚ค : {e, n}, ๋น„๋ฐ€ํ‚ค : {d, n} ์•”ํ˜ธํ™” C = M^e mod n ๋ณตํ˜ธํ™” M = C^d mod n DH (Diffie Hellman) ํ‚ค ๊ณต์œ  q(์†Œ์ˆ˜), ฮฑ(q์˜ ์›์‹œ๊ทผ, ฮฑ<q) ์ž„์˜ ์ˆ˜ $X_A < q$๋ฅผ ๋งŒ์กฑํ•˜๋Š” $X_A$๋ฅผ ์„ ํƒ ๊ณต๊ฐœํ•  $Y_A = \alpha^{X_A} mod\ q$ ์ƒ๋Œ€๋ฐฉ์ด ์ƒ์„ฑํ•˜๋Š” ๋น„๋ฐ€ํ‚ค $K = Y_A^{X_B} mod\ q$ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ ์œ„์กฐ ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ์„œ๋ช…์ž์˜ ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™” ์„œ๋ช…์ž์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฉ”์‹œ์ง€ ์ธ์ฆ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์š”๊ฑด ๋‹จ๋ฐฉํ–ฅ์„ฑ : H(x) = h์ผ๋•Œ, x๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ์•ฝํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” y(=x)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ฐ•ํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” (x, y)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ณต๊ฐœํ‚ค ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ์ธ์ฆ์„œ ๊ณต๊ฐœํ‚ค์™€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์ „์ž ๋ฌธ์„œ ํ‘œ์ค€ : X.509 v3 PKI (Public Key Infrastructure) ๊ณต๊ฐœํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๊ตฌ์กฐ CA (Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ RA (Registration Authority) : ์‚ฌ์šฉ์ž ๋“ฑ๋ก CRL (Certificate Revocation List) : ํ๊ธฐ๋œ ์ธ์ฆ์„œ ๋ชฉ๋ก ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ  ๋™ํ˜•์•”ํ˜ธ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๋ฉด ์›๋ฌธ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋ฒ• ๋ถ€๋ถ„ ๋™ํ˜• ์•”ํ˜ธ : ๋ง์…ˆ๊ณผ ๊ณฑ์…ˆ ์ค‘์—์„œ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ๋งŒ ์ง€์› ์ค€๋™ํ˜• ์•”ํ˜ธ : ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜์— ์ œํ•œ์ด ์กด์žฌ ์™„์ „ ๋™ํ˜• ์•”ํ˜ธ : ์ž„์˜์˜ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ ํ™œ์šฉ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์ด ๋†’์Œ ์–‘์ž ๋‚ด์„ฑ ์•”ํ˜ธ (PQC: Post Quantum Cryptography) ์–‘์ž ์ปดํ“จํ„ฐ์— ์˜ํ•œ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ QKD(Quantum Key Distribution) : ์–‘์ž ํ†ต์‹ ์„ ์œ„ํ•ด ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ถ„๋ฐฐ/๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ  QRNG(Quantum Random Number Generator) : ์–‘์ž ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‚ฌ์šฉ์ž ์ธ์ฆ ์›๋ฆฌ ์ธ์ฆ ์ ˆ์ฐจ ์‹ ์› ํ™•์ธ ๋‹จ๊ณ„ ์ž…์ฆ ๋‹จ๊ณ„ NIST์˜ ์ „์ž ์ธ์ฆ ๋ชจ๋ธ ์ธ์ฆ ์ˆ˜๋‹จ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ†ตํ•œ ์ธ์ฆ : ๋น„๋ฐ€๋ฒˆํ˜ธ ์†Œ์œ ๋ฌผ์„ ํ†ตํ•œ ์ธ์ฆ : OTP ๊ธฐ๊ธฐ, ์ธ์ฆ์„œ ์ƒ์ฒด ์กฐ์ง์„ ํ†ตํ•œ ์ธ์ฆ : ์ง€๋ฌธ, ๋ง๋ง‰ ํ–‰๋™์„ ํ†ตํ•œ ์ธ์ฆ : ๋ชฉ์†Œ๋ฆฌ ํŒจํ„ด, ํ•„์  ๋ณด์กด ๋“ฑ๊ธ‰ ์˜ํ–ฅ ํ”„๋กœํŒŒ์ผ ๋ณด์ฆ๋ ˆ๋ฒจ : ์‹ ๋ขฐ์„œ ์ •๋„์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ๋“ฑ๊ธ‰์œผ๋กœ ๋ถ„๋ฅ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ณต๊ฒฉ ์œ ํ˜• ์˜คํ”„๋ผ์ธ ์‚ฌ์ „ ๊ณต๊ฒฉ ํŠน์ • ๊ณ„์ • ๊ณต๊ฒฉ ์ž˜ ์•Œ๋ ค์ง„ ํŒจ์Šค์›Œ๋“œ ๊ณต๊ฒฉ, ๋Œ€์ž… ๊ณต๊ฒฉ ๋‹จ์ผ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํŒจ์Šค์›Œ๋“œ ์ถ”์ธก ๋‹จ๋ง๊ธฐ ๊ฐ•ํƒˆ ์‚ฌ์šฉ์ž ์‹ค์ˆ˜ ์ด์šฉ ๋‹ค์ค‘ ๋น„๋ฐ€ ๋ฒˆํ˜ธ ์‚ฌ์šฉ ์ปดํ“จํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง : ํ†ต์‹  ํŒจํ‚ท ๋ถ„์„ ํ•ด์‹œํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ Salt์˜ ์—ญํ•  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ•จ ํŒจ์Šค์›Œ๋“œ ํฌ๋ž™ํ‚น ์‚ฌ์ „ ๊ณต๊ฒฉ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ : ๋ชจ๋“  ์†”ํŠธ์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋†“์€ ํ…Œ์ด๋ธ”์„ ์ด์šฉ ํŒจ์Šค์›Œ๋“œ ์„ ํƒ ๊ธฐ๋ฒ• ์‚ฌ์šฉ์ž ๊ต์œก ์ปดํ“จํ„ฐ ๋ฐœ์ƒ ํŒจ์Šค์›Œ๋“œ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ์˜ ํ™œ์„ฑํ™” : ์ž์ฒด ํŒจ์Šค์›Œ๋“œ ํฌ๋ž˜์ปค ์‹คํ–‰ ์‚ฌ์ „ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ : ํŒจ์Šค์›Œ๋“œ ์•ˆ์ •์„ฑ ๊ฒ€์‚ฌ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ข…๋ฅ˜ ๋ฉ”๋ชจ๋ฆฌ ์นด๋“œ ์Šค๋งˆํŠธ ์นด๋“œ : ์ž„๋ฒ ๋””๋“œ ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ ํฌํ•จ ์ƒ์ฒด ์ธ์ฆ ๊ธฐ์ˆ  ์ •ํ™•๋„ : ํ™•๋ฅ  ๋ฐ€๋„ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฆ„ FAR (False Acceptance Rate) : ๊ฑฐ์ง“ ์ˆ˜๋ฝ๋ฅ  FRR (False Rejection Rate) : ๊ฑฐ์ง“ ๊ฑฐ๋ถ€์œจ EER (Equal Error Rate) : FAR๊ณผ FRR์ด ๊ฐ™์€ ์ง€์  ์›๊ฒฉ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฉ€ํ‹ฐ ํŒฉํ„ฐ ์ธ์ฆ : ๋‘ ์š”์†Œ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฉ€ํ‹ฐ ์ฑ„๋„ ์ธ์ฆ : ๋‹ค์–‘ํ•œ ์ฑ„๋„์„ ํ†ตํ•ด ์ธ์ฆ ์ธ์ฆ ํ”„๋กœํ† ์ฝœ ํŒจ์Šค์›Œ๋“œ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํŒจ์Šค์›Œ๋“œ์™€ ๋‚œ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑ, ์ „์†ก ํ† ํฐ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚œ์ˆ˜๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ์ •์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๋Š” ๋‚œ์ˆ˜์™€ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ์‹๋ณ„์ž๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ฒด ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ๋™์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋žœ๋ค ์‹œํ€€์Šค๋‚˜ ๋‚œ์ˆ˜๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ๋งํ•˜๊ฑฐ๋‚˜, ๊ธ€์ž๋ฅผ ์“ฐ๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰, ์•”ํ˜ธํ™” ํ›„ ์ „์†ก ์ ‘๊ทผ ์ œ์–ด ์ ‘๊ทผ ์ œ์–ด ์›๋ฆฌ ์ ‘๊ทผ์ œ์–ด ์ฒ ํ•™ ์ ‘๊ทผํ†ต์ œ ์˜์—ญ ๊ด€๋ฆฌ์  ํ†ต์ œ ๊ธฐ์ˆ ์  ํ†ต์ œ ๋ฌผ๋ฆฌ์  ํ†ต์ œ ์ ‘๊ทผ ์ œ์–ด ์›์น™ ์•Œ ํ•„์š”์„ฑ ์›์น™ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ตœ๋Œ€ ๊ถŒํ•œ ์›์น™ ์ง๋ฌด ๋ถ„๋ฆฌ ์›์น™ ์ ‘๊ทผ ์ œ์–ด ๊ธฐ๋ณธ ์š”์†Œ ์ฃผ์ œ : ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์กด์žฌ : user, group, other ๊ฐ์ฒด : ์ ‘๊ทผ์ด ์ œ์–ด๋˜๋Š” ์ž์› : ํŒŒ์ผ ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ ‘๊ทผ ๊ถŒํ•œ : ์ฃผ์ฒด๊ฐ€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• : ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰ ๋“ฑ ์ ‘๊ทผ ์ œ์–ด ์š”๊ตฌ ์‚ฌํ•ญ ๋‹ซํžŒ ์ •์ฑ… : ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์—ด๋ฆฐ ์ •์ฑ… : ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ… ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC) ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (RBAC) ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (ABAC) ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC, ์ž์œจ์  ์ ‘๊ทผ ์ œ์–ด) ํ•œ ๊ฐœ์ฒด๊ฐ€ ์ž์‹ ์˜ ์˜์ง€๋Œ€๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์ ‘๊ทผ ์ œ์–ด ๋ชฉ๋ก (access control list) > ๊ฐœ์ฒด๋ณ„๋กœ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹ ์ธ๊ฐ€ ํ…Œ์ด๋ธ” ํ™•์žฅ๋œ ์ ‘๊ทผ ์ œ์–ด ๋งคํŠธ๋ฆญ์Šค UNIX ํŒŒ์ผ ์ ‘๊ทผ ์ œ์–ด Set-UID : ์‹คํ–‰ํ•  ๋•Œ, euid๋ฅผ ์†Œ์œ ์ž์˜ id๋กœ ์„ค์ •๋จ ex) -rwsr-xr-x : 4755 Set-GID : ์‹คํ–‰ํ•  ๋•Œ, egid๋ฅผ ์†Œ์œ ๊ทธ๋ฃน์˜ id๋กœ ์„ค์ •๋จ ex) -rwxr-sr-x : 2755 ํŒจ์Šค์›Œ๋“œ ํŒŒ์ผ : /etc/shadow : ———- : 000 ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์— ๋”ฐ๋ผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์—ญํ•  ๊ณ„์ธต - RBAC1 ์—ญํ•  ๊ตฌ์กฐ๋Š” ๊ธฐ๊ด€ ๋‚ด ์—ญํ• ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜๋‹จ ์ œ์•ฝ(์ „์ œ์กฐ๊ฑด)์˜ ์˜๋ฏธ์™€ ์ข…๋ฅ˜ - RBAC2 ์ œ์•ฝ์˜ ์ข…๋ฅ˜ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์—ญํ•  : ์ง๋ฌด์™€ ๋Šฅ๋ ฅ์„ ๋ถ„๋ฆฌ cardinality : ์—ญํ• ์— ๊ด€ํ•œ ์ตœ๋Œ€์ˆซ์ž๋ฅผ ์„ค์ • ์ „์ œ ์กฐ๊ฑด : ํŠน์ • ์—ญํ• ์ด ๋‹ค๋ฅธ ๋ช…์‹œ๋œ ์—ญํ• ์— ํ• ๋‹น ๋˜์—ˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์—ญํ• ์—๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์ž์›๊ณผ ์ฃผ์ฒด์˜ ์„ฑ์งˆ์˜ ํŠน์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜์—ฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹ ABAC ๋ชจ๋ธ์˜ 3๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ๊ตฌ์„ฑ ๋‚ด์˜ ์กด์žฌ๋ฅผ ์œ„ํ•ด ์ •์˜๋œ ์†์„ฑ ABAC ์ •์ฑ…์„ ์œ„ํ•ด ์ •์˜๋œ ์ •์ฑ… ๋ชจ๋ธ ์ ‘๊ทผ ์ œ์–ด ์‹คํ–‰์„ ์œ„ํ•œ ์ •์ฑ…์— ์ ์šฉ๋˜๋Š” ๊ตฌ์กฐ ๋ชจ๋ธ ์†์„ฑ ์ฃผ์ฒด, ๊ฐ์ฒด ํ™˜๊ฒฝ ์กฐ๊ฑด, ๊ถŒํ•œ์— ์˜ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋˜๊ณ  ํ• ๋‹น๋œ ์š”๊ตฌ ๋™์ž‘์˜ ํŠน์ • ์ธก๋ฉด์„ ์ •์˜ํ•˜๋Š” ์„ฑ์งˆ ์œ ํ˜• ์ฃผ์ฒด ์†์„ฑ : ์‚ฌ์šฉ์ž, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, ํ”„๋กœ์„ธ์Šค, ๋””๋ฐ”์ด์Šค ๊ฐ์ฒด ์†์„ฑ : ๋””๋ฐ”์ด์Šค, ํŒŒ์ผ, ํ”„๋กœ๊ทธ๋žจ, ๋„คํŠธ์›Œํฌ ๋“ฑ ํ™˜๊ฒฝ ์†์„ฑ : ๋‚ ์งœ, ์‹œ๊ฐ„, ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๋ ˆ๋ฒจ ๋“ฑ ABAC์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ ACL ์ ‘๊ทผ ์ฒด์ธ ABAC ์‹ ๋ขฐ ์ฒด์ธ ์ •์ฑ… ์กฐ์ง ๋‚ด์—์„œ ์ฃผ์ฒด์˜ ๊ถŒํ•œ๊ณผ ํ™˜๊ฒฝ ์กฐ๊ฑด์—์„œ ์ž์› ํ˜น์€ ๊ฐ์ฒด๋“ค์ด ๋ณดํ˜ธ๋˜๋Š” ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ํ—ˆ๊ฐ€๋œ ํ–‰์œ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ทœ์น™๊ณผ ๊ด€๊ณ„์˜ ์ง‘ํ•ฉ ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ๊ฐ์ฒด์— ํฌํ•จ๋œ ์ •๋ณด์˜ ๋น„๋ฐ€์„ฑ๊ณผ ์ด๋Ÿฌํ•œ ๋น„๋ฐ€์„ฑ์˜ ์ ‘๊ทผ ์ •๋ณด์— ๋Œ€ํ•˜์—ฌ ์ฃผ์ฒด๊ฐ€ ๊ฐ–๋Š” ๊ถŒํ•œ์— ๊ทผ๊ฑฐํ•˜์—ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ธฐ๋ฐ€์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ณด์•ˆ ์†์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ณด์•ˆ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ๋ฌด๊ฒฐ์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ์‹ ์›, ์‹ ์šฉ์žฅ, ์ ‘๊ทผ ๊ด€๋ฆฌ (ICAM) ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› : ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ, ์‹œ์Šคํ…œ ์ž์›, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ž์› ์ „ํ†ต์ ์ธ DoS ๊ณต๊ฒฉ ํ”Œ๋Ÿฌ๋”ฉ ํ•‘ ๋ช…๋ น ๋Œ€์ƒ ์กฐ์ง์— ๋Œ€ํ•ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์ œ์••ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์  ์‹œ์ž‘ ์ฃผ์†Œ ์Šคํ‘ธํ•‘ ์œ„์กฐ๋œ ์†Œ์Šค ์ฃผ์†Œ ์‚ฌ์šฉ ํ›„๋ฐฉ ์‚ฐ๋ž€(backscatter) ํŠธ๋ž˜ํ”ฝ์„ ์ด์šฉํ•ด ๋Œ€์‘ SYN ์Šคํ‘ธํ•‘ ์ผ๋ฐ˜์ ์ธ DoS๊ณต๊ฒฉ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋„˜์น˜๊ฒŒ ํ•จ Flooding ๊ณต๊ฒฉ์— ๋น„ํ•ด ์ ์€ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ๊ณต๊ฒฉ์ž ์ž…์žฅ ์Šคํ‘ธํ•‘๋œ ์‹œ์Šคํ…œ์ด ์กด์žฌํ•œ๋‹ค๋ฉด Reset ํŒจํ‚ท์„ ์ˆ˜์‹  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ด๋จธ์— ์˜ํ•œ ์žฌ์ „์†ก ํ›„ ์—”ํŠธ๋ฆฌ ์‚ญ์ œ Reset์œผ๋กœ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉ ํ”Œ๋Ÿฌ๋”ฉ ๊ณต๊ฒฉ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ ICMP ํ”Œ๋Ÿฌ๋”ฉ UDP ํ”Œ๋Ÿฌ๋”ฉ TCP SYN ํ”Œ๋Ÿฌ๋”ฉ DDoS (Distributed Denial of Service) ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹ ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ฐ˜ ๋Œ€์—ญํญ ๊ณต๊ฒฉ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ(SIP) ํ”Œ๋Ÿฌ๋“œ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ : VoIP ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ HTTP ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ์ŠคํŒŒ์ด๋”๋ง(spidering) ํŠน์ • HTTP ๋งํฌ์—์„œ ์‹œ์ž‘๋˜๋ฉฐ, ์žฌ๊ท€์  ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์›น์‚ฌ์ดํŠธ์— ๋ชจ๋“  ๋งํฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ด‡ R-U-DEAD-YET (RUDY) ๊ณต๊ฒฉ Content-Length๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์„œ๋ฒ„์˜ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ๋ฒ• Slowloris ๊ณต๊ฒฉ ๋น„์ •์ƒ์ ์ธ ํ—ค๋” ๊ฐ’์„ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์—ฌ, ์„œ๋ฒ„๊ฐ€ ํ—ค๋”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๋ฐ ์ฆํญ ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ TCP SYN ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ DNS ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ ์ฆํญ ๊ณต๊ฒฉ (smurfs) DNS ์ฆํญ ๊ณต๊ฒฉ ๊ณต๊ฒฉ์ž๊ฐ€ ํƒ€๊ฒŸ ์‹œ์Šคํ…œ์˜ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” DNS ์—ฐ์‡„์  ์š”์ฒญ ์ ์€ ์š”์ฒญ์œผ๋กœ ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” DNS ํ–‰์œ„๋ฅผ ์ด์šฉ ๋ฐฉ์–ด์ฑ… : ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ์˜ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ DoS ๊ณต๊ฒฉ ๋ฐฉ์–ด, ์˜ˆ๋ฐฉ, ๋Œ€์‘ DoS ๊ณต๊ฒฉ ์˜ˆ๋ฐฉ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ ์ฐจ๋‹จ TCP ์—ฐ๊ฒฐ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • IP ๋‹ค์ด๋ ‰ํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ๊ธฐ๋Šฅ ์ฐจ๋‹จ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„œ๋น„์Šค๋‚˜ ๋ถ€ํ˜ธ์กฐํ•ฉ ์ฐจ๋‹จ capcha๋ฅผ ์ด์šฉํ•ด ์ž๋™ํ™”๋œ ์š”์ฒญ ์ฐจ๋‹จ ์•Œ๋งž์€ ํ‘œ์ค€ ์‹œ์Šคํ…œ ๋ณด์•ˆ ๊ด€ํ–‰ํ™” ๋ฏธ๋Ÿฌ ์„œ๋ฒ„ ๋˜๋Š” ๋ณต์ œ ์„œ๋ฒ„์˜ ์‚ฌ์šฉ DoS ๊ณต๊ฒฉ ๋Œ€์‘ ๊ณต๊ฒฉ ์œ ํ˜• ํ™•์ธ : ํŒจํ‚ท ์บก์ฒ˜ ISP๋กœ ํŒจํ‚ท์˜ ํ๋ฆ„์„ ์—ญ์ถ”์  : ๋†’์€ ๋น„์šฉ ๋ฐœ์ƒ ๋น„์ƒ ์‚ฌํƒœ ๊ณ„ํš ๊ตฌํ˜„ ์‚ฌ๊ณ  ๋Œ€์‘ ๊ณ„ํš ์—…๋ฐ์ดํŠธ DNS ์‹ฑํฌํ™€ ์ ์šฉ ์ข€๋น„์™€ C&C ์„œ๋ฒ„์˜ ํ†ต์‹ ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ• DDoS ๋Œ€ํ”ผ์†Œ ์นจ์ž… ํƒ์ง€์™€ ์นจ์ž… ์ฐจ๋‹จ ์นจ์ž…์ž ์นจ์ž…์ž ์œ ํ˜• ์‚ฌ์ด๋ฒ„ ๋ฒ”์ฃ„์ž ํ•ดํ‚น์ฃผ์˜์ž ์ •๋ถ€ ํ›„์› ์ง‘๋‹จ ๊ธฐํƒ€ ํ–‰๋™ ํŒจํ„ด ๊ณต๊ฒฉ ๋Œ€์ƒ ํฌ์ฐฉ ๋ฐ ์ •๋ณด ์ˆ˜์ง‘ ์ดˆ๊ธฐ ์ ‘์† ๊ถŒํ•œ ์ƒ์Šน ์ •๋ณด ์ˆ˜์ง‘ ๋˜๋Š” ์‹œ์Šคํ…œ ๊ณต๊ฒฉ ์ ‘๊ทผ ๊ด€๋ฆฌ ์ถ”์  ํšŒํ”ผ ์นจ์ž… ํƒ์ง€ ๋ณด์•ˆ ์นจ์ž… : ์นจ์ž…์ž๊ฐ€ ํ—ˆ๊ฐ€ ๊ถŒํ•œ ์—†์ด ์‹œ์Šคํ…œ (๋˜๋Š” ์ž์›)์„ ๋นผ๋‚ด๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ์‹œ๋„๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ๊ฑด์˜ ์กฐํ•ฉ ์นจ์ž… ํƒ์ง€ : ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ์ž์›์—์„œ์˜ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ๋ฐœ๊ฒฌ ๋ฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ชฉ์ ์˜ ์‹œ์Šคํ…œ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ณด์•ˆ ์„œ๋น„์Šค ์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ (IDS) ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS ๋ถ„์‚ฐ IDS ๋˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ IDS ๋ถ„์„ ๋ฐฉ๋ฒ• ์ด์ƒ ์ง•ํ›„ ํƒ์ง€ ํ–‰๋™ ๊ธฐ๋ฐ˜ ํƒ์ง€ : ํ–‰๋™ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ : ์•Œ๋ ค์ง„ ๊ณต๊ฒฉ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐฉ์‹ ๋˜๋Š” ํœด๋ฆฌ์Šคํ‹ฑ ๋ฐฉ์‹ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS HIDS ์ทจ์•ฝํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ์‹œ์Šคํ…œ์— ํŠน์ˆ˜ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ณ„์ธต์„ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๋กœ๊ทธ ํŒŒ์ผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์‚ฌ ๊ธฐ๋ก : ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ ํŠน์ • ๊ฐ์‚ฌ ๊ธฐ๋ก : IDS์— ์˜ํ•ด ์š”๊ตฌ๋œ ์ •๋ณด๋งŒ์„ ๊ธฐ๋กํ•˜๋Š” ์ˆ˜์ง‘ ์‹œ์„ค ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ์ฒดํฌ์„ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค USTAT ์•ก์…˜ vs SunOS ์ด๋ฒคํŠธ ์œ ํ˜• ๋ถ„์‚ฐ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์นจ์ž… ํƒ์ง€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS NIDS ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์นจ์ž…์„ ํƒ์ง€ NIDS ์„ผ์„œ ๋ฐฐ์น˜ ์ธ๋ผ์ธ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ์— ์‚ฝ์ž…๋˜์–ด ๊ทธ ์„ผ์„œ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ๊ฐ์ง€ ์ˆ˜๋™ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์‚ฌ๋ณธ์„ ๊ฐ์‹œ ์นจ์ž… ํƒ์ง€ ๊ธฐ๋ฒ• ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ ์ด์ƒ ์ง•ํ›„ ๊ฐ์ง€ Stateful protocol analysis ํŠธ๋ž˜ํ”ฝ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ์„ ํƒ์ง€ ๋ฐฉํ™”๋ฒฝ ๊ธฐ๋Šฅ ์ ‘๊ทผ ํ†ต์ œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ฐ์‚ฌ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋Šฅ ์ฃผ์†Œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ (NAT) ์ข…๋ฅ˜ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ํ†ตํ•ฉ ์œ„ํ˜‘ ๊ด€๋ฆฌ (UTM) ๋ฐฉํ™”๋ฒฝ, IDS, IPS, ๋ฐฑ์‹  ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ์†”๋ฃจ์…˜์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ์žฅ๋น„ ํŽธ์˜์„ฑ์ด ๋†’๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Œ ํ—ˆ๋‹ˆํŒŸ ๊ณต๊ฒฉ์ž์˜ ๊ณต๊ฒฉ์„ ์œ ๋„ํ•˜์—ฌ ๊ณต๊ฒฉ์ž์˜ ํ–‰๋™์„ ๋ถ„์„ํ•˜๋Š” ์‹œ์Šคํ…œ ์Šค๋…ธํŠธ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค IDS ํŒจํ‚ท ๋””์ฝ”๋” : ํ”„๋กœํ† ์ฝœ ํ—ค๋” ์‹๋ณ„ ๋ฐ ๊ฒฉ๋ฆฌ ํƒ์ง€ ์—”์ง„ : ๊ทœ์น™ ์ง‘ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ํŒจํ‚ท์„ ๋ถ„์„ ๋กœ๊ฑฐ : ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ ํŒจํ‚ท์„ ์†Œํ˜•์œผ๋กœ ์ €์žฅ ๊ฒฝ๊ณ  : ํƒ์ง€๋œ ํŒจํ‚ท์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ƒ„ SSL/TLS/VPN SSL์˜ ๊ธฐ๋ณธ ๊ฐœ๋… SSL/TLS ํ”„๋กœํ† ์ฝœ ๊ตฌ์„ฑ Handshake Layer : Handshake, Cipher spec ๋ณ€๊ฒฝ, Alert ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ Record Layer : ๋‹จํŽธํ™”, ์••์ถ•, ๋ฌด๊ฒฐ์„ฑ, ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Record ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ SSL/TLS Handshake client->server hello server->client hello certificate : ์„œ๋ฒ„ ์ธ์ฆ์„œ server key exchange : ์„œ๋ฒ„ ํ‚ค ๊ตํ™˜ certificate_request : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์š”์ฒญ (์„ ํƒ) hello done client->server certificate : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ (์„ ํƒ) client key exchange : ํด๋ผ์ด์–ธํŠธ ํ‚ค ๊ตํ™˜ certificate_verify : ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ (์„ ํƒ) change cipher spec finished server->client change cipher spec finished Change Cipher Spec Protocol ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ƒˆ๋กœ์šด ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ Alert Protocol ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํ†ต๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฒฝ๊ณ ์™€ ์‹ฌ๊ฐ์œผ๋กœ ๋ถ„๋ฅ˜, ์‹ฌ๊ฐ์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์ข…๋ฃŒ Record Protocol ๋™์ž‘๊ณผ์ • : ๋‹จํŽธํ™” -> ์••์ถ•(์„ ํƒ) -> MAC ์ฒจ๋ถ€ -> ์•”ํ˜ธํ™” -> SSL ๋ ˆ์ฝ”๋“œ ํ—ค๋” ๋ถ™์ด๊ธฐ MAC : ํ‚ค ๊ณต์œ ๊ณผ์ •์—์„œ ๋„์ถœ๋œ ๋น„๋ฐ€ํ‚ค ์‚ฌ์šฉ ์•”ํ˜ธํ™” : ์••์ถ•๋œ ๋ฉ”์‹œ์ง€์™€ MAC์„ ๋Œ€์นญ ์•”ํ˜ธ๋กœ ์•”ํ˜ธํ™” SSL vs TLS Handshake์—์„œ์˜ ์ฐจ์ด์  TLS๋กœ ๋ฐœ์ „ํ•˜๋ฉด์„œ Handshake ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค„์ž„ ์‚ฌ์šฉํ•˜๋Š” ์ด ์•”ํ˜ธ ๊ทธ๋ฃน ์ˆ˜๋ฅผ ์ค„์—ฌ ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ํ–ฅ์ƒ Alert์—์„œ์˜ ์ฐจ์ด์  ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์ด ์ถ”๊ฐ€๋จ TLS Alert๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ์•”ํ˜ธํ™”๋˜์–ด ์ „์†ก๋จ ๋ฉ”์‹œ์ง€ ์ธ์ฆ์—์„œ์˜ ์ฐจ์ด์  SSL์€ MAC์„ ์‚ฌ์šฉ, TLS๋Š” HMAC์„ ์‚ฌ์šฉ Cipher suite์—์„œ์˜ ์ฐจ์ด์  ์ทจ์•ฝํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(RC4, DES) ์‚ฌ์šฉ ์ค‘๋‹จ ์‹ ๊ทœ ํ‚ค ๊ตํ™˜, ๊ฒ€์ฆ, ์•”ํ˜ธํ™”, MAC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ TLS๋Š” ๋ฒ„์ „ ๋ณ„๋กœ ์ง€์›ํ•˜๋Š” Cipher suite๊ฐ€ ๋‹ค๋ฆ„ SSL/TLS ํ™œ์šฉ TLS ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐฉ๋ฒ• ํ‚ค์Œ ์ƒ์„ฑ ์ƒ์„ฑํ•œ ๊ณต๊ฐœํ‚ค๋ฅผ ๋„ฃ์–ด์„œ CSR ์ƒ์„ฑ, ๊ฐœ์ธํ‚ค๋กœ ์ „์ž ์„œ๋ช… CSR์„ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์— ์ „์†ก ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์€ CSR์˜ ์ „์ž ์„œ๋ช…์„ CSR์— ํฌํ•จ๋œ ๊ณต๊ฐœํ‚ค๋กœ ์„œ๋ช… ๊ฒ€์ฆ ์‚ฌ์šฉ์ž์˜ ๊ณต๊ฐœํ‚ค์™€ ์ถ”๊ฐ€์ •๋ณด(๋„๋ฉ”์ธ, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์›น์„œ๋ฒ„์— ์ ์šฉ SSL/TLS ์„œ๋ฒ„์˜ ๋ณด์•ˆ ๊ฐ•ํ™” HSTS (HTTP Strict Transport Security) HTTPS๋กœ๋งŒ ํ†ต์‹ ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ธฐ์ˆ  ํ—ค๋”์— Strict-Transport-Security๋ฅผ ์„ค์ • max-age ๊ธฐ๊ฐ„๋™์•ˆ ์ž๋™ ์ ์šฉ SSL/TLS ์ทจ์•ฝ์  TLSv1.2์ด์ „์˜ ํ”„๋กœํ† ์ฝœ์€ ์ทจ์•ฝ์ ์ด ์กด์žฌ POODLE (Padding Oracle On Downgraded Legacy Encryption) ๋ธ”๋ก ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•์ธ CBC ๋ชจ๋“œ ์‚ฌ์šฉ์‹œ ์•”ํ˜ธ๋ฌธ์ด MAC์— ์˜ํ•ด ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š” ์ทจ์•ฝ์  DROWN (Decrypting RSA with Obsolete and Weakened eNcryption) ๊ณต๊ฒฉ์ž๊ฐ€ SSLv2 proves๋ฅผ ์†ก์‹ ํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  BEAST (Browser Exploit Against SSL/TLS) CBC์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด HTTPS ์ฟ ํ‚ค๋ฅผ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  FREAK (Factoring RSA Export Keys) SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ RSA๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Logjam SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ DHE๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Heartbleed OpenSSL 1.0.1์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ทจ์•ฝ์  ์ทจ์•ฝ์  ๋Œ€์‘ ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž : ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ, Cipher suite๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •, ์ฒ ์ €ํ•œ ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž : ์ตœ์‹  ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ € ์œ ์ง€, ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ ํ™•์ธ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์ž์ œ ๊ณตํ†ต : ์ตœ์‹  SLS/TLS ํ”„๋กœํ† ์ฝœ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์šฉ HTTPS ํŒจํ‚ท ์ฐจ๋‹จ ๊ธฐ์ˆ  ๋ฐ ์ด์Šˆ DNS ์„œ๋ฒ„ ์‘๋‹ต ๋ณ€์กฐ ๋ฐ IP ์ฐจ๋‹จ DNS ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ณ€์กฐํ•˜์—ฌ HTTPS ์ ‘์†์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  CDN ์„œ๋ฒ„ ๊ฒฝ์œ ๋ฅผ ํ†ตํ•ด ์šฐํšŒํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋“ฑ์žฅ -> ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท์„ ๋ถ„์„ํ•˜์—ฌ HTTPS ํŒจํ‚ท์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  DPI (Deep Packet Inspection) : ํŒจํ‚ท์˜ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฐจ๋‹จ HTTPS SNI ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ TLS ํ†ต์‹  ํ‘œ์ค€์„ ์—ญ์ด์šฉํ•œ ์ฐจ๋‹จ ๋ฐฉ๋ฒ• SNI๋Š” Client Hello ๋‹จ๊ณ„์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ฐจ๋‹จ TLS ์•…์šฉ๊ณผ ๋Œ€์‘ ๊ธฐ์ˆ  ์•…์šฉ์‚ฌ๋ก€ ์ •๋ณด ์œ ์ถœ ๊ฒฝ๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์—ญ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ •๋ณด ์œ ์ถœ ์‹œ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์—†๋„๋ก ํ•จ ์•…์„ฑ ์ฝ”๋“œ ์œ ์ž… ํ†ต๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์œ ํฌํ•˜๋Š” ํ†ต๋กœ๋กœ ์‚ฌ์šฉ ๋Œ€์‘ ๊ธฐ์ˆ  TLS ๊ฐ€์‹œ์„ฑ ํ™•๋ณด ๊ธฐ์ˆ  SSL/TLS์„ ๋ณตํ˜ธํ™” ํ•ด ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ  TLS Fingering ๊ธฐ์ˆ  TLS Handshake ๋ฐ ํŠธ๋ž˜ํ”ฝ์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ˆ  ๋ฉ”์‹œ์ง€๋ฅผ ์ฑ„์ทจ -> ํ•„๋“œ ์ถ”์ถœ -> ์ง€๋ฌธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ -> ์ €์žฅ ๋ฐ ๋น„๊ต ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์˜ˆ์‹œ : JA3, ์ธ๊ณต์ง€๋Šฅ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  IPSec IP ํŒจํ‚ท์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ IPSec ๊ฐœ์š” ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ํ‚ค ๊ด€๋ฆฌ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ ์ „์†ก ๋ชจ๋“œ : ํŽ˜์ด๋กœ๋“œ๋งŒ ์•”ํ˜ธํ™” ํ„ฐ๋„ ๋ชจ๋“œ : ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ ๋ชจ๋‘ ์•”ํ˜ธํ™” ํ”„๋กœํ† ์ฝœ AH(Authentication Header) ์ œ๊ณต : ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ESP(Encapsulating Security Payload) ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ ESP ๋‹จ๋… ์‚ฌ์šฉ ๋˜๋Š” ESP+AH ์‚ฌ์šฉ(ํ„ฐ๋„๋ชจ๋“œ) IKE (Internet Key Exchange)
new ์›น ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Web Security Model Web ๋ณด์•ˆ์˜ ๋ชฉํ‘œ Integirty : ๋ฌด๊ฒฐ์„ฑ Confidentiality : ๊ธฐ๋ฐ€์„ฑ HTTP URL https:// www.example.edu :80 /lectures ?lec=80 #slides protocol + hostname + port + path + query + fragment Cookies ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด ์—ญํ•  : ์„ธ์…˜ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์„ค์ • ์ €์žฅ, ์‚ฌ์šฉ์ž ์ถ”์  ๋“ฑ 1// ์ฟ ํ‚ค ์„ค์ • 2Set-Cookie: name=value; 3// ์ฟ ํ‚ค ์ „์†ก 4Cookie: name=value; Same Origin Policy (SOP) ๊ฐ™์€ Origin์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค Origin scheme://domain:port Domain Relaxation ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ, ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ๊ฐ€๋Šฅ ์˜ˆ์‹œ 1a.domain.com -> domain.com ๊ฐ€๋Šฅ 2a.domain.com -> b.domain.com ๋ถˆ๊ฐ€๋Šฅ 3a.domain.com -> com ๋ถˆ๊ฐ€๋Šฅ ์ทจ์•ฝ์  : ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ๊ฐ€ document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Mozilla Public Suffix List (PSL) ์‚ฌ์šฉ BroadcastChannel API ๊ฐ™์€ origin์˜ ๋‹ค๋ฅธ context ๊ฐ„์˜ ํ†ต์‹  ์‚ฌ์šฉ๋ฒ• 1const bc = new BroadcastChannel('channel'); 2bc.postMessage('message'); 3bc.onmessage = (e) => console.log(e.data); XMLHttpRequest (XHR) ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐ์ฒด CORS (Cross-Origin Resource Sharing) ๋‹ค๋ฅธ Origin์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ… Cookie ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด Cookie Scoping Domain ํ•ด๋‹น ๋„๋ฉ”์ธ์€ Subdomain ๋˜๋Š” Parent Domain์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Path ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Secure Cookies HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก 1Set-Cookie: name=value; Secure HTTPOnly Cookies JavaScript์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ 1Set-Cookie: name=value; HttpOnly CSRF (Cross Site Request Forgery) ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์š”์ฒญ์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฐ๊ฒฝ ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋ผ๋ฉด, ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก cross-site์—์„œ๋„ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„๋•Œ, ์„œ๋ฒ„๊ฐ€ same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ CSRF ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”ผํ•ด์ž๊ฐ€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋กœ Malicious Site์— ์ ‘์† Malicious site์—์„œ ํ”ผํ•ด์ž ์˜์ง€์™€ ์ƒ๊ด€์—†์ด ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก GET ์˜ˆ์‹œ ์ฝ”๋“œ 1<img src="http://bank.com/transfer?to=attacker&amount=1000" /> POST ์˜ˆ์‹œ ์ฝ”๋“œ 1<form action="http://bank.com/transfer" method="post"> 2 <input type="hidden" name="to" value="attacker" /> 3 <input type="hidden" name="amount" value="1000" /> 4</form> 5<script> 6 document.forms[0].submit(); 7</script> ๋ฐฉ์–ด Referer Header ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” HTTP header๋ฅผ ํ™•์ธํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ์‚ฌ์ดํŠธ์ธ์ง€ ํ™•์ธ 1Referer: http://www.example.com ํ•œ๊ณ„ ํ•ด๋‹น field๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘์† ๊ธฐ๋ก์„ ํ™•์ธ ๊ฐ€๋Šฅ -> ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ Same-Site Cookies ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ, SameSite๋ผ๋Š” ์ฟ ํ‚ค ์†์„ฑ๋ฅผ ์ „์†ก, same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธํ•˜์—ฌ, ์„ค์ •๊ฐ’์— ๋”ฐ๋ผ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Œ ์„ค์ • ๊ฐ’ None (๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก) Strict (cross-site๋Š” ํ•ญ์ƒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Lax (cross-site๋Š” GET ์š”์ฒญ์‹œ์—๋งŒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Secret Token ํŠน์ • origin์˜ ์ฒซ ์š”์ฒญ๋•Œ, ํŠน์ •ํ•œ ํ† ํฐ์„ ์ƒ์„ฑ, ์ดํ›„ ์š”์ฒญ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ, ์š”์ฒญ์ด ๊ฐ™์€ Origin์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธ Bypassing with Clickjacking ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, CSRF ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฉ์–ด X-Frame-Options Header (๊ฐ’ : DENY, SAMEORIGIN, ALLOW-FROM uri) ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ XSS(Cross Site Scripting) Attack Non-persistent (Reflected) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ query string์„ ์‹คํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ (innerHTML) ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ๋งํฌ๋ฅผ ์‹คํ–‰ => http://www.example.com/search?input=<script>alert(โ€œattackโ€);</script> ํ”ผํ•ด์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ alert๊ฐ€ ์‹คํ–‰๋จ Persistent (Stored) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ DB์— ์ €์žฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ธ€์„ ์ฝ์„ ๋•Œ, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ XSS๋กœ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ํ”ผํ•ด Web defacing(์›นํŽ˜์ด์ง€ ๋ณ€์กฐ) Spoofing requests(์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋ณ€์กฐ) Stealing information(์ •๋ณด ํƒˆ์ทจ) Self-Propagation XSS Worm XSS ๊ณต๊ฒฉ์„ ํ†ตํ•ด, ์ž๋™์œผ๋กœ ๊ณต๊ฒฉ์„ ์ „ํŒŒํ•˜๋Š” ๊ธฐ๋ฒ• 2๊ฐ€์ง€ ์ ‘๊ทผ DOM Approach 1let jsCode = document.getElementById('worm').innerHTML; Link Approach 1let jsCode = `'<script src="http://www.example.com/worm.js"></script>'`; ๋ฐฉ์–ด ์ž…๋ ฅ๊ฐ’ ํ•„ํ„ฐ๋ง : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Encoding : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ, HTML Encodingํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Content Security Policy (CSP) : ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์—ฌ, XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค ์˜ˆ์‹œ (script ํŒŒ์ผ) 1Content-Security-Policy: script-src 'self' example.com ์˜ˆ์‹œ (inline script) 1Content-Security-Policy: script-src 'nonce-2726c7f26c' 2// allowed script 3`<script nonce=2726c7f26c> ... </script>` 4// not allowed script 5`<script nonce=42eh44jhad> ... </script>` SQL Injection SQL ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, DB์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ EID์— “EID5002’#“์„ ์‚ฝ์ž… -> PASSWORD ๊ฒ€์ฆ์„ ์šฐ์ฆ 1SELECT NAME, SALERY, SSN 2FROM EMPLOYEE 3WHERE EID='EID5002'#' AND PASSWORD='1234'; curl์„ ์ด์šฉํ•ด์„œ SQL Injection ๊ณต๊ฒฉ 1curl 'www.example.com/getdata.php?EID=a' OR 1=1&PASSWORD=' ๋ฐฉ์–ด Filtering and Encoding data SQL Injection์—์„œ ์“ฐ์ด๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ Filtering, Encoding 1$mysqli->real_escape_string($input); ํ•œ๊ณ„ ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Œ Prepared Statements SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ 1$stmt = $mysqli->prepare("SELECT NAME, SALARY, SSN FROM EMPLOYEE WHERE EID=? AND PASSWORD=?"); 2// ss means "string string" 3$stmt->bind_param("ss", $EID, $PASSWORD); 4$stmt->execute(); Blind SQL Injection SQL Injection ๊ณต๊ฒฉ์„ ํ†ตํ•ด, DB์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ธฐ๋ฒ• Conditional Response 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 2xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm 3/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 't'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 4xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't SQL Error - Divide by Zero 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 3'm') THEN 1/0 ELSE 'a' END FROM Users)='a SQL Error - Cast 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2CAST((SELECT example_column FROM example_table) AS int) Time Delay 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ๋”œ๋ ˆ์ด ๋ฐœ์ƒ */ 2'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND 3SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'- ShellShock Attack bash ์‰˜์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Programs Set-UID root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์ด systemํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• RUID : Real User ID : ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ EUID : Effective User ID : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ Set-UID Program : ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ, RUID์™€ EUID๊ฐ€ ๋‹ค๋ฆ„, Set-UID Program์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1$ sudo chown root vul 2$ sudo chmod 4755 vul 3$ ls -l vul 4-rwsr-xr-x 1 root root 1234 Mar 11 12:00 vul # s๊ฐ€ ์กด์žฌ ์ทจ์•ฝํ•œ C ํ”„๋กœ๊ทธ๋žจ (vul : Set-UID program) 1#include <stdio.h> 2void main() { 3 setuid(geteuid()); // root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์„ค์ • 4 system("/bin/ls -l"); // ls -l ๋ช…๋ น์–ด ์‹คํ–‰ 5} ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ export foo='() { echo "hello"; }; /bin/sh' 2$ ./vul CGI(Common Gateway Interface) Programs ์›น ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” CGI ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ทจ์•ฝ์  ์ทจ์•ฝํ•œ CGI ํ”„๋กœ๊ทธ๋žจ (test.cgi) 1#!/bin/bash 2echo "Content-type: text/plain" 3echo 4echo "Hello, World!" ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ curl http://10.0.2.69/cgi-bin/test.cgi 2Hello, World! ๊ณต๊ฒฉ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์„ค์ • ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ db password ํƒˆ์ทจ reverse shell ์‹คํ–‰ Environment Variables & Attacks ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• fork() : ์ž์‹์„ ์ƒ์„ฑ, ์ž์‹์ด ๋ถ€๋ชจ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ƒ์† execve() : ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ž์‹์œผ๋กœ ์‹คํ–‰, ์ƒˆ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • Attacks via Dynamic Linker ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์›๋ฆฌ LD_PRELOAD๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ €์žฅ ํ•จ์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, LD_LIBRARY_PATH์—์„œ ์ฐพ์Œ ๋‘ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ ์˜ˆ์‹œ 1$ export LD_PRELOAD=/path/to/malicious.so 2$ ./vul Attacks via Execution Program ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ 1$ export PATH=/path/to/malicious:$PATH 2$ ./vul 3# // root shell ์ทจ๋“ Attacks via Library format string ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Attacks via Application Code buffer overflow ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Approach VS Service Approach Clickjacking Attack ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• 1<iframe id="top" src="http://www.attack.com" style="opacity: 0"></iframe> 2<iframe id="bottom" src="http://www.example.com>" style="opacity: 1"></iframe> ๋ฐฉ์–ด Client-side (Framekiller and Framebuster) javascript๋ฅผ ์ด์šฉํ•˜์—ฌ, ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ 1if (top != self) 2if (top.location != self.location) 3... ํ•œ๊ณ„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์•„์„œ ๋ถˆ์•ˆ์ • -> ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค ์šฐํšŒ Double framing : ๋‘๊ฐœ์˜ iframe์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ฒซ๋ฒˆ์งธ iframe์„ ์ˆจ๊ธฐ๊ณ , ๋‘๋ฒˆ์งธ iframe์„ ๋ณด์—ฌ์คŒ Abusing onBeforeUnload : ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚  ๋•Œ, alert์„ ๋„์›Œ์„œ, ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ์„ ์œ ๋„ sandbox attribute : iframe์— sandbox attribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น iframe์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•จ options allow-same-origin allow-scripts allow-forms allow-modals allow-top-navigation ์˜ˆ์‹œ 1<iframe ... sandbox="allow_forms allow-scripts"></iframe> Referrer checking problems Referer๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋„๋ฉ”์ธ์˜ ์‚ฌ์ดํŠธ๋งŒ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•œ๊ณ„ : Referer๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์šฐํšŒ ๊ฐ€๋Šฅ Server-side X-Frame-Options ํŠน์ • ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์˜ˆ์‹œ 1X-Frame-Options: DENY // ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ 2X-Frame-Options: SAMEORIGIN // ๊ฐ™์€ ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง 3X-Frame-Options: ALLOW-FROM uri // ํŠน์ • uri์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง Outdated : CSP ์‚ฌ์šฉ ๊ถŒ์žฅ Content Security Policy (CSP) ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œ script-src : ์Šคํฌ๋ฆฝํŠธ source๋ฅผ ์ œํ•œ img-src : ์ด๋ฏธ์ง€์˜ source๋ฅผ ์ œํ•œ frame-ancestors : <frame>, <iframe>, <object>, <embed> ๋˜๋Š” <applet> ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ œํ•œ ์˜ˆ์‹œ 1$csp = "Content-Security-Policy: frame-ancestors *"; 2header($csp); Types of Context Integrity Visual Integrity ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : User Confirmation, UI Randomization, Visibility Detection on Click Temporary Integrity ์‚ฌ์šฉ์ž ํ™•์ธ ์‹œ์ ๊ณผ ํด๋ฆญ ์‹œ์ž‘ ์‹œ์  ์‚ฌ์ด์˜ UI ์ƒํƒœ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : Access Control Gadgets SSRF (Server Side Request Forgery) ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ๊ณต๊ฒฉ (์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐ๋œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์ด ์˜จ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐ) 1POST /product/stock HTTP/1.0 2Content-Type: application/www-form-urlencoded 3Content-Length: 30 4 5stockApi=http://localhost/admin ๋ฐฉ์–ด ์ฐจ๋‹จ๋œ ๋ฌธ์ž์—ด์„ URL ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ˜•์„ ํ†ตํ•ด ์ˆจ๊น€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋ƒ„ using @ 1https://expected-host:fakepassword@evil-host using # 1https://evil-host#expected-host Rogue DNS 1https://expected-host.evil-host Double encoding : # -> %23 -> %2523 XXE (XML eXternal Entity) Injection XML ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• XML custom entity XML์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์ •์˜ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE message [<!ENTITY greeting "Hello, ">]> 3<message> 4 <text>&greeting;world!</text> 5</message> Access internal file XML ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ณต๊ฒฉ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE foo[<!ENTITY xxe SYSTEM "file:///etc/passwd">]> 3<stockCheck><productId>&xxe;</productId></stockCheck> With SSRF SSRF์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ 1<!DOCTYPE foo[<!ENTITY xxe SYSTEM "http://localhost/admin">]> ์•”ํ˜ธ๊ธฐ์ˆ  ์ „ํ†ต์ ์ธ ์•”ํ˜ธ๊ธฐ์ˆ  ์•”ํ˜ธ์˜ ์ •์˜ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์•ผํ•จ ์ž๋ฃŒ์˜ ๋ฌด๊ฒฐ์„ฑ (Data Integrity) : ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„๋ณ€์กฐ๋˜๋ฉด ์•ˆ๋จ ์ธ์ฆ (Authentication) : ์ •๋ณด์˜ ์ถœ์ฒ˜๊ฐ€ ์ •๋‹นํ•ด์•ผํ•จ ๋ถ€์ธ๋ฐฉ์ง€ (Non-repudiation) : ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์•„์•ผํ•จ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ์กฐ๊ฑด (K : Key, M : Message, C : Cipher Text) ์•”ํ˜ธํ™” : E(K, M) = C ๋ณตํ˜ธํ™” : D(K, C) = C E(K, M)๊ณผ D(K, C)์˜ ๊ณ„์‚ฐ์€ ์‰ฌ์›Œ์•ผ ํ•จ K๋ฅผ ๋ชจ๋ฅผ๋•Œ C์—์„œ M์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ์•ผ ํ•จ ์•”ํ˜ธ ํ•ด๋… ๋ฐฉ๋ฒ• Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ Known Plain Text Attack : ์•”ํ˜ธ๋ฌธ๊ณผ ํ‰๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ๋Š” ๊ณต๊ฒฉ Chosen Plain Text Attack : ํ‰๋ฌธ์„ ์„ ํƒํ•˜์—ฌ ์•”ํ˜ธ๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ ์•”ํ˜ธ์˜ ์ข…๋ฅ˜ ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค)(๊ด€์šฉํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : n(n-1)/2 ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ (DES, IDEA, AES) ํ‰๋ฌธ์„ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ (RC4) ํ‰๋ฌธ๊ณผ ํ‚ค๋ฅผ ๋น„ํŠธ ๋‹จ์œ„๋กœ XORํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ํ•œ๊ตญ์—์„œ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜ : NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : 2n ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ์ธ์ฆ (Authentication) : ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ‚ค ์ƒ์„ฑ DH ํ‚ค ๊ตํ™˜ ์•”ํ˜ธ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ : ์œ„์กฐ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ 
new Spring - JPA : ๊ฐœ๋…, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ, ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘
๐Ÿƒ Spring
JPA (Java Persistence API) JAVA์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€, interface ๋ชจ์Œ Hibernate, EclipseLink, DataNucleus ๋“ฑ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌ EntityManager Entity : RDB์˜ Table๊ณผ ๋งคํ•‘๋˜๋Š” ๊ฐ์ฒด EntityManagerFactory Entity๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” EntityManager๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๊ณต์žฅ Thread safe: O EntityManager Entity์˜ CRUD๋“ฑ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌ Thread safe: X ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ Entity๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ EntityManager๋Š” Entity๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” Entity๋Š” ์‹๋ณ„์ž๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค (ID) -> key-value๋กœ Entity๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ flush: ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณ€๊ฒฝ ๋‚ด์šฉ๋“ค์„ DB์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—… ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์  1์ฐจ ์บ์‹œ ๋™์ผ์„ฑ ๋ณด์žฅ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ Entity์˜ Life cycle ๋น„์˜์† (New / Transient): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ ์˜์† (Managed): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ ์ค€์˜์† (Detached): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ ์‚ญ์ œ (Removed): ์‚ญ์ œ๋œ ์ƒํƒœ ์ €์žฅ 1EntityManager em = emf.createEntityManager(); // Entity manger ์ƒ์„ฑ 2EntityTransaction transaction = em.getTransaction(); // Transaction ํš๋“ 3transaction.begin(); 4 5Customer customer = new Customer(); // ๋น„์˜์† ์ƒํƒœ 6customer.setId(1L); 7customer.setFirstName("John"); 8customer.setLastName("Doe"); 9 10em.persist(customer); // ์˜์†ํ™” 11 12transaction.commit(); // Transaction commit ์กฐํšŒ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); // 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ, query ์‹คํ–‰ X 4em.clear(); // ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” 5Customer entity = em.find(Customer.class, 1L); // DB์—์„œ ์กฐํšŒ, query ์‹คํ–‰ O ์ˆ˜์ • 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4entity.setFirstName("guppy"); 5entity.setLastName("hong"); 6 7transaction.commit(); // update! ๋ณ€๊ฒฝ๊ฐ์ง€ (dirty checking) JPA๋Š” Entity๋ฅผ ์˜์†ํ™”ํ•  ๋•Œ์˜ ์ตœ์ดˆ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค flush ์‹œ์ ์— ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ Entity์— ๋Œ€ํ•ด update query๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค ์‚ญ์ œ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4em.remove(entity); 5 6transaction.commit(); // delete! Entity Mapping ๋‹จ์ผ ์—”ํ‹ฐํ‹ฐ๋งคํ•‘ @Entity : ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜ @Table : name์œผ๋กœ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ • @Id GenerationType - AUTO, IDENTITY, SEQUENCE, TABLE @Column name, length, unique, columnDefinition… insertable=updatable, nullable @Enumerated EnumType - ORDINAL, STRING ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค 1. ์ฐธ์กฐ์˜ ๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ ํ…Œ์ด๋ธ”์€ ํ•ญ์ƒ ์–‘๋ฐฉํ–ฅ์ด๋‹ค 2. ์—ฐ๊ด€ ๊ด€๊ณ„ ์ฃผ์ธ ๊ฐ์ฒด๊ฐ€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์„ ๋•Œ, ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค ์ฃผ์ธ๋งŒ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก, ์ˆ˜์ •) ํ•  ์ˆ˜ ์žˆ๋‹ค, ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ mappedBy๋ฅผ ํ†ตํ•ด ์ฃผ์ธ์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์—์„œ ์ฃผ์ธ์„ ์ง€์ •ํ•œ๋‹ค 3. ๋‹ค์ค‘์„ฑ ManyToOne, OneToMany, OneToOne, ManyToMany JoinColumn(name="", referencedColumnName="") ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ name: ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„ referencedColumnName: ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ์˜ˆ์ œ - ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ํ•œ์ชฝ์—๋งŒ ์„ค์ •ํ•˜๋ฉด ์–‘์ชฝ ๋‹ค ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์™€ ๊ทธ ํŽธ์˜๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ ์ฝ”๋“œ์ด๋‹ค Member.java 1@OneToMany(mappedBy = "member") 2private List<Order> orders = new ArrayList<>(); 3 4public void addOrder(Order order) { 5 this.orders.add(order); 6 order.setMember(this); 7} Order.java 1@ManyToOne 2@JoinColumn(name="member_id", referencedColumnName = "id") 3private Member member; 4 5public void setMember(Member member) { 6 if (this.member != null) { 7 this.member.getOrders().remove(this); 8 } 9 this.member = member; 10 member.getOrders().add(this); 11}
new [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 02 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
RAG (Retrieval-Augmented Generation) ์ด๋ก  ์ •๋ฆฌ RAG๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ LLM์˜ ๋ฌธ์ œ์  ํ• ๋ฃจ์‹œ๋„ค์ด์…˜: ์ƒ์„ฑ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์—†๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ ์ตœ์‹ ์˜ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ RAG๋Š” ์œ„์—์„œ ์„œ์ˆ ํ•œ LLM ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด๋‹ค. OpenSearch OpenSearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ํฌํฌ ๋ฒ„์ „ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์š” ๊ธฐ๋Šฅ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๋ณด์•ˆ ์‹œ๊ฐํ™”์™€ ๋Œ€์‹œ๋ณด๋“œ ์ง€์› index์™€ document index : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค document : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์„๊ธฐ Analyzer (Character Filter + Tokenizer + Token Filter) ํ…์ŠคํŠธ๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ ๋ถ„์„ ๊ณผ์ • Character Filter ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ Tokenizer ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ OpenSearch์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ Tokenizer Standard Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ, ๋ฌธ์žฅ ๋ถ€ํ˜ธ ์‚ญ์ œ Letter Tokenizer : ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Whitespace Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Ngram Tokenizer : ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter Standard Token Filter : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ Lowercase Token Filter : ํ…์ŠคํŠธ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Synonym Token Filter : ๋™์˜์–ด ์ฒ˜๋ฆฌ Analyzer Standard Analyzer : Standard Tokenizer + Standard Token Filter Simple Analyzer : Letter Tokenizer + Lowercase Token Filter Whitespace Analyzer : Whitespace Tokenizer + Lowercase Token Filter OpenSearch ์ ‘๊ทผ์„ ์œ„ํ•œ cURL ๋ช…๋ น์–ด ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/_cat/indices" ํŠน์ • ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}" ์ „์ฒด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" ํŠน์ • ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" \ 3-H "Content-Type: application/json" \ 4-d '{"query": {"match": {"field": "value"}}}' ์ธ๋ฑ์Šค ์‚ญ์ œ 1curl -X DELETE -u {username}:{password} \ 2"http://localhost:9200/{index_name}" OpenSearch๋ฅผ ํ™œ์šฉํ•œ Rag ์‹ค์Šต ๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์˜ ์ฃผ์ œ๋Š” ํŠน์ • ์ธ๋ฌผ์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠน์ • ์ธ๋ฌผ์ด ํ–ˆ๋˜ ๋ง์„ ๋ชจ์•„ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ RAG ๋ชจ๋ธ์— ์ ์šฉ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ TED์—์„œ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉํ•ด์„œ OpenSearch์— ์ €์žฅํ•œ๋‹ค. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 1. ์ผ๋ก  ๋จธ์Šคํฌ ์ธํ„ฐ๋ทฐ ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํŠœ๋ธŒ์—์„œ “์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ"๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ทฐ ์ž๋ง‰์„ ๊ฐ€์ ธ์˜จ๋‹ค. 122:03 2EM: ์ด ํฐ ํŠธ๋Ÿญ์„ ๋ชฐ๋ฉด์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์›€์ง์ž„์„ ๋ณด์˜€์ฃ . 3CA: ์•„์ฃผ ๋ฉ‹์ง€๋„ค์š”. ์ž, ๊ทธ๋Ÿผ ์ •๋ง ๊ต‰์žฅํ•œ ์‚ฌ์ง„์—์„œ 422:09 5์กฐ๊ธˆ์€ ๋œ ๊ต‰์žฅํ•œ ์‚ฌ์ง„์„ ๋ณด์ฃ . "์œ„๊ธฐ์˜ ์ฃผ๋ถ€๋“ค"์ธ๊ฐ€์—์„œ ๋‚˜์˜ค๋Š” ๊ท€์—ฌ์šด ์ง‘ ์‚ฌ์ง„์ธ๋ฐ์š”. 622:15 7์ด๊ฒŒ ๊ฐ‘์ž๊ธฐ ์™œ ๋‚˜์˜จ๊ฑฐ์ฃ ? 8... ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ ํ•œ ๋ง๋งŒ ์†์ˆ˜ ์ •๋ฆฌํ•œ๋‹ค. 1๋„ค. ์ œ ์Šค์Šค๋กœ๋„ ๊ทธ ์งˆ๋ฌธ์„ ์ž์ฃผ ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. 2์ €ํฌ๋Š” LA์˜ ์ง€ํ•˜์— ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ด๋Š” ๊ตํ†ต ์ฒด์ฆ์„ ์™„ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•œ 33์ฐจ์› ๋„คํŠธ์›Œํฌ์˜ ํ„ฐ๋„์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๋ฐœ์ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. 4๊ตํ†ต ์ฒด์ฆ์€ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์˜ ์˜ํ˜ผ์„ ํƒˆํƒˆ ํ„ฐ๋Š” ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 5์„ธ๊ณ„ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ณ  ์žˆ์ฃ . ์ธ์ƒ์—์„œ ๋„ˆ๋ฌด๋„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 6... 2. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ 1docker create -it -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} -e "discovery.type=single-node" -v opensearch_vol:/usr/share/opensearch/data --name opensearch opensearchproject/opensearch ์„ค๋ช… -p 9200:9200 : OpenSearch HTTP ํฌํŠธ -p 9600:9600 : OpenSearch ๋ชจ๋‹ˆํ„ฐ๋ง ํฌํŠธ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} : ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • -e “discovery.type=single-node” : ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰ -v opensearch_vol:/usr/share/opensearch/data : ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ SSL ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ ํ•˜์ง€๋งŒ ์œ„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 12024-07-05 22:15:12 Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: ... 22024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1314) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 32024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 42024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 52024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 62024-07-05 22:15:12 ... 16 more ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š๊ณ , ํ•ด๋‹น ํฌํŠธ๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ SSL์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1/usr/share/opensearch/config/opensearch.yml 2# ๋ณ€๊ฒฝ ์ „ 3plugins.security.ssl.http.enabled: true 4# ๋ณ€๊ฒฝ ํ›„ 5plugins.security.ssl.http.enabled: false 3. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ž„๋ฒ ๋”ฉ ๋ฐ OpenSearch์— ์ €์žฅ RAG ์„ธ์…˜์„ ํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์ด ์งœ์ค€ ์ฝ”๋“œ๋ฅผ ์ ๊ทน! ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. OpenSearch ์ธ๋ฑ์Šค ์ƒ์„ฑ 1from opensearchpy import OpenSearch 2import torch 3from transformers import AutoTokenizer, AutoModel 4from langchain.text_splitter import RecursiveCharacterTextSplitter 5from langchain_community.document_loaders import TextLoader 6from langchain_community.vectorstores import OpenSearchVectorSearch 7 8INDEX_NAME = "elon_musk" 9FILE_NAME = "ted_elon_musk_script.txt" 10 11## OpenSearch ์—ฐ๊ฒฐ ์„ค์ • 12client = OpenSearch( 13 hosts=[{"host": "localhost", "port": 9200}], http_auth=("admin", {password}) 14) 15 16## ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 17loader = TextLoader(file_path=FILE_NAME, encoding="utf-8") 18docs = loader.load() 19 20text_splitter = RecursiveCharacterTextSplitter( 21 chunk_size=100, 22 chunk_overlap=0, 23 separators=["\n"], 24 length_function=len, 25) 26 27documents = text_splitter.split_documents(docs) 28 29# print(documents) 30 31## Embedding ๋ชจ๋ธ ์ •์˜ 32class MyEmbeddingModel: 33 def __init__(self, model_name): 34 self.tokenizer = AutoTokenizer.from_pretrained(model_name) 35 self.model = AutoModel.from_pretrained(model_name) 36 37 def embed_documents(self, doc): 38 inputs = self.tokenizer( 39 doc, return_tensors="pt", padding=True, truncation=True, max_length=512 40 ) 41 42 with torch.no_grad(): 43 outputs = self.model(**inputs) 44 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 45 46 return embeddings 47 48 def embed_query(self, text): 49 inputs = self.tokenizer( 50 [text], padding=True, truncation=True, return_tensors="pt", max_length=512 51 ) 52 with torch.no_grad(): 53 outputs = self.model(**inputs) 54 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 55 return embeddings 56 57 58## index ๊ตฌ์กฐ ์ •์˜ 59index_body = { 60 "settings": { 61 "analysis": { 62 "tokenizer": { 63 "nori_user_dict": { 64 "type": "nori_tokenizer", 65 "decompound_mode": "mixed", 66 "user_dictionary": "user_dic.txt", 67 } 68 }, 69 "analyzer": { 70 "korean_anlyzer": { 71 "filter": [ 72 "synonym", "lowercase", 73 ], 74 "tokenizer": "nori_user_dict", 75 } 76 }, 77 "filter": { 78 "synonym" :{ 79 "type": "synonym_graph", 80 "synonyms_path" : "synonyms.txt" 81 } 82 } 83 } 84 } 85} 86 87## Embedding ๋ชจ๋ธ ์ƒ์„ฑ 88my_embedding = MyEmbeddingModel("monologg/kobert") 89 90## OpenSearch์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 91vector_db = OpenSearchVectorSearch.from_documents( 92 index_name=INDEX_NAME, 93 body=index_body, 94 documents=documents, 95 embedding=my_embedding, 96 op_type="create", 97 opensearch_url="http://localhost:9200", 98 http_auth=("admin", {password}), 99 use_ssl=False, 100 verify_certs=False, 101 ssl_assert_hostname=False, 102 ssl_show_warn=False, 103 bulk_size=1000000, 104 timeout=360000, 105) 106 107result = vector_db.add_documents(documents, bulk_size=1000000) tokenizer๋Š” ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” “nori_tokenizer"๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. embedding ๋ชจ๋ธ์€ ์ €๊ฑฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋ชจ๋ธ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๋ชจ๋ธ์ธ์ง€๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. curl์„ ํ†ตํ•ด localhost:9200/elon_musk/_search๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 4. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต ์ƒ์„ฑ 1from langchain.prompts import PromptTemplate 2from langchain.chains import LLMChain 3from langchain_openai import ChatOpenAI 4from opensearchpy import OpenSearch 5import os 6 7INDEX_NAME = "elon_musk" 8 9# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 10os.environ["OPENAI_API_KEY"] = {api_key} 11 12llm = ChatOpenAI( 13 model_name="gpt-3.5-turbo", 14) 15 16prompt_template = PromptTemplate( 17 input_variables=["context", "question"], 18 template=""" 19Imagine you are {character_name}, 20a wise and experienced advisor. Given the context: "{context}", 21how would you respond to this inquiry: "{question}"?', 22(in korean) 23""", 24) 25 26 27llm_chain = LLMChain(llm=llm, prompt=prompt_template) 28 29client = OpenSearch( 30 hosts=["http://localhost:9200"], 31 http_auth=("admin", {password}), 32 use_ssl=False, 33 verify_certs=False, 34 ssl_assert_hostname=False, 35 ssl_show_warn=False, 36) 37 38def search_documents(query): 39 search_body = {"query": {"match": {"text": query}}} 40 response = client.search(index=INDEX_NAME, body=search_body) 41 hits = response["`its"]["hits"] 42 return [hit["_source"]["text"] for hit in hits] 43 44if __name__ == "__main__": 45 question = input("Enter your question\n") 46 search_results = search_documents(question) 47 48 print(search_results) 49 50 # context = " ".join(search_results) 51 context = "" 52 53 response = llm_chain.invoke({"character_name": INDEX_NAME, "context": context, "question": question}) 54 55 print (response["text"]) OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ RAG ๋ชจ๋ธ์— ๋„ฃ์–ด ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. search_documents ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด OpenSearch์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ context๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ ์งˆ๋ฌธ ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋Œ€๋‹ต ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์—…์œผ๋กœ์„œ ๋ฏธ๋ž˜๋ฅผ ํ–ฅํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ „๊ธฐ ์ž๋™์ฐจ ๊ธฐ์ˆ ๊ณผ ์—๋„ˆ์ง€ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ํ˜์‹ ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ ์šฉ๋œ context [‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’, ‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’] RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋Œ€๋‹ต ์ €๋Š” ํ…Œ์Šฌ๋ผ๋ฅผ ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋น„์ „์„ ๊ฐ–์ถ˜ ๊ธฐ์—…์œผ๋กœ์„œ, ์ž์œจ ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๊ธฐ์ฐจ ์‹œ์žฅ์„ ์„ ๋„ํ•˜๊ณ  ํ™˜๊ฒฝ์— ์นœํ™”์ ์ธ ์ฐจ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ‹์ง„ ๊ธฐ์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฐ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ผ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ณ ์ฐฐ ํ™•์‹คํžˆ RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ฐ๊ด€์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๋ฐ˜๋ฉด, RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด ๊ธ์ •์ ์ธ ์ผ๋ก  ๋จธ์Šคํฌ์˜ ๋Œ€๋‹ต๊ณผ, ์ž์œจ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.
new Fastapi, RabbitMQ, Celery ์—ฐ๋™
๐Ÿ Python
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์›น์†Œ์ผ“์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ gpt๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์‚ฐ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ชฉํ‘œ Fastapi, RabbitMQ, Celery๋ฅผ ๊ฐ์ž docker ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™์‹œํ‚ค๊ณ  ์—ฐ๋™ํ•œ๋‹ค. docker-compose.yml 1version: '3' 2 3services: 4 rabbitmq: 5 image: rabbitmq:3 6 ports: 7 - "5672:5672" # RabbitMQ์˜ AMQP ํฌํŠธ 8 - "15672:15672" # RabbitMQ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ํฌํŠธ 9 volumes: 10 - rabbitmq_data:/var/lib/rabbitmq 11 expose: 12 - "5672" 13 - "15672" 14 15 celery_worker: 16 build: 17 context: . 18 dockerfile: Dockerfile.worker 19 command: celery -A utils.celery_worker worker --loglevel=info 20 working_dir: /app 21 volumes: 22 - ./app/utils:/app/utils 23 environment: 24 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 25 depends_on: 26 - rabbitmq 27 28 celery_beat: 29 image: celery:4 30 command: celery -A celery_beat beat --loglevel=info 31 working_dir: /app 32 environment: 33 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 34 volumes: 35 - ./app/utils:/app 36 depends_on: 37 - rabbitmq 38 39 web: 40 image: python:slim 41 working_dir: /app 42 # interactive mode 43 stdin_open: true 44 # tty mode 45 tty: true 46 environment: 47 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 48 volumes: 49 - ./app:/app 50 ports: 51 - "8000:8000" 52 depends_on: 53 - rabbitmq 54 - celery_worker 55 - celery_beat 56 57volumes: 58 rabbitmq_data: Celery worker์—๋งŒ Dockerfile.worker๋ฅผ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ ์ด์œ  worker์— ์ถ”๊ฐ€์ ์œผ๋กœ python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•จ Celery ๊ณต์‹ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ deprecated ๋˜์—ˆ์Œ. Fastapi๋Š” ์‹œ๊ฐ„ ๊ด€๊ณ„์ƒ ๋”ฐ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  python:slim ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Dockerfile.worker 1FROM python:slim 2 3# ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ 4# ffmpeg๊ฐ€ ํ•„์š”ํ•ด์„œ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค 5RUN apt-get update && \ 6apt-get install -y --no-install-recommends gcc libpq-dev ffmpeg && \ 7rm -rf /var/lib/apt/lists/* 8 9# ํ•„์š”ํ•œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ์„ค์น˜ 10COPY requirements_celery_worker.txt ./ 11RUN pip install --no-cache-dir -r requirements_celery_worker.txt celery_worker.py 1import os 2from celery import Celery 3 4broker_url = os.getenv('CELERY_BROKER_URL') 5app = Celery('worker', broker=broker_url, backend="rpc://") 6 7@app.task 8def add(x, y): 9 return x + y broker_url์€ RabbitMQ์˜ AMQP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. backend๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฑ์—”๋“œ๋กœ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Celery worker ์‚ฌ์šฉ ๋ฐฉ๋ฒ• 1from celery_worker import add 2 3# task๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ 4result = add.delay(4, 4) 5 6# apply_async๋Š” delay์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ 7# delay์™€ ๋‹ฌ๋ฆฌ ์ถ”๊ฐ€๋กœ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์„ค์ • ๊ฐ€๋Šฅ 8result = add.apply_async((4, 4)) 9 10# ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด get()์„ ์‚ฌ์šฉ, ๋ธ”๋กœํ‚น ํ˜ธ์ถœ 11result.get() 12 13# ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์—… 14result.ready() 15 16# ์ž‘์—…์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ํ™•์ธ 17result.successful() 18# or 19result.failed() 20 21# ์ž‘์—…์˜ ์ƒํƒœ ํ™•์ธ (PENDING, STARTED, SUCCESS, FAILURE) 22result.state()
new ์ปดํ“จํ„ฐ๋„คํŠธ์›Œํฌ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
HTTP HTTP Method Method request payload response payload idempotent GET Optional O O HEAD Optional O O POST Yes O X PUT Yes O O DELETE Optional O O CONNECT Optional O X OPTIONS Optional O O TRACE Optional O O PATCH Yes O X HTTP Protocol Version HTTP/1.0 ์—ฐ๊ฒฐ๋ฐฉ์‹ : non-persistent HTTP TCP ์—ฐ๊ฒฐ ํ•œ๋ฒˆ์— ์ตœ๋Œ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๊ฐ ๊ฐ์ฒด๋‹น 2๊ฐœ์˜ RTT๊ฐ€ ํ•„์š” HTTP/1.1 ์—ฐ๊ฒฐ๋ฐฉ์‹ : persistent HTTP ์ด์ „ TCP ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉ -> ์™•๋ณต์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ (Connection: Keep-Alive) Pipelining์œผ๋กœ ๋ณ‘๋ ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต (์˜ˆ: HTML+CSS) 1๊ฐœ์˜ TCP์—์„œ ๊ฐ์ฒด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „์†ก -> Head-of-line(HoL) ํ˜„์ƒ ๋ฐœ์ƒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ TCP ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉ - ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„๋ฉ”์ธ๋‹น ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ ๋„๋ฉ”์ธ ์ƒค๋”ฉ(Domain Sharding) : ์—ฐ๊ฒฐ ์ œํ•œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๊ธฐ (HTTP/2์—์„œ๋Š” X) HTTP/2 ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ž„: ์šฐ์„ ์ˆœ์œ„, ํ๋ฆ„์ œ์–ด, ์„œ๋ฒ„ ํ‘ธ์‹œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • : ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์ˆœ์„œ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ : TCP์—ฐ๊ฒฐ 1๊ฐœ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ „์†ก ์„œ๋ฒ„ ํ‘ธ์‹œ : ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์ธกํ•˜์—ฌ ์ „์†ก ํ—ค๋” ์••์ถ•, ํ—ค๋”์™€ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ HTTP/3 QUIC ํ”„๋กœํ† ์ฝœ, UDP ๊ธฐ๋ฐ˜ ๊ธฐํƒ€ HTTP Cookie ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์‹œ ๊ธฐ๋ก Third-party Cookie ๊ด‘๊ณ ์— ์‚ฌ์šฉ HTTP Cache ์ตœ์ดˆ ์š”์ฒญ์€ ์›๋ž˜ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ, ์ดํ›„ ์š”์ฒญ์€ Proxy(Cache) ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ CDN (Content Delivery Network) ์ปจํ…์ธ ๋ฅผ ์ „์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๋ฏธ๋ฆฌ ๋ฐฐํฌ Internet protocol traceroute : ํŒจํ‚ท ๊ฒฝ๋กœ ์ถ”์  netstat -rn, route -n : ๋ผ์šฐํ„ฐ ์ •๋ณด ํ™•์ธ P2P ๋ฒ„ํด๋ฆฌ์†Œ์ผ“ : ๋ฒ„ํด๋ฆฌ ๋Œ€ํ•™๊ต์—์„œ ๊ฐœ๋ฐœํ•œ UNIX Socker API IP IP Address IPv4 32bit IPv6 128bit (64bit : network prefix, 64bit : host network identifier) Network identifier + Interface identifier ์ข…๋ฅ˜ : unicast, anycast, link-local, multicast ::1/128 : loopback address Internet ์„ฑ๋Šฅ ์ธํ„ฐ๋„ท ์„ฑ๋Šฅ ์ง€ํ‘œ ์†๋„(๋Œ€์—ญํญ, ๋น„ํŠธ์ „์†ก๋ฅ ) ๋‹จ์œ„ : BPS ์ธก์ • ๋„๊ตฌ : iperf ๋งํฌ์˜ ๋Œ€์—ญํญ ์ง€์—ฐ์‹œ๊ฐ„ ๋‹จ์œ„ : sec ์ธก์ • ๋ฐฉ๋ฒ• : ๋‹จ๋ฐฉํ–ฅ ์ง€์—ฐ์‹œ๊ฐ„, RTT ์ธก์ •๋„๊ตฌ : ping, traceroute ์ข…๋ฅ˜ ์ „์†ก ์ง€์—ฐ : 1bit ์ „์†ก์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ „ํŒŒ ์ง€์—ฐ ํ์ž‰ ์ง€์—ฐ : ์ปดํ“จํ„ฐ / ๋ผ์šฐํ„ฐ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ์ง€์—ฐ : ํŒจํ‚ท ํ—ค๋” ๋˜๋Š” ๊ฒฝ๋กœ ํ…Œ์ด๋ธ” ์ฐพ๋Š” ์‹œ๊ฐ„ ์†์‹ค๋ฅ  ๋‹จ์œ„ : % ์ธก์ • ๋ฐฉ๋ฒ• : ์‹คํŒจํ•œ ํŒจํ‚ท ์ˆ˜ / ์ „์†กํ•œ ํŒจํ‚ท ์ˆ˜ ์ธก์ • ๋„๊ตฌ : ping ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ• HAR(HTTP ARchive format) ํŒŒ์ผ ๋ถ„์„ ๋ธŒ๋ผ์šฐ์ € <-> ์‚ฌ์ดํŠธ ๊ฐ„์˜ ํ†ต์‹  ๋‚ด์—ญ์„ JSONํ˜•ํƒœ๋กœ ์ €์žฅํ•œ ํŒŒ์ผ Bookmarklet ํ˜„์žฌ ์›น์‚ฌ์ดํŠธ ๋ถ„์„ํ•ด์ฃผ๋Š” ๋ธŒ๋ผ์šฐ์ € add-on ๋ธŒ๋ผ์šฐ์ € ์ตœ์ ํ™” css, js, html ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ ์˜ˆ์ธกํ•ด์„œ ๋ฏธ๋ฆฌํ•˜๊ธฐ (์ž์› ๊ฐ€์ ธ์˜ค๊ธฐ, DNS, TCP ์—ฐ๊ฒฐ, Web page Rendering) DNS (Domain Name System) Domain ์ด๋ฆ„ -> IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ dig ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด dns ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ ํฌํŠธ๋ฒˆํ˜ธ : 53 Slammer Worm DNS ์„œ๋ฒ„ ๊ณต๊ฒฉ DNS ๋™์ž‘ ๋ฐฉ์‹ UDP(<= 512B),TCP(> 512B) PORT : 53 DNS Query Type A : IPv4 ์ฃผ์†Œ AAAA : IPv6 ์ฃผ์†Œ CNAME : ๋ณ„์นญ TLD (Top Level Domain) ๋งจ๋’ค์— ๋ถ™๋Š” ๋„๋ฉ”์ธ (.com, .net, .org ๋“ฑ๋“ฑ) Authoritative DNS Server DNS ์ •๋ณด์™€ ํ•ด๋‹น IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ DNS Caching DDNS (Dynamic DNS) IP์ฃผ์†Œ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด DNS ์ •๋ณด ๊ฐฑ์‹  (๊ฐ€์ •์˜ ๊ณต์œ ๊ธฐ) DNS ๊ณต๊ฒฉ DNS Sppofing, DNS cache poisoning, Phising DNSSEC (DNS Security Extensions) ๋ฐ์ดํ„ฐ ์œ„์กฐ-๋ณ€์กฐ ๊ณต๊ฒฉ ๋ฐฉ์ง€ ํ‘œ์ค€๊ธฐ์ˆ  ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”๋ฐฉ์‹์˜ ์ „์ž์„œ๋ช… ๋„์ž… DoH (DNS over HTTPS) DNS ์ •๋ณด๋ฅผ jsonํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด HTTPS ์ „์†ก DNS over TLS DNS ์ •๋ณด๋ฅผ TLS๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†ก SNI (Server Name Indication) : ๋„๋ฉ”์ธ ์ •๋ณด TLS์—์„œ๋Š” SNI๋ฅผ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์Œ ํฌํŠธ๋ฒˆํ˜ธ: 853 P2P ๋‘ ๋ฐฉ์‹์˜ ๋น„๊ต 1๊ฐœ์˜ ์„œ๋ฒ„ N๊ฐœ์˜ file $u_s$: ์„œ๋ฒ„ ์—…๋กœ๋“œ ๋Œ€์—ญํญ $d_i$: i๋ฒˆ์งธ peer์˜ ๋‹ค์šด๋กœ๋“œ ๋Œ€์—ญํญ Client-Server ๋ฐฉ์‹ ๋ฐฐํฌ ์‹œ๊ฐ„ $$ d_{cs} = max(\frac{NF}{u_s},\ \frac{F}{min(d_i)}) $$ P2P ๋ฐฉ์‹ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ์‹œ๊ฐ„ $$ d*{p2p} = max(\frac{F}{u_s},\ \frac{F}{min(d*{i})},\ \frac{NF}{u_s+\sum{u_i}}) $$ BitTorrent ํŒŒ์ผ์„ 256KB chunks๋กœ ๋ถ„ํ•  Distributed Hash Table (DHT) ๋ถ„์‚ฐ P2P DB key: hash(content), value: IP address ์ธ์ ‘ํ•œ ์ด์›ƒ์—๊ฒŒ ํ‚ค๋ฅผ ํ• ๋‹น Circular DHT ๊ฐ ํ”ผ์–ด๋Š” ์ธ์ ‘ ๋…ธ๋“œ๋งŒ ์•Œ๊ณ ์žˆ์Œ Skype ์‚ฌ์šฉ์ž ๊ฐ„ P2Pํ†ต์‹  FTP, SMTP ๋ฉ”์ผ๊ด€๋ จ ํ”„๋กœํ† ์ฝœ SMTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ „์†ก ํ”„๋กœํ† ์ฝœ POP3, IMAP, HTTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ ‘๊ทผ ํ”„๋กœํ† ์ฝœ telnet ํฌํŠธ๋ฒˆํ˜ธ: 23 ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก๊ณ„์ธต TCP segment ์‹ ๋ขฐ์„ฑ: ์˜ค๋ฅ˜ ํƒ์ง€/๋ณต๊ตฌ, ์ˆœ์„œ ์ „์†ก, ์ค‘๋ณต ์ œ๊ฑฐ ํ๋ฆ„์ œ์–ด: ์ˆ˜์‹ ์ž์˜ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ํ˜ผ์žก์ œ์–ด: ๋„คํŠธ์›Œํฌ+์ˆ˜์‹ ์ž์˜ ํ˜ผ์žก์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ์—ฐ๊ฒฐ๊ด€๋ฆฌ UDP segment ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค, ๋น ๋ฅด๋‹ค, ๋‹จ์ˆœํ•œ๋‹ค checksum : ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ ๊ณตํ†ต ์ง€์—ฐ์‹œ๊ฐ„, ๋Œ€์—ญํญ์€ ๋ณด์žฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค Stop-and-Wait ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ: 0 or 1 ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 ์„ฑ๋Šฅ $$d_{trans}=\frac{L}{R}$$ $$U_{sender}=\frac{d_{trans}}{RTT+d_{trans}}$$ Go-Back-N ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^m - 1$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 Selective Repeat ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ TCP TCP ๊ฐœ์š” ์—ฐ๊ฒฐ ์ง€ํ–ฅ์  ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก pipelining : ๋ณ‘๋ ฌ ์ „์†ก Full duplex data : ๋™์ผ ์—ฐ๊ฒฐ์—์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก flow control byte๋‹จ์œ„ ์˜ stream ์ „์†ก TCP Segment Timeout ์„ค์ • ์ ๋‹นํ•œ tcp timeout ๊ฐ’ ์„ค์ • ํ•„์š” RTT๋ณด๋‹ค ๊ธธ์–ด์•ผํ•จ ๋„ˆ๋ฌด ์งง์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ์žฌ์ „์†ก, ๋„ˆ๋ฌด ๊ธธ๋ฉด ์„ธ๊ทธ๋จผํŠธ ์†์‹ค RTT ์ธก์ • $$EstimatedRTT = (1-\alpha)EstimatedRTT + \alpha SampleRTT$$ ๋ณดํ†ต $\alpha$ : 0.125 ์˜ค์ฐจ ๋ฒ”์œ„ ๊ณ„์‚ฐ $$ DevRTT = (1-\beta)DevRTT + \beta |SampleRTT - EstimatedRTT| $$ Timeout Interval ๋„์ถœ $$ TimeoutInterval = EstimatedRTT + 4*DevRTT $$ TCP ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก cumulative acks pipelined segments timeout -> ์žฌ์ „์†ก duplicate acks -> ์žฌ์ „์†ก TCP Flow control control ๋™์ž‘์›๋ฆฌ RcvWindow : ์†ก์‹ ์ž ์ตœ๋Œ€ ์ „์†กํฌ๊ธฐ RcvWindow๋งŒํผ buffer ๋‚ด spare room์œผ๋กœ ํ•œ๋‹ค TCP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ (3-way handshake) ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๋‚˜๋ฆฌ์˜ค client->server : FIN server->client : ACK + FIN client->server : ACK Socket Programming ์†Œ์ผ“ ์‘์šฉ ํ”„๋กœ์„ธ์Šค์™€ ์ „์†ก ๊ณ„์ธต ์‚ฌ์ด์˜ API ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹  Multiprocess context switch ๋น„์šฉ ๋ฐœ์ƒ, IPC ํ†ต์‹  Multithread context switch ๋น„์šฉ ๋ฐœ์ƒ Select ์—ฌ๋Ÿฌ Socket I/O ๋™์‹œ ์ฒ˜๋ฆฌ ๋น„ํšจ์œจ์ ์ด๋‹ค Async ๋น ๋ฅด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ, ์–ด๋ ค์šด ๋””๋ฒ„๊น… WebSocket ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ Socket.io Node.js ๊ธฐ๋ฐ˜์˜ WebSocket ๊ตฌํ˜„์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Data Link ๊ณ„์ธต ๋งํฌ ๊ณ„์ธต์˜ ์—ญํ•  ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ๋งํฌ์ œ์–ด, ๋‹ค์ค‘์ ‘๊ทผ, ํ๋ฆ„์ œ์–ด, ์—๋Ÿฌ์ œ์–ด MAC ์ฃผ์†Œ ๋””๋ฐ”์ด์Šค ๊ณ ์œ ์˜ ์‹๋ณ„์ž, 48bit CIDR ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  Class(A, B, C) ๋‹จ์œ„ ํ• ๋‹น์— ๋”ฐ๋ฅธ ๋น„ํšจ์œจ์ ์ธ ์ฃผ์†Œ ๊ด€๋ฆฌ BGP ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ๊ฐœ์ˆ˜ ์ตœ์†Œํ™” ์˜ˆ์‹œ (172.16.150.115/22) ์ฃผ์†Œ ๊ฐœ์ˆ˜ : $2^{32-22}-2$ = 1024 - 2 = 1022 ์ฒซ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ๋Š” ํŠน์ˆ˜๋ชฉ์  IP๋ผ์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ : 172.16.148.0/22 ์ฃผ์†Œ ๊ณต๊ฐ„ : 172.16.148.0 ~ 172.16.151.255 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ : 172.16.151.255 Network ๊ณ„์ธต - IP Network ๊ณ„์ธต์˜ ์—ญํ•  IP ํŒจํ‚ท ์†ก์ˆ˜์‹ , IP ํŒจํ‚ท ์ „๋‹ฌ, IP ๊ฒฝ๋กœ ์ฐพ๊ธฐ Fragmentation MTU(Maximum Transfer Unit) : ๋งํฌ ๊ณ„์ธต ํ”„๋ ˆ์ž„ ํฌ๊ธฐ ์ œํ•œ Ethernet : 1500B MTU ๋ณด๋‹ค ํฐ IP ํŒจํ‚ท์„ ํŒŒํŽธํ™”, ๋ชฉ์ ์ง€์—์„œ ์žฌ์กฐ๋ฆฝ TTL ๋ผ์šฐํŒ… ๋ฃจํ”„ ๋ฐฉ์ง€, 0์ด ๋˜๋ฉด ํ๊ธฐ traceroute : TTL์„ ์ด์šฉํ•œ ๋„๊ตฌ IP Options IPv4 IPv4 datagram format IP Options Record route, MTU probe/reply, timestamp IHL(Header Length): IP ํ—ค๋” ๊ธธ์ด IP Options ํ•„๋“œ์˜ ์ตœ๋Œ€๊ธธ์ด๋Š” ์ตœ๋Œ€ IPํ—ค๋”๊ธธ์ด 60B - IHLํ•„๋“œ ์ตœ์†Œ๊ฐ’ 20B = 40B IP Record Route Option: IP ์ฃผ์†Œ ๊ธฐ๋กํ•˜๋Š” ์˜ต์…˜ Subnets ์„œ๋ธŒ๋„ท (Subnets) ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ DHCP ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹น, ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ Ipv6 Ipv6 datagram format IPv4์™€ ๋น„๊ต no checksum no fragmentation / reassembly no options Ipv4 -> Ipv6 ๋ณ€ํ™˜ tunneling : IPv6 ํŒจํ‚ท์„ IPv4 ํŒจํ‚ท์— ์บก์Аํ™” MiddleBox ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ ์‚ฌ์ด์—์„œ ip router์˜ ๊ธฐ๋Šฅ์„ ์ œ์™ธํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘๊ฐ„ ์ƒ์ž NAT, Firewalls, Load balancers, Caches Network ๊ณ„์ธต - Routing Routing: ๊ธธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ Routing table : Trie ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ ๋ฐฉ์‹ : Longest prefix matching Forwarding: ํŒจํ‚ท ์ „๋‹ฌ ๊ธฐ๋Šฅ Forwarding table : ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต prefix๋ฅผ ์ฐพ์•„์„œ ํŒจํ‚ท ์ „๋‹ฌ Switching fabrics ๋ผ์šฐํ„ฐ ๋‚ด๋ถ€์—์„œ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ 3๊ฐ€์ง€ ์ข…๋ฅ˜ : Memory, Bus, Crossbar ์ž…๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์ž…๋ ฅ ํฌํŠธ์˜ ์†๋„ > ์Šค์œ„์น˜ ์†๋„ -> ํ์ž‰ ์ง€์—ฐ ๋ฐœ์ƒ Head-of-line(HoL) blocking : ํ์ž‰ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํŒจํ‚ท๋“ค๋„ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ ์ถœ๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์Šค์œ„์น˜ ์†๋„ > ์ถœ๋ ฅ ํฌํŠธ์˜ ์†๋„ -> ํŒจํ‚ท ์†์‹ค ๋ฐœ์ƒ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ํŒจํ‚ท์„ ํ๊ธฐ ์ƒˆ๋กœ ๋„์ฐฉํ•œ ํŒจํ‚ท์„ ํ๊ธฐ scheduling policy : FIFO, Round Robin ๋“ฑ๋“ฑ Transport ๊ณ„์ธต - ํ˜ผ์žก ์ œ์–ด ํ˜ผ์žก์ œ์–ด ๊ฐœ์š” Congestion : ๋„คํŠธ์›Œํฌ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ < ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ ํ˜ผ์žก ํƒ์ง€ : ์žฌ์ „์†ก ํƒ€์ด๋จธ, ์ค‘๋ณต ACK -> ํŒจํ‚ท ์†์‹ค cwnd : congestion window size Van Jacobson์ด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ MSS(Maximum Segment Size): ์„ธ๊ทธ๋จผํŠธ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ (๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ) MTU(Maximum Transfer Unit): ์ตœ๋Œ€ ์ „์†ก ํฌ๊ธฐ ํ˜ผ์žก ์ œ์–ด ๋ฐฉ๋ฒ• AIMD Additive Increase Multiplicative Decrease ๋งค RTT๋งˆ๋‹ค cwnd 1MSS ์”ฉ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค ๊ฐ์ง€ : cwnd ์ ˆ๋ฐ˜์œผ๋กœ ๊ฐ์†Œ Slow Start ์ดˆ๊ธฐ cwnd: 1 or 10 MSS ๋งค RTT๋งˆ๋‹ค cwnd 2๋ฐฐ๋กœ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค์‹œ window size = 1 ํ˜ผ์žก ์ œ์–ด ์ •์ฑ… TCP Tahoe ์ฒ˜์Œ์—๋Š” Slow Start, ์ดํ›„์—๋Š” AIMD 3 duplicate ACKs ๋˜๋Š” timeout ๋ฐœ์ƒ ์‹œ ์ž„๊ณ„์  = window size/2 window size = 1 TCP Reno Tahoe์™€ ๋น„์Šทํ•˜๋‹ค timeout ๋ฐœ์ƒ์‹œ ์ž„๊ณ„์ ์€ ๊ทธ๋Œ€๋กœ window size = 1 3 duplicate Acks์ธ ๊ฒฝ์šฐ ์ž„๊ณ„์  = window size/2 window size = window size/2 TCP CUBIC K: window size๊ฐ€ Wmax์ธ ์‹œ์  K ๊ทผ์ฒ˜์—์„œ ๋А๋ฆฌ๊ฒŒ ์ฆ๊ฐ€ K ๋ฉ€๋ฆฌ์—์„œ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ TCP BBR BBR: Bottleneck Bandwidth and RTT NAT ๊ณต์œ ๊ธฐ IP ์ฃผ์†Œ ๋ณ€ํ™˜ public IP <-> private IP ์ฃผ์†Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌํŠธ๋„ ๋ฐ”๋€๋‹ค ๊ณต์œ ๊ธฐ addr-port mapping table์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ ๋‚ด๋ถ€->์™ธ๋ถ€ ์ƒ์„ฑ : TCP/UDP ์ตœ์ดˆ ํŒจํ‚ท ์†ก์‹  ํ›„ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ์™ธ๋ถ€->๋‚ด๋ถ€ ์ƒ์„ฑ : ๋‚ด๋ถ€์—์„œ ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜๋™ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ๋˜๋Š” ์ˆ˜๋™ ํฌํŠธ ํฌ์›Œ๋”ฉ : ๊ณต์œ ๊ธฐ ๋‚ด๋ถ€์˜ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํฌํŠธ(TCP) ๊ฐœ๋ฐฉ ๊ธฐ๋Šฅ ๊ณต์œ ๊ธฐ ์ •๋ณด ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด : netstat -rn, ifconfig, iptables -t nat -L -vn ๊ณต์œ ๊ธฐ์˜ ๊ณ„์ธต L7(์‘์šฉ๊ณ„์ธต) : DNS ์„œ๋ฒ„ L3(๋„คํŠธ์›Œํฌ ๊ณ„์ธต) : IP Router + ์ฃผ์†Œ ๋ฒˆ์—ญ๊ธฐ + DHCP L2(๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต) : Bridge, ์ด๋”๋„ท ์Šค์œ„์น˜, Wifi L1(๋ฌผ๋ฆฌ ๊ณ„์ธต) IP Routing L3(Network layer) ์—ญํ•  forwarding (data plane): ๋‹จ์ˆœ ํŒจํ‚ท ์ „๋‹ฌ routing (control plane): ํŒจํ‚ท ์ „๋‹ฌ ๊ฒฝ๋กœ ๊ฒฐ์ • control plane์˜ ๊ตฌ์กฐ Per-router control plane : ๋ผ์šฐํ„ฐ๋งˆ๋‹ค ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ SDN(Software Defined Networking) : ์ค‘์•™์ง‘์ค‘์‹ ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ Routing Protocols link state (centralized, global) ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์‹œ๊ฐ„๋ณต์žก๋„(n๊ฐœ์˜ node) : $O(n^2)$ oscillation ๋ฐœ์ƒ ๊ฐ€๋Šฅ : ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ด ์ˆ˜๋ ดํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ distance vector : ์ธ์ ‘ํ•œ ๋ผ์šฐํ„ฐ์—๊ฒŒ๋งŒ ์ •๋ณด ์ „๋‹ฌ ๊ฐ ๋…ธ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ bellman-ford ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ link cost๊ฐ€ ๋ฐ”๋€Œ๋ฉด local dv๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐ, ๋ฐ”๋€ dv๋ฅผ ์ธ์ ‘ node์— ์ „๋‹ฌ count-to-infinity ๋ฌธ์ œ : ๋ผ์šฐํŒ… ๋ฃจํ”„ ํ˜„์ƒ poisoned reverse : count-to-infinity ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• path vector Inter-AS routing protocol ๋ผ์šฐํ„ฐ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ์ž‘๋™ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ intra-AS routing protocols : RIP, EIGRP, OSPF RIP (Routing Information Protocol) DV algorithm ์‚ฌ์šฉ ๋ฃจํ”„ ํƒ์ง€๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : poison reverse ์ด์ œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ EIGRP (Enhanced Interior Gateway Routing Protocol) DV ๊ธฐ๋ฐ˜ cisco OSPF (Open Shortest Path First) classic link-state ๋ชจ๋“  OSPF๋ฉ”์‹œ์ง€๋Š” ์ธ์ฆ๋จ Hierarchical routing : local area, backbone ๋‘ ๊ฐœ์˜ ๋ ˆ๋ฒจ๋กœ ๊ตฌ์„ฑ boundary router : AS๊ฐ„ ๋ผ์šฐํ„ฐ local router : local ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ area border router : local๊ณผ backbone์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ผ์šฐํ„ฐ Inter-AS routing BGP BGP (Border Gateway Protocol): ์ธํ„ฐ๋„ท ์ƒ์˜ AS๊ฐ„ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ eBGP : ์ธ์ ‘ํ•œ AS๊ฐ„ ๋ผ์šฐํŒ… ์ •๋ณด ๊ตํ™˜ iBGP : AS ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ๋“ค์—๊ฒŒ ๋ผ์šฐํŒ… ์ •๋ณด ์ „๋‹ฌ BGP session : BGP routers๋Š” TCP๋กœ ์—ฐ๊ฒฐ๋จ BGP path: prefix + attributes prefix: IP ์ฃผ์†Œ AS-PATH: AS ๋ฆฌ์ŠคํŠธ NEXT-HOP: ๋‹ค์Œ AS๋กœ ํ–ฅํ•˜๋Š” ๋ผ์šฐํ„ฐ ์ฃผ์†Œ BGP messages OPEN : TCP ์—ฐ๊ฒฐ ์„ค์ • UPDATE : ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ๊ณต์‹œ (๋˜๋Š” ์ด์ „ ์—ฐ๊ฒฐ ์ฒ ํšŒ) KEEPALIVE : UPDATES ์—†์ด ์—ฐ๊ฒฐ ์œ ์ง€ NOTIFICATION : ์˜ค๋ฅ˜ ๋ณด๊ณ  BGP ๊ฒฝ๋กœ ์„ ํƒ ๋ฐฉ๋ฒ• ํฐ weight ํฐ local preference ์งง์€ AS-PATH ๊ฐ€๊นŒ์šด NEXT-HOP MED (Multi-Exit Discriminator) Transport ๊ณ„์ธต - ๋ณด์•ˆ TLS(Transport Layer Security) ํ‘œ์ค€ SSL 3.0 -> IETF TLS 1.0 -> TLS 1.2 -> TLS 1.3 HTTPS = TCP + TLS + HTTP Network Security์˜ ๊ตฌ์„ฑ์š”์†Œ Confidentiality (๊ธฐ๋ฐ€์„ฑ) Authentication (์ธ์ฆ) Message Integrity (๋ฌด๊ฒฐ์„ฑ) Access & Availability (๊ฐ€์šฉ์„ฑ) ์•”ํ˜ธํ™” ๋ชจ์Œ (Cipher Suite) ํ‚ค ๊ตํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: Diffie-Hellman ์ธ์ฆ: RSA (๊ณต๊ฐœํ‚ค) ์•”ํ˜ธํ™”: AES (๋Œ€์นญํ‚ค) ๋ฌด๊ฒฐ์„ฑ: SHA256 (ํ•ด์‹œ) TLS Handshake ํ”„๋กœํ† ์ฝœ์˜ ๊ณผ์ • Client Hello : ๋ฒ„์ „, ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Server Hello : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Certificate : ์ธ์ฆ์„œ Server Hello Done Client Key Exchange : Pre-Master Secret ์ƒ์„ฑ ํ›„ ์ „์†ก Change Cipher Spec : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ Change Cipher Spec Finished : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ ์™„๋ฃŒ SSL/TLS ์ธ์ฆ์„œ ์„œ๋น„์Šค ์ •๋ณด : ๋ฐœ๊ธ‰ํ•œ CA, ๋„๋ฉ”์ธ ๋“ฑ CA(Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€ TLS 1.2์™€ TLS 1.3์˜ ๋น„๊ต IP ๊ณ„์ธต - ๋ณด์•ˆ ์•”ํ˜ธํ†ต์‹  - IP Sec IP ํŒจํ‚ท์—์„œ encryption, authentication, integrity 2๊ฐ€์ง€ ๋ชจ๋“œ transport mode: 1๊ฐœ์˜ datagram payload๋งŒ ์•”ํ˜ธํ™” tunnel mode: ์ „์ฒด datagram์ด encrypted, authenticated ํ”„๋กœํ† ์ฝœ AH(Authentication Header): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ESP(Encapsulating Security Payload): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ, ๊ธฐ๋ฐ€์„ฑ ๋ณด์žฅ SAs(Security Associations) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ SA ์ƒ์„ฑ IP: ๋น„์—ฐ๊ฒฐ์„ฑ, IPsec: ์—ฐ๊ฒฐ์„ฑ SPI(Security Parameter Index): SA๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’ IPsec datagram (tunnel mode, ESP) ESP trailer: block ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ padding ESP header IKE (Internet Key Exchange) ๊ธฐ์กด ๋ฐฉ์‹ : ์ˆ˜๋™ ํ‚ค๋กœ IPSec SA๋ฅผ ์ƒ์„ฑ endpoint๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ˆ˜๋™ ํ‚ค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›€ -> IPsec IKE ์‚ฌ์šฉ ์•”ํ˜ธ ํ†ต์‹  - ๋Œ€์นญํ‚ค, ๊ณต๊ฐœํ‚ค, ์ „์ž์„œ๋ช… ์•”ํ˜ธ (cryptography) ๊ธฐ์ดˆ ์šฉ์–ด m : ํ‰๋ฌธ $K_A(m)$: ์•”ํ˜ธ๋ฌธ m = $K_B(K_A(m))$ : ๋ณตํ˜ธํ™” Symmetric key cryptography (๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”) ์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค ์‚ฌ์šฉ ๋‹จ์ˆœ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ• substitution cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ ์ข€ ๋” ์ •๊ตํ•œ ๋ฐฉ๋ฒ• cyclic cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ , ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟˆ DES(Data Encryption Standard) 56bit symmetric key, input : 64bit ํ•˜๋ฃจ์— ์•ˆ ์ฑ„์›Œ์ง€๋Š” ์‹œ๊ฐ„์— ๋šซ๋ฆผ 3DES : 3๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋กœ 3๋ฒˆ ์•”ํ˜ธํ™” AES(Advanced Encryption Standard) 128bit, 192bit, 256bit key input: 128bit AES๋Š” DEC๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๋‹ค Public Key Cryptography (๊ณต๊ฐœํ‚ค) ๊ณต๊ฐœํ‚ค: ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค: ๋ณตํ˜ธํ™” ๋Œ€์นญํ‚ค๋ณด๋‹ค ๋А๋ฆฌ๋‹ค HTTPS = ๊ณต๊ฐœํ‚ค(ํ‚ค ๊ตํ™˜) + ๋Œ€์นญํ‚ค (์•”ํ˜ธํ™”) RSA ์•”ํ˜ธํ™” ๋ฐฉ์‹ ํŠน์ง• $K_B^-(K_B^+(m)) = m$ ๊ณต๊ฐœํ‚ค $K_B^+$๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐœ์ธํ‚ค $K_B^-$๊ฐ€ ๊ณ„์‚ฐ ๋ถˆ๊ฐ€๋Šฅ ํ•ด์•ผํ•œ๋‹ค. $K_B^-(K_B^+(m)) = m = K_B^+(K_B^-(m))$ ๋ฐฉ๋ฒ• ๋””์ง€ํ„ธ ์„œ๋ช… ์„œ๋ช…ํ•œ ์‚ฌ๋žŒ์˜ ์ธ์ฆ ์šฉ๋„ ๊ณต๊ฐœํ‚ค ํ™œ์šฉ ์ธ์ฆ์„œ ์ „์ž์„œ๋ช…๋งŒ์œผ๋กœ ์†ก์‹ ์ž์˜ ์‹ ์› ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ ๋‚ด์šฉ: ์‹ ์›์ •๋ณด, ๊ณต๊ฐœํ‚ค, ์œ ํšจ๊ธฐ๊ด€, ์ธ์ฆ๊ธฐ๊ด€์ •๋ณด, ์ „์ž์„œ๋ช… ํ‘œ์ค€ ๊ทœ๊ฒฉ : X.509 X.509 .der ํ˜น์€ .pem ํ™•์žฅ์ž ํŒŒ์ผ ์•”ํ˜ธํ†ต์‹  - ๋ฌด๊ฒฐ์„ฑ ์ „์ž ์„œ๋ช…์˜ ๋ฌด๊ฒฐ์„ฑ (A->B) m์— A๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. A๋Š” m`์ด ์•„๋‹Œ m์—๋งŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : MD5, SHA-1 ์•”ํ˜ธํ†ต์‹  - Firewall ๋ชฉ์  ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๋ฐฉ์ง€ (SYN flooding: ๊ฐ€์งœ TCP ์—ฐ๊ฒฐ์„ ์ƒ์„ฑ) ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ• ์ˆ˜์ •/์ ‘๊ทผ ๋ฐฉ์ง€ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์žˆ๋Š” ์•ก์„ธ์Šค๋งŒ ํ—ˆ์šฉ ํ•œ๊ณ„ IP spoofing: IP ์ฃผ์†Œ๋ฅผ ์œ„์กฐํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ Stateless packet filtering ํŒจํ‚ท ๋‹จ์œ„๋กœ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋ง ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๊ธฐ์ค€ : source IP, dest IP, TCP/UDP source, port ๋“ฑ ACL(Access Control List) : ํ—ˆ์šฉ/์ฐจ๋‹จ ๋ชฉ๋ก Stateful packet filtering TCP ์—ฐ๊ฒฐ๋งˆ๋‹ค ํŒจํ‚ท ์ƒํƒœ๋ฅผ ์ถ”์  ACL์— check connection column์ด ์ถ”์  ์—ฌ๋ถ€ ๊ฒฐ์ • Application gateway IP/TCP/UDP ํŒจํ‚ท์˜ data field๋ฅผ ํ™•์ธ Intrusion Detection System (IDS) (์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ) deep packet inspection : ํŒจํ‚ท์˜ ๋‚ด์šฉ์„ ํ™•์ธ ํŒจํ‚ท ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ์กฐ์‚ฌ (port scanning, network mapping, Dos attack) multiple IDSs : ์—ฌ๋Ÿฌ IDS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ํ™•์ธ ์•”ํ˜ธํ†ต์‹  - email ์˜ˆ์‹œ (Alice๊ฐ€ Bob์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋‚ธ๋‹ค) Confidentiality(๊ธฐ๋ฐ€์„ฑ) Alice ๋Œ€์นญํ‚ค K ์ƒ์„ฑ K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”, K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™” K๋ฅผ Bob์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™” ์•”ํ˜ธํ™” ๋œ K์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ Bob K๋ฅผ Bob์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” K๋กœ ๋ฉ”์‹œ์ง€ ๋ณตํ˜ธํ™” Integrity (๋ฌด๊ฒฐ์„ฑ), Authentication(์ธ์ฆ) Alice ๋ฉ”์‹œ์ง€ Hash์— Alice์˜ ๊ฐœ์ธํ‚ค๋กœ ๋””์ง€ํ„ธ ์„œ๋ช… ๋ฉ”์‹œ์ง€์™€ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ์ „๋‹ฌ Bob ๋ฉ”์‹œ์ง€ hash๋ฅผ Alice์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช…๊ณผ ๋ฉ”์‹œ์ง€ hash๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ PGP (Pretty Good Privacy) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ AES256(๋Œ€์นญํ‚ค) ์‚ฌ์šฉ S/MIME (Secure/Multipurpose Internet Mail Extensions) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ ์•”ํ˜ธํ™” + ๋””์ง€ํ„ธ ์„œ๋ช… = Confidentiality + Integrity + Authentication Multimedia streaming RTSP (Real-Time Streaming Protocol) RTMP (Real-Time Messaging Protocol) HLS (HTTP Live Streaming) ๋น„๋””์˜ค/์˜ค๋””์˜ค ์กฐ๊ฐ ํŒŒ์ผ HTTP ์ „์†ก ์ธ์ฝ”๋”ฉ : H.26 ์กฐ๊ฐํ™” : 6์ดˆ ์ •๋„ HTTP : TCP ๋ฒ„ํผ๋ง ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋ชฉ์ ์—๋Š” ๋ถ€์ ํ•ฉ MPEG-DASH (Dynamic Adaptive Streaming over HTTP) RTMP WebRTC Plug-in ์—†์ด ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์Œ์„ฑ/์˜์ƒ/P2P ๊ณต์œ  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ‘œ์ค€ API P2P ์ž‘๋™ ๋ฐฉ์‹ STUN, TURN, ICE์™€ ๊ฐ™์€ NAT Traversal ๊ธฐ์ˆ  ์‚ฌ์šฉ ์‹ ํ˜ธ ๋ฉ”์‹œ์ง€ : Socket.io, ์›น์†Œ์ผ“, AJAX long polling STUN (Session Traversal Utilities for NAT) STUN ์„œ๋ฒ„์—์„œ ๊ณต์ธ IP ์ฃผ์†Œ ์ •๋ณด์™€ port๋ฒˆํ˜ธ ์งˆ์˜ ์‘๋‹ต TURN (Traversal Using Relays around NAT) ํ”ผ์–ด ๊ฐ„์— ํŠธ๋ž˜ํ”ฝ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผํ•œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์— ์œ„์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ ICE (Interactive Connectivity Establishment) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Peer๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ Wireless and Mobile Networks Elements of a wireless network base station : ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ relay: ๋กœ์ปฌ์—์„œ ์œ ์„  ๋„คํŠธ์›Œํฌ์™€ ๋ฌด์„  ํ˜ธ์ŠคํŠธ ๊ฐ„์— ํŒจํ‚ท ์ „์†ก์„ ๋‹ด๋‹น wireless link : ๋ชจ๋ฐ”์ผ์„ ๊ธฐ์ง€๊ตญ์— ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ infrastructure mode : ๊ธฐ์ง€๊ตญ์€ ํ•ธ๋“œํฐ์„ ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ handoff : ๋ชจ๋ฐ”์ผ์—์„œ AP๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ํ†ต์‹  ad hoc mode : ๊ธฐ์ง€๊ตญ ์—†์ด ๋ชจ๋ฐ”์ผ ๊ฐ„์— ํ†ต์‹  ๋ฌด์„  ํ†ต์‹ ์˜ ํŠน์ง• ์œ ์„  ๋Œ€๋น„ ์•ฝํ•œ ์‹ ํ˜ธ ๋‹ค๋ฅธ ๋ฌด์„  ์žฅ์น˜์™€์˜ ๊ฐ„์„ญ ๋‹ค์ค‘ ๊ฒฝ๋กœ ์ „ํŒŒ SNR(Signal to Noise Ratio) : ์‹ ํ˜ธ ๋Œ€ ์žก์Œ๋น„ BER(Bit Error Rate) : ๋น„ํŠธ ์˜ค๋ฅ˜์œจ Hidden terminal problem : A-B, B-C ๊ฐ€๋Šฅ A-C ๋ถˆ๊ฐ€๋Šฅ 802.11 LAN base station๊ณผ ๋ฌด์„  host๊ฐ„์˜ ํ†ต์‹  Infrastructure ๋ชจ๋“œ์˜ BSS(Basic Service Set)์— ํฌํ•จ๋˜๋Š” ๊ฒƒ Wireless hosts AP (base station) ad hoc mode: hosts only CSMA : ์ „์†ก ์ „ ์ถฉ๋Œ ๊ฒ€์‚ฌ -> ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ Sense channel์ด DIFS์— ๋Œ€ํ•ด idleํ•˜๋ฉด ํ”„๋ ˆ์ž„์„ ์ „์†ก Sense channel์ด busyํ•˜๋ฉด random backoff ํ›„ ack๊ฐ€ ์˜ค์ง€ ์•Š์œผ๋ฉด backoff๋ฅผ ์ฆ๊ฐ€, 2๋ฒˆ ๋ฐ˜๋ณต ๋ฐ›๋Š” ์‚ฌ๋žŒ ํ”„๋ ˆ์ž„์„ ๋ฐ›์œผ๋ฉด SIFS ํ›„ ack ์ „์†ก CA sender๊ฐ€ ์ž‘์€ RTS(Request to Send) ํ”„๋ ˆ์ž„์„ BS๋กœ ์ „์†ก (CSMA ์‚ฌ์šฉ) BS broadcasts CTS(Clear to Send) to sender (CTS๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ) sender๊ฐ€ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ „์†ก, ๋‹ค๋ฅธ station์€ ์ „์†ก ์ง€์—ฐ advanced capabilities Rate adaptation : SNR(์‹ ํ˜ธ๋Œ€ ์žก์Œ๋น„)์™€ BER(๋น„ํŠธ ์˜ค๋ฅ˜์œจ)์„ ์ธก์ •ํ•˜์—ฌ ์ „์†ก๋ฅ ์„ ์กฐ์ ˆ CDMA (Code Division Multiple Access) unique code๊ฐ€ ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌ encoding: ์›๋ณธ ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) decodding : encoded ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) 4G/5G cellular networks ์ตœ๋Œ€ 100Mbps์˜ ์ „์†ก ์†๋„ ๊ธฐ์ˆ  ํ‘œ์ค€ : 3GPP(3rd Generation Partnership Project) Base station(eNodeB) : wifi AP์™€ ์œ ์‚ฌ HSS(Home Subscriber Server) : ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ MME(Mobility Management Entity) : ์‚ฌ์šฉ์ž ์œ„์น˜ ์ถ”์  S-GW(Serving Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก P-GW(Packet Data Network Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก GTP : GPRS Tunneling Protocol 5G 10๋ฐฐ ๋น ๋ฅธ ์†๋„, ์ง€์—ฐ ์‹œ๊ฐ„ 10๋ฐฐ ๊ฐ์†Œ, 100๋ฐฐ ๋งŽ์€ ์žฅ์น˜ ์—ฐ๊ฒฐ (4G ๋Œ€๋น„)
new ์ธ๊ฐ„-์ปดํ“จํ„ฐ ์ƒํ˜ธ์ž‘์šฉ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Design Techniques Contextual Inquiry ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ด€์ฐฐ Design Funnel ์•„์ด๋””์–ด๋ฅผ ํ™•์žฅํ•จ๊ณผ ๋™์‹œ์— ์ถ•์†Œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฒฐ๊ณผ ๋„์ถœ Double Diamond Discover -> Define -> Develop -> Deliver Storyboarding ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ Prototyping ๋””์ž์ธ์„ ํ‘œํ˜„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ ์ข…๋ฅ˜: Low-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋‚ฎ์Œ), High-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋†’์Œ) User Testing In-lab vs On-site Moderated vs Unmoderated : Exploratory vs Assessment Presentation & Communication Needfinding (์š”๊ตฌ์‚ฌํ•ญ ๋„์ถœ) ์šฉ์–ด UI (User Interface) ์ œํ’ˆ์˜ ์‹œ๊ฐ์ ์ธ ์š”์†Œ UX (User Experience) ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ๊ฒฝํ—˜ CX (Customer Experience) ๊ณ ๊ฐ์ด ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋А๋ผ๋Š” ์ „๋ฐ˜์ ์ธ ๊ฒฝํ—˜, ์ƒํ’ˆ ๋˜๋Š” ์„œ๋น„์Šค์˜ ๊ตฌ๋งค, ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์š”์†Œ SD (Service Design) ์„œ๋น„์Šค๋ฅผ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ HCI (Human-Computer Interaction) ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ, ์ œ์ž‘, ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ SRS (Software Requirement Specification) ์†Œํ”„ํŠธ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ User Requirements, Functional Requirements, Interface Requirements, Performance Requirements… SRS๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ธฐ์ „์— ์‚ฌ์šฉ์ž๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ดํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž์˜ ํŠน์„ฑ์„ ์ดํ•ด : ์—ญํ• , ๊ฐœ์„ฑ ์ดํ•ด๊ด€๊ณ„์ž(stakeholders)๋ฅผ ๊ณ ๋ ค First degree : ์ง์ ‘์ ์œผ๋กœ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ Second degree : ์ œํ’ˆ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‚ฌ๋žŒ Third degree : ์„œ๋น„์Šค๋ฅผ ์„ค์น˜, ๋ฐฐํฌํ•˜๋Š” ์‚ฌ๋žŒ ๋˜๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ๋ชฉ์  ํŒŒ์•… Identify the goals involved in the problem Decompose them into subtasks Abstract into goals Contextual Inquiry (์ƒํ™ฉ์  ์กฐ์‚ฌ) Context : ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ ๊ด€์ฐฐ, ์ถ”์ƒํ™” ๊ธˆ์ง€ Partnership : ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ–‰๋™๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์งˆ๋ฌธ Interpretation : ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํ•ด์„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต์œ , ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์Œ Focus : ๋ชฉํ‘œ์— ์ง‘์ค‘ The master-apprentice model (๋„์ œ์‹ ๋ชจ๋ธ) : ์‚ฌ์šฉ์ž(์„ ์ƒ), ๊ด€์ฐฐ์ž(ํ•™์ƒ) Contextual Inquiry๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์„ ๋•Œ Longidual study : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์žฅ๊ธฐ๊ฐ„ ๊ด€์ฐฐํ•ด์•ผํ•  ๋•Œ Sporadic behavior : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์ด ๋ถˆ๊ทœ์น™ํ•  ๋•Œ Large target : ์‚ฌ์šฉ์ž์˜ ๋ฒ”์œ„๊ฐ€ ๊ด‘๋ฒ”์œ„ ํ•  ๋•Œ Diary Study ์‚ฌ์šฉ์ž๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ํ•˜๋Š” ์ผ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ ESM (Experience Sampling Method) ์ˆœ๊ฐ„์ ์ธ ํ™œ๋™๊ณผ ๊ฒฝํ—˜์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก EMA (Ecological Momentary Assessment) ์‹ฌ๋ฆฌ์  ํ˜„์ƒ์˜ ๊ถค์ , ๋ถ„์‚ฐ, ๋ณ€๋™, ์—ญํ•™์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก Survey Participatory Design ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋””์ž์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ Affinity Diagram (์œ ์‚ฌ๋„ ๋‹ค์ด์–ด๊ทธ๋žจ) ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ Persona ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐ€์ƒ์˜ ์ธ๋ฌผ Learnability ์ƒˆ๋กœ์šด UI๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐฉ๋ฒ• Learning by Doing Learning by Watching Recognition vs Recall Recognition : ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ๋ณด๊ณ  ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Recall : ๊ธฐ์–ต์„ ํ†ตํ•ด ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Interaction style Command Language ์ธ๊ณต ์–ธ์–ด์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ Self Disclosure (์ž๊ธฐ ๊ณต๊ฐœ) : ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ Menus and Forms Direct Manipulation ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ ์‹œ๊ฐ์  ํ‘œํ˜„์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ Speech Dialog Mental Model ์‚ฌ๋žŒ๋“ค์ด ์ž๊ธฐ ์ž์‹ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ, ํ™˜๊ฒฝ, ์ž์‹ ์ด ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์‚ฌ๋ฌผ๋“ค์— ๋Œ€ํ•ด ๊ฐ–๋Š” ๋ชจํ˜• ๊ด€์ฐฐ, ์ธํ„ฐ๋ทฐ, ์ž‘์—… ๋ถ„์„์ด ํ•„์š”ํ•˜๋‹ค Conceptual Model ์ œํ’ˆ์ด ์–ด๋– ํ•œ ์›๋ฆฌ๋‚˜ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด Content strategy : ๊ฐ ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚˜๋Š” ๋‚ด์šฉ์˜ ๊ทœ์น™์ด๋‚˜ ๊ฐœ๋…์ด ์กด์žฌํ•˜๋Š”๊ฐ€? Channel starategy : ์ผ๊ด€์ ์ธ ๊ฒฝํ—˜, ์ง€์†์ ์ธ ๊ฒฝํ—˜, ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ฒฝํ—˜์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฐ€? Interaction models : ๋ณดํŽธ์ ์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€?
new Spring - Bean Validation : Annotation์œผ๋กœ Validationํ•˜๊ธฐ
๐Ÿƒ Spring
Bean Validation Annotation์„ ๋‹ฌ์•„์„œ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ jakarta.validation๊ณผ hibernate.validator ๋‘ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Dependency Diagram ๊ตฌ์กฐ spring-boot-starter-validation -> hibernate-validator -> jakarta.validation-api jakarta.validation์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @NotNull null์ด ์•„๋‹Œ๊ฐ€ ("", " " => ํ†ต๊ณผ) @NotEmpty null์ด ์•„๋‹ˆ๊ณ , size๊ฐ€ 0์ธ๊ฐ€ (" " => ํ†ต๊ณผ) @NotBlank null์ด ์•„๋‹ˆ๊ณ , trimํ•œ ๊ฒฐ๊ณผ๊ฐ€ empty์ธ๊ฐ€ @Size ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Min ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Max ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Email ์ด๋ฉ”์ผ ํ˜•์‹์— ๋งž๋Š”๊ฐ€ @Pattern Regex(์ •๊ทœ์‹)์— ๋งž๋Š”๊ฐ€ @Past ๊ณผ๊ฑฐ์˜ ๋‚ ์งœ์ธ๊ฐ€ @Future ๋ฏธ๋ž˜์˜ ๋‚ ์งœ์ธ๊ฐ€ @Digits ์ •์ˆ˜, ์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @DecimalMin, @DecimalMax ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Positive, @PositiveOrZero, @Negative, @NegativeOrZero hibernate.validator์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @Range ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Length ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @URL URL ํ˜•์‹์— ๋งž๋Š”๊ฐ€ ์–ธ๊ธ‰ํ•œ Annotation๋ง๊ณ  ๋‹ค๋ฅธ Annotation๋„ ์žˆ๋‹ค. Rest Controller์—์„œ ์‚ฌ์šฉ Controller 1public ResponseEntity<Customer> postCustomer(@RequestBody @Valid CustomerDTO customerDTO) {...} @Valid Annotation์„ ๋ถ™์—ฌ์„œ CustomerDTO ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•œ๋‹ค @Valid Annotation์„ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊นœ๋นกํ•˜์ง€ ๋ง์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์œ„ ์ฝ”๋“œ์˜ Validation์—์„œ ์‹คํŒจํ•˜๋ฉด, MethodArgumentNotValidException์ด ๋ฐœ์ƒํ•œ๋‹ค ํ•ด๋‹น ์˜ˆ์™ธ๋Š” ํ•„๋“œ๋ณ„ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—„์ฒญ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณดํ†ต ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค 1processValidationErrors(MethodArgumentNotValidException e) { 2 List<String> errors = e.getBindingResult().getFieldErrors().stream() 3 .map(error -> error.getField() + ": " + error.getDefaultMessage()) 4 .collect(Collectors.toList()); 5 return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); 6} ์ˆ˜๋™ Validation Controller์—์„œ Validation์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™์œผ๋กœ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด๋•Œ, Validator ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค 1import jakarta.validation.Validator; 2... 3@Autowired 4private Validator validator; 5... 6var violations = validator.validate(voucher); 7if (!violations.isEmpty()) 8 throw new IllegalArgumentException(violations.stream().findFirst().get().getMessage()); ์ฝ”๋“œ์—์„œ๋Š” voucher ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด IllegalArgumentException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค
new DDD(Domain Driven Design)
๐Ÿƒ Spring
๋„๋ฉ”์ธ ํŒจํ„ด์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  IOC ๊ฐ์ฒด์˜ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋„˜๊ธฐ๋Š” ๊ฒƒ ๋ชฉ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ์†Œ -> ์œ ์—ฐ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ• DI(Dependency Injection) Constructor Injection Setter Injection Field Injection DL(Dependency Lookup) Service Locator Event-based callback DI(Dependency Injection) ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ž์‹ ์ด ์•„๋‹Œ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ ์žฅ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ์ฆ๊ฐ€ ๊ฐ์ฒด์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•จ ๋‹จ์  ์ดˆ๊ธฐ ์„ค์ •, ๊ตฌํ˜„์ด ๋ณต์žกํ•จ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์˜์กด ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ DL(Dependency Lookup) ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ž์‹ ์ด ์•„๋‹Œ ์™ธ๋ถ€์—์„œ ์ฐพ์•„์˜ค๋Š” ๊ฒƒ ์žฅ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ (DI๋ณด๋‹ค ๋œ ๊ฐ์†Œ) ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์˜์กด ๊ฐ์ฒด๊ฐ€ ์—†์–ด๋„ ์—๋Ÿฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•จ ๋‹จ์  ๊ฐ์ฒด์˜ ์ฑ…์ž„์ด ๋ถˆ๋ช…ํ™•ํ•ด์ง ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ฐ์†Œ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„ ํŒŒ์•…์ด ์–ด๋ ค์›€
new Spring - RESTful API์—์„œ ๋‚ด๋ง˜๋Œ€๋กœ ์—๋Ÿฌ ์‘๋‹ตํ•˜๊ธฐ
๐Ÿƒ Spring
1. ํด๋ž˜์Šค ์ •์˜ 1@Getter 2@RequiredArgsConstructor 3public class ExceptionResponse { 4 private final LocalDateTime timestamp = LocalDateTime.now(); // 2023-08-01T00:00:57.5995502 5 private final int status; // 400 6 private final String error; // MethodArumentNotValidException 7 private final String message; // ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค 8 private final String path; // /api/customer 9} ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค, ์ฃผ์„์—๋Š” ํ•ด๋‹น ํ•„๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ์ ์–ด๋†“์•˜๋‹ค 2. ResponseEntity ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ์ •์˜ 1private ResponseEntity<ExceptionResponse> handleException(HttpStatus status, Exception e, HttpServletRequest request) { 2 ExceptionResponse response = new ExceptionResponse( 3 status.value(), e.getClass().getSimpleName(), e.getMessage(), request.getRequestURI()); 4 return new ResponseEntity<>(response, status); 5} ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ExceptionResponse ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒจ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ HttpStatus๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•˜๋‹ค 3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ 1@ExceptionHandler(NoSuchElementException.class) 2public ResponseEntity<ExceptionResponse> handleNoSuchElementException(NoSuchElementException e, HttpServletRequest request) { 3 return handleException(HttpStatus.NOT_FOUND, e, request); 4} ๋ณธ ํ•จ์ˆ˜๋Š” @RestControllerAdvice๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค์— ์ •์˜๋˜์—ˆ๋‹ค ์ง์ ‘ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ResponseEntity๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ •๋ฆฌ ์œ„์˜ ์˜ˆ์‹œ๋Š” NoSuchElementException์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, HTTP ์ƒํƒœ์ฝ”๋“œ๋Š” 404, body๋Š” ๋‚ด๊ฐ€ ์ •์˜ํ•œ๋Œ€๋กœ ์‘๋‹ตํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค REST Api์—์„œ ์ผ๊ด€์„ฑ์žˆ๊ณ  ๊ฐ„๊ฒฐํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค
new Spring - JPA : ๊ฐœ๋…, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ, ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘
๐Ÿƒ Spring
JPA (Java Persistence API) JAVA์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€, interface ๋ชจ์Œ Hibernate, EclipseLink, DataNucleus ๋“ฑ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌ EntityManager Entity : RDB์˜ Table๊ณผ ๋งคํ•‘๋˜๋Š” ๊ฐ์ฒด EntityManagerFactory Entity๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” EntityManager๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๊ณต์žฅ Thread safe: O EntityManager Entity์˜ CRUD๋“ฑ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌ Thread safe: X ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ Entity๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ EntityManager๋Š” Entity๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” Entity๋Š” ์‹๋ณ„์ž๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค (ID) -> key-value๋กœ Entity๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ flush: ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณ€๊ฒฝ ๋‚ด์šฉ๋“ค์„ DB์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—… ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์  1์ฐจ ์บ์‹œ ๋™์ผ์„ฑ ๋ณด์žฅ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ Entity์˜ Life cycle ๋น„์˜์† (New / Transient): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ ์˜์† (Managed): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ ์ค€์˜์† (Detached): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ ์‚ญ์ œ (Removed): ์‚ญ์ œ๋œ ์ƒํƒœ ์ €์žฅ 1EntityManager em = emf.createEntityManager(); // Entity manger ์ƒ์„ฑ 2EntityTransaction transaction = em.getTransaction(); // Transaction ํš๋“ 3transaction.begin(); 4 5Customer customer = new Customer(); // ๋น„์˜์† ์ƒํƒœ 6customer.setId(1L); 7customer.setFirstName("John"); 8customer.setLastName("Doe"); 9 10em.persist(customer); // ์˜์†ํ™” 11 12transaction.commit(); // Transaction commit ์กฐํšŒ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); // 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ, query ์‹คํ–‰ X 4em.clear(); // ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” 5Customer entity = em.find(Customer.class, 1L); // DB์—์„œ ์กฐํšŒ, query ์‹คํ–‰ O ์ˆ˜์ • 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4entity.setFirstName("guppy"); 5entity.setLastName("hong"); 6 7transaction.commit(); // update! ๋ณ€๊ฒฝ๊ฐ์ง€ (dirty checking) JPA๋Š” Entity๋ฅผ ์˜์†ํ™”ํ•  ๋•Œ์˜ ์ตœ์ดˆ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค flush ์‹œ์ ์— ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ Entity์— ๋Œ€ํ•ด update query๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค ์‚ญ์ œ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4em.remove(entity); 5 6transaction.commit(); // delete! Entity Mapping ๋‹จ์ผ ์—”ํ‹ฐํ‹ฐ๋งคํ•‘ @Entity : ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜ @Table : name์œผ๋กœ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ • @Id GenerationType - AUTO, IDENTITY, SEQUENCE, TABLE @Column name, length, unique, columnDefinition… insertable=updatable, nullable @Enumerated EnumType - ORDINAL, STRING ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค 1. ์ฐธ์กฐ์˜ ๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ ํ…Œ์ด๋ธ”์€ ํ•ญ์ƒ ์–‘๋ฐฉํ–ฅ์ด๋‹ค 2. ์—ฐ๊ด€ ๊ด€๊ณ„ ์ฃผ์ธ ๊ฐ์ฒด๊ฐ€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์„ ๋•Œ, ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค ์ฃผ์ธ๋งŒ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก, ์ˆ˜์ •) ํ•  ์ˆ˜ ์žˆ๋‹ค, ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ mappedBy๋ฅผ ํ†ตํ•ด ์ฃผ์ธ์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์—์„œ ์ฃผ์ธ์„ ์ง€์ •ํ•œ๋‹ค 3. ๋‹ค์ค‘์„ฑ ManyToOne, OneToMany, OneToOne, ManyToMany JoinColumn(name="", referencedColumnName="") ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ name: ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„ referencedColumnName: ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ์˜ˆ์ œ - ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ํ•œ์ชฝ์—๋งŒ ์„ค์ •ํ•˜๋ฉด ์–‘์ชฝ ๋‹ค ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์™€ ๊ทธ ํŽธ์˜๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ ์ฝ”๋“œ์ด๋‹ค Member.java 1@OneToMany(mappedBy = "member") 2private List<Order> orders = new ArrayList<>(); 3 4public void addOrder(Order order) { 5 this.orders.add(order); 6 order.setMember(this); 7} Order.java 1@ManyToOne 2@JoinColumn(name="member_id", referencedColumnName = "id") 3private Member member; 4 5public void setMember(Member member) { 6 if (this.member != null) { 7 this.member.getOrders().remove(this); 8 } 9 this.member = member; 10 member.getOrders().add(this); 11}
new 221208 SYSP
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
12-memory-1 ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€ํ•œ ๋ถˆํŽธํ•œ ์ง„์‹ค ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌดํ•œ์˜ ์ž์›์ด ์•„๋‹ˆ๋‹ค ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ง์ ‘(explicit) vs ๊ฐ„์ ‘(implicit) ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ธฐ ์ง์ ‘ ํ• ๋‹น : ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ํ• ๋‹นํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•œ๋‹ค ex) malloc, free ๊ฐ„์ ‘ ํ• ๋‹น : ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ํ• ๋‹นํ•˜์ง€๋งŒ, ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค ex) java์˜ garbage collector ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€ ์Šคํƒ์€ ์•„๋ž˜๋กœ, ํž™์€ ์œ„๋กœ ์„ฑ์žฅํ•œ๋‹ค sbrk ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์š”์ฒญํ•œ๋‹ค (brk ํฌ์ธํ„ฐ ์ด๋™) Malloc package 1#include <stdlib.h> 2void *malloc(size_t size) 3// ์„ฑ๊ณต์‹œ : ์ตœ์†Œ size ๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ (๋Œ€๊ฒŒ 8๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋งž์ถ”์–ด) 4// ์‹คํŒจ์‹œ : NULL๋ฆฌํ„ด, set errno 5 6void free(void *p) 7// ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ ํ’€์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธ”๋ก ํฌ์ธํ„ฐ p ๋ฆฌํ„ด 8 9void *realloc(void *p, size_t size) 10// ๋ธ”๋ก p์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ƒˆ ๋ธ”๋ก์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ด 11// ์ƒˆ ๋ธ”๋ก์˜ ๋‚ด์šฉ์€ ์ด์ „ ๋ธ”๋ก๊ณผ ์ƒˆ ๋ธ”๋ก ํฌ๊ธฐ ์ค‘ ์ ์€ ํฌ๊ธฐ๊นŒ์ง€๋Š” ๋ณ€ํ™” ์—†์Œ ์šฐ์ˆ˜ํ•œ malloc/free ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชฉํ‘œ ์ฃผ์š” ๋ชฉํ‘œ malloc๊ณผ free์—์„œ ์šฐ์ˆ˜ํ•œ ์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ์–ป๋Š”๋‹ค ์šฐ์ˆ˜ํ•œ ๊ณต๊ฐ„ ์ด์šฉ์œจ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค ๋‹ค๋ฅธ ๋ชฉํ‘œ ์šฐ์ˆ˜ํ•œ ์ง€์—ญ์„ฑ : ์‹œ๊ฐ„์ ์œผ๋กœ ์ธ์ ‘ (๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฐ์ฒด) -> ๊ณต๊ฐ„์ƒ์œผ๋กœ ์ธ์ ‘ ๊ฒฌ๊ณ ์„ฑ : free(p1) ํ•จ์ˆ˜๊ฐ€ ์œ ํšจํ•œ ํฌ์ธํ„ฐ p1์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ ์ง€ํ‘œ 1 : ์ฒ˜๋ฆฌ๋Ÿ‰ (Throughput) ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ ์™„๋ฃŒํ•œ ์š”์ฒญ์˜ ์ˆ˜ ์„ฑ๋Šฅ ์ง€ํ‘œ 2 : ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ์œจ (Utilization) k๊ฐœ์˜ ์š”์ฒญ ํ›„์—, ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ์œจ $$ U*{k} = (max*{i<=k}: P*{i}) / H*{k} $$ ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” (Internal Fragmentation) ์ผ๋ถ€ ๋ธ”๋ก์—์„œ ๋ธ”๋ก ํฌ๊ธฐ์™€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ„์˜ ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒ ์ด์ „ ์š”์ฒญ ํŒจํ„ด์— ์˜ํ•ด์„œ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์ธก์ •์ด ์šฉ์ด ์™ธ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” (External Fragmentation) ํž™ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ฉ์น˜๋ฉด ์ˆ˜์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€์šฉ ๋ธ”๋ก์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์— ๋ฐœ์ƒ ์™ธ๋ถ€ ๋‹จํŽธํ™”๋Š” ๋ฏธ๋ž˜์˜ ์š”์ฒญ ํŒจํ„ด์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์ธก์ •์ด ์–ด๋ ต๋‹ค Free ๋ธ”๋Ÿญ ๊ด€๋ฆฌํ•˜๊ธฐ ๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ : ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ธ”๋ก์„ ์—ฐ๊ฒฐ ์ง์ ‘๋ฆฌ์ŠคํŠธ : ๊ฐ€์šฉ ๋ธ”๋ก๋‚ด์— ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉ ๊ตฌ๋ถ„ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ : ํฌ๊ธฐ ํด๋ž˜์Šค๋งˆ๋‹ค ๋ณ„๋„์˜ ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ ํฌ๊ธฐ๋กœ ์ •๋ ฌ๋œ ๋ธ”๋ก ๋ฐฉ๋ฒ• 1 : ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹ (Implicit List) 1 word = size(a) + payload + padding ์—ฐ์Šต๋ฌธ์ œ ์ œํ•œ์‚ฌํ•ญ : ํ—ค๋”๋Š” 4๋ฐ”์ดํŠธ, double-word alignment, ๋ธ”๋ก์˜ ํฌ๊ธฐ๋Š” 8์˜ ๋ฐฐ์ˆ˜ ์š”์ฒญ block size block header(hex) Malloc(1) 4+1+3 = 8 size | alloc = 0x8 | 1 = 0x9 Malloc(5) 4+5+7 = 16 size | alloc = 0x8 | 5 = 0xD Malloc(12) 4+12+0 = 16 size | alloc = 0x8 | 12 = 0x1A Malloc(13) 4+13+7 = 24 size | alloc = 0x8 | 13 = 0x1B ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : Free ๋ธ”๋ก ์ฐพ๊ธฐ First fit Next fit Best fit ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : ๊ฒฐํ•ฉ (Coalescing) freeํ• ๋•Œ ํ•ด๋‹น ๋ธ”๋ก์˜ ํ• ๋‹น ํ”Œ๋ž˜๊ทธ๋งŒ 0์œผ๋กœ ์„ธํŒ… -> ์ž˜๋ชป๋œ ๋‹จํŽธํ™” ๋ฐœ์ƒ freeํ•˜๋Š” ๋ธ”๋ก์˜ ์ด์ „๊ณผ ๋‹ค์Œ ๋ธ”๋ก์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•ด์„œ ๋” ํฐ free๋ธ”๋ก์„ ๋งŒ๋“ ๋‹ค ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๊ฒฝ๊ณ„ ํƒœ๊ทธ (Boundary tags) header๋ฅผ ๋ณต์ œํ•ด์„œ ๋ธ”๋ก์˜ ๋งˆ์ง€๋ง‰์— ๋„ฃ๋Š”๋‹ค (-> footer) 13-memory-2 ์ง์ ‘ ๋ฆฌ์ŠคํŠธ ๊ฐ€์šฉ ๋ธ”๋ก๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋งŒ์„ ๊ด€๋ฆฌํ•˜๋ฉด, ๋ชจ๋“  ๋ธ”๋ก์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค ์—ฐ๊ฒฐ ๋งํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์˜ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๋‹ค ์ง์ ‘ ๋ฆฌ์ŠคํŠธ : Free ์ƒˆ๋กญ๊ฒŒ ๋ฐ˜ํ™˜ํ•œ ๋ธ”๋ก์€ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์˜ ์–ด๋А ์œ„์น˜์— ๋ผ์›Œ ๋„ฃ์–ด์•ผ ํ•˜๋Š”๊ฐ€? LIFO (last in first out) ์ •์ฑ… : ๋ฐ˜ํ™˜๋ธ”๋ก์„ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋ผ์›Œ๋„ฃ๋Š” ๋ฐฉ๋ฒ• -> ๋น ๋ฅธ ์‹œ๊ฐ„, ๋‚˜์œ ๋‹จํŽธํ™” ์„ฑ๋Šฅ ์ฃผ์†Œ์ •๋ ฌ ์ •์ฑ… : ๋ธ”๋ก๋“ค์˜ ์ฃผ์†Œ๊ฐ€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‚ฝ์ž… -> ๋А๋ฆฐ ์‹œ๊ฐ„, ์šฐ์ˆ˜ํ•œ ๋‹จํŽธํ™” ์„ฑ๋Šฅ ์ง์ ‘๋ฆฌ์ŠคํŠธ <-> ๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ ํ• ๋‹น์‹œ๊ฐ„์ด ์ „์ฒด ๋ธ”๋ก์˜ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€์šฉ๋ธ”๋ก ์ˆ˜์— ๋น„๋ก€ํ•œ๋‹ค ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜ ๊ณผ์ •์ด ๋ณต์žกํ•˜๋‹ค. ๋งํฌ ํฌ์ธํ„ฐ ์ €์žฅ์„ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค (๋ธ”๋ก๋งˆ๋‹ค 2์›Œ๋“œ ์ถ”๊ฐ€ ํ•„์š”) ๊ตฌ๋ถ„ ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ (segrated free list) ๊ฐ ํฌ๊ธฐ ํด๋ž˜์Šค๋“ค์€ ํด๋ž˜์Šค๋งˆ๋‹ค์˜ ๋ธ”๋ก๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค ํฌ๊ธฐ n์˜ ๋ธ”๋ก ํ• ๋‹น ๋ฐฉ๋ฒ• ํฌ๊ธฐ n์˜ ๋ธ”๋ก ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ธ”๋ก์„ ํ• ๋‹นํ•œ๋‹ค. ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค (OS๋กœ๋ถ€ํ„ฐ sbrk()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ์ด ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๋ธ”๋ก๋“ค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ธ”๋ก์„ ํ• ๋‹นํ•œ๋‹ค ๋ธ”๋ก ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ• ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ ๋ธ”๋ก ์—ฐ๊ฒฐ ํ›„ ํ•ด๋‹น ํด๋ž˜์Šค ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ ์žฅ์  ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์ˆ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ๋ฅ 
new MVC 1 : Request Mapping, Command Object, Redirect, Form Tag, Model
๐Ÿƒ Spring
Request Mapping GetMapping/PostMapping์œผ๋กœ ์ฒ˜๋ฆฌํ•  method๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ RequestMapping์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Access request parameter : HttpServletRequest 1@PostMapping("/register/step2") 2public String handleStep2(HttpServletRequest request) { 3 String agreeParam = request.getParameter("agree"); 4 if (agreeParam == null || !agreeParam.equals("true")) { 5 return "register/step1"; 6 } 7 return "register/step2"; Access request parameter : RequestParam Annotation 1@PostMapping("/register/step2") 2public String handleStep2( 3@RequestParam(value="agree", defaultValue="false") Boolean agree) { 4 if (!agree) { 5 return "register/step1"; 6 } 7 return "register/step2"; Redirect 1@GetMapping("/register/step2") 2public String handleStep2Get() { 3 return "redirect:/register/step1"; Command Object Use request parameter as command object RegisterController.java 1@PostMapping("/register/step3") 2public String handleStep3(RegisterRequest regReq) {...} step3.jsp 1<p><strong>${registerRequest.name}๋‹˜</strong></p> UnsatisfiedDependencyException: Error creating bean with name ‘controllerConfig’: Unsatisfied dependency expressed through field ‘memberRegSvc’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘spring.MemberRegisterService’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} web.xml 1<param-value> 2 config.MvcConfig 3 4 <!-- new!! --> 5 config.MemberConfig 6 7 config.ControllerConfig 8</param-value> web.xml์— MemberConfig ํด๋ž˜์Šค๊ฐ€ ๋น ์ ธ์žˆ์–ด์„œ bean์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ด๋‹ค Custom Tag : Form 1<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 2<!-- ... --> 3<form:form action="step3" modelAttribute="registerRequest"> 4 <!-- ... --> 5 <form:input path="email" 6/></form:form> Spring MVC์—์„œ ์ง€์›ํ•˜๋Š” Custom Tag๋ฅผ ์ด์šฉํ•ด Command ๊ฐ์ฒด์™€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. jsp๋กœ for๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ 1<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2<!-- ... --> 3<c:forEach var="response" items="${ansData.responses}" varStatus="status"> 4 <li>${status.index + 1}๋ฒˆ ๋ฌธํ•ญ: ${response}</li> 5</c:forEach> jsp๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ 1@GetMapping 2public String form(Model model) { 3 List<Question> questions = createQuestions(); 4 model.addAttribute("questions", questions); 5 return "survey/surveyForm"; 6} 1<c:forEach var="q" items="${questions}" varStatus="status"></c:forEach> ModelAndView ํ™œ์šฉ 1@GetMapping 2public ModelAndView form(Model model) { 3 List<Question> questions = createQuestions(); 4 ModelAndView mav = new ModelAndView(); 5 mav.addObject("questions", questions); 6 mav.setViewName("survey/surveyForm"); 7 return mav; 8} ๋ฐ์ดํ„ฐ ์„ค์ •, ๋ทฐ์ด๋ฆ„ ๋ฆฌํ„ด ๋‘๊ฐ€์ง€๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
new ํ™•๋ฅ ๊ณผ ํ†ต๊ณ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์ž๋ฃŒ์˜ ์ •๋ฆฌ์™€ ์š”์•ฝ ํ†ต๊ณ„ ์ž๋ฃŒ์˜ ๊ตฌ๋ถ„ ์–‘์ ์ž๋ฃŒ(quantitative data) ๋˜๋Š” ์ˆ˜์น˜ํ˜•์ž๋ฃŒ(numerical data) ์ด์‚ฐ์ž๋ฃŒ(์ž๋…€ ์ˆ˜), ์—ฐ์†์ž๋ฃŒ(ํ‚ค) ์งˆ์ ์ž๋ฃŒ(qualitative data) ๋˜๋Š” ๋ฒ”์ฃผํ˜•์ž๋ฃŒ(categorical data) ๋ช…๋ชฉ์ž๋ฃŒ(ํ˜ˆ์•กํ˜•, ์„ฑ๋ณ„), ์ˆœ์„œ์ž๋ฃŒ(ํ•™์ , ๋ถ€์„œํ‰๊ฐ€) ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜ 1all variables 2โ”œโ”€โ”€ numerical 3โ”‚ โ”œ-โ”€ continuous (๋ฆฌํ„ฐ ์ˆ˜) 4โ”‚ โ””-โ”€ discrete (๋‚˜๋ผ ์ˆ˜) 5โ””โ”€โ”€โ”€ categorical 6 โ”œ-โ”€ Nominal (์„ฑ๋ณ„) 7 โ””-โ”€ Ordinal (๊ทผ๋ฌด ํ•œ ์‹œ๊ฐ„ : 12-2) ๋„์ˆ˜๋ถ„ํฌํ‘œ ์ž๋ฃŒ์˜ ํŠน์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ผ์ •ํ•œ ๊ณ„๊ธ‰์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๊ณ„๊ธ‰์— ๋„์ˆ˜๋ฅผ ๋Œ€์‘ํ•˜์—ฌ ์ž‘์„ฑํ•œ ํ‘œ ๋ฒ”์ฃผํ˜• ๋„์ˆ˜๋ถ„ํฌํ‘œ ์ƒ‰์ƒ ๋„์ˆ˜ ์ƒ๋Œ€๋„์ˆ˜ ๋นจ๊ฐ• 60 0.2 … … … ๊ณ„๊ธ‰ํ˜• ๋„์ˆ˜๋ถ„ํฌํ‘œ ๊ณ„๊ธ‰(์‹œ๊ฐ„) ๊ณ„๊ธ‰๊ฐ’ ๋„์ˆ˜ ์ƒ๋Œ€๋„์ˆ˜ ๋ˆ„์ ๋„์ˆ˜ ๋ˆ„์  ์ƒ๋Œ€๋„์ˆ˜ 10 ~ 17 13.5 7 0.14 7 0.14 17 ~ 24 20.5 24 0.48 31 0.62 … … … … … … ๊ณ„๊ธ‰ํ˜• ๋„์ˆ˜๋ถ„ํฌํ‘œ ์ž‘์„ฑ ์ˆœ์„œ ๋ฒ”์œ„ $R=x_{max} - x_{min}$ ๊ณ„๊ธ‰์˜ ์ˆ˜ $k=1+log_2n$์— ๊ฐ€๊นŒ์šด ์ž์—ฐ์ˆ˜ ๊ณ„๊ธ‰์˜ ๊ฐ„๊ฒฉ $c=\frac{R}{k}$ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„ ํžˆ์Šคํ† ๊ทธ๋žจ ๋„์ˆ˜๋ถ„ํฌ๋‹ค๊ฐํ˜• ์›๊ทธ๋ž˜ํ”„ ๊บพ์€์„  ๊ทธ๋ž˜ํ”„ ๋Œ€ํ‘ฏ๊ฐ’ $Q_1$ = ์ œ1์‚ฌ๋ถ„์œ„์ˆ˜ = ์ œ25๋ฐฑ๋ถ„์œ„์ˆ˜ $Q_2$ = ์ œ2์‚ฌ๋ถ„์œ„์ˆ˜ = ์ œ50์‚ฌ๋ถ„์œ„์ˆ˜ = ์ค‘์•™๊ฐ’ $Q_3$ = ์ œ3์‚ฌ๋ถ„์œ„์ˆ˜ = ์ œ75์‚ฌ๋ถ„์œ„์ˆ˜ ์‚ฐํฌ๋„ ์‚ฌ๋ถ„์œ„์ˆ˜ ๋ฒ”์œ„ IQR $=Q_3- Q_1$ ๋ชจ๋ถ„์‚ฐ $$\sigma^2=\frac1N\sum^N_{i-1}(x_i-\mu)^2$$ ํ‘œ๋ณธ๋ถ„์‚ฐ $$S^2=\frac1{n-1}\sum^2_{i=1}(x_i-\bar{x})^2$$ ๋ณ€๋™๊ณ„์ˆ˜ $$CV = \frac{ํ‘œ์ค€ํŽธ์ฐจ}{ํ‰๊ท }\times100%$$ 5์  ์š”์•ฝ ํ‘œ์‹œ $[\ x_{min},\ Q_1,\ Me,\ Q_3,\ x_{max}\ ]$ ์™œ๋„ $$\frac{\mu_3}{S^3}$$ ์ฒจ๋„ $$\frac{\mu_4}{S^4}$$ ์ƒ์ž๊ทธ๋ฆผ ํ™•๋ฅ  ํ‘œ๋ณธ๊ณต๊ฐ„๊ณผ ์‚ฌ๊ฑด ํ‘œ๋ณธ๊ณต๊ฐ„ : ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ์˜ ์ง‘ํ•ฉ ํ‘œ๋ณธ์  : ํ‘œ๋ณธ๊ณต๊ฐ„์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๊ฐœ์˜ ์›์†Œ ์‚ฌ๊ฑด : ํ‘œ๋ณธ๊ณต๊ฐ„์˜ ์ž„์˜์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ ๊ทผ์›์‚ฌ๊ฑด : ํ•œ ์›์†Œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์‚ฌ๊ฑด ์ „์‚ฌ๊ฑด : ํ‘œ๋ณธ๊ณต๊ฐ„์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‚ฌ๊ฑด : $\Omega$ ๊ณต์‚ฌ๊ฑด ์ด์‚ฐํ‘œ๋ณธ๊ณต๊ฐ„ vs ์—ฐ์†ํ‘œ๋ณธ๊ณต๊ฐ„ ์‚ฌ๊ฑด์˜ ์—ฐ์‚ฐ : ํ•ฉ์‚ฌ๊ฑด, ๊ณฑ์‚ฌ๊ฑด, ์—ฌ์‚ฌ๊ฑด, ๋ฐฐ๋ฐ˜์‚ฌ๊ฑด ์—ฐ์‚ฐ๋ฒ•์น™ : ๊ตํ™˜๋ฒ•์น™, ๊ฒฐํ•ฉ๋ฒ•์น™, ๋ถ„๋ฐฐ๋ฒ•์น™, ๋“œ๋ชจ๋ฅด๊ฐ„์˜ ๋ฒ•์น™ ํ™•๋ฅ  ๋ผํ”Œ๋ผ์Šค์˜ ํ™•๋ฅ  $$P(A)=\frac nN$$ ํ™•๋ฅ ์˜ ๊ณต๋ฆฌ ์ž„์˜์˜ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด $0 \leq P(A) \leq1$ $P(\Omega)=1$ A1, A2, …์ด ๋ฐฐ๋ฐ˜์‚ฌ๊ฑด์ด๋ผ๋ฉด $P(A_1 \cup A_2 \cup …) = P(A_1)+P(A_2)+…$ ํ™•๋ฅ ์˜ ์„ฑ์งˆ ์กฐ๊ฑด๋ถ€ ํ™•๋ฅ  ์กฐ๊ฑด๋ถ€ ํ™•๋ฅ  $$P(A\ |\ B) = \frac{P(A \cap B)}{P(B)},\ P(B)\neq0$$ ๊ณฑ์…ˆ์ •๋ฆฌ $$P(A \cap B)=P(B)P(A\ |\ B) = P(A)P(B\ |\ A)$$ ๋…๋ฆฝ ์‚ฌ๊ฑด ๋…๋ฆฝ $$ P(A) = P(A\ |\ B)\ or\ P(B) = P(B\ |\ A) $$ ๊ณฑ์…ˆ์ •๋ฆฌ $$ P(A \cap B) = P(A)P(B) $$ ๋ฒ ์ด์ฆˆ ์ •๋ฆฌ ๋ถ„ํ•  ์ „ํ™•๋ฅ  (์‚ฌ๊ฑด $A_1$… ์ด ๋ถ„ํ• ์ผ๋•Œ) $$ P(B) = \sum^n_{k=1}P(A_k)\ P(B\ |\ A_k) $$ ๋ฒ ์ด์ฆˆ ์ •๋ฆฌ (์‚ฌ๊ฑด $A_1$… ์ด ๋ถ„ํ• ์ด๊ณ , $P(A_i)>0, P(B)>0$ ์ผ๋•Œ) $$P(A_i\ |\ B)=\frac{P(A_i \cap B)}{P(B)}=\frac{P(A_i)P(B\ |\ A_i)}{\sum^n_{k=1}P(A_k)P(B\ |\ A_k)}$$ ํ™•๋ฅ ๋ณ€์ˆ˜์™€ ํ™•๋ฅ ๋ถ„ํฌ ํ™•๋ฅ  ๋ณ€์ˆ˜ ํ™•๋ฅ ์งˆ๋Ÿ‰ํ•จ์ˆ˜ $$ f(x)=P(X=x) $$ ํ™•๋ฅ ๋ฐ€๋„ํ•จ์ˆ˜ $$ P(a \leq X \leq b) = \int^b_af(x)dx$$ ํ™•๋ฅ  ๋ถ„ํฌ ๋ถ„ํฌํ•จ์ˆ˜ (๋ˆ„์ ๋ถ„ํฌํ•จ์ˆ˜) $$ F(x) = P(X \leq x) = \sum_{x_i \leq x}f(x_i)$$ ๋ถ„ํฌํ•จ์ˆ˜๊ฐ€ ์ด์‚ฐํ™•๋ฅ ๋ณ€์ˆ˜์ธ ๊ฒฝ์šฐ, $P(X=x)=F(x)-F(x-1)$ ์—ฐ์†ํ™•๋ฅ ๋ถ„ํฌ $$F(x)=P(X \leq x)=\int_{-\infty}^xf(x)dx$$ ํ™•๋ฅ ๋ณ€์ˆ˜์˜ ๊ธฐ๋Œ€๊ฐ’๊ณผ ๋ถ„์‚ฐ ํ™•๋ฅ ๋ณ€์ˆ˜์˜ ๊ธฐ๋Œ“๊ฐ’ ํ™•๋ฅ ๋ณ€์ˆ˜์˜ ๋ถ„์‚ฐ ๋ถ„์‚ฐ์˜ ์„ฑ์งˆ ๊ฒฐํ•ฉํ™•๋ฅ ๋ถ„ํฌ ๊ฒฐํ•ฉํ™•๋ฅ ์งˆ๋Ÿ‰ํ•จ์ˆ˜ $$ f(x_i,\ y_j) = P(X=x_i, Y=y_j)\ (i=1\ …\ n\ j=1\ …\ m)$$ ๊ฒฐํ•ฉ๋ถ„ํฌํ•จ์ˆ˜ $$ F(x, y) = \sum_{u \leq x}\sum_{u \leq y}f(u, v) $$ ๊ฒฐํ•ฉํ™•๋ฅ ๋ฐ€๋„ํ•จ์ˆ˜ $$ P{(X, Y) \in A} = \int_a^b \int_c^d f(x, y)dydx $$ ๊ฒฐํ•ฉ๋ถ„ํฌํ•จ์ˆ˜ $$ F(x, y) = \int_{- \infty}^x \int_{- \infty}^y f(u, v) du dv$$ ๊ณต๋ถ„์‚ฐ๊ณผ ์ƒ๊ด€๊ณ„์ˆ˜ ๊ณต๋ถ„์‚ฐ $$ Cov(X, Y) = E(XY) - \mu_X \mu_Y $$ ์ƒ๊ด€๊ณ„์ˆ˜ $$ Corr(X, Y) = \frac{Cov(X, Y)}{\sigma_X \sigma_Y} $$ ๋‘ ํ™•๋ฅ  ๋ณ€์ˆ˜๊ฐ€ ๋…๋ฆฝ์ด๋ผ๋ฉด, $E(XY) = E(X)E(Y)$ $Var(X+Y) = Var(X)+Var(Y)$ $Cov(X, Y) = 0$ $Corr(X, Y) = 0$ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ™•๋ฅ ๋ถ„ํฌ ์ด์‚ฐํ™•๋ฅ ๋ถ„ํฌ ์ด์‚ฐ๊ท ๋“ฑ๋ถ„ํฌ ํ™•๋ฅ ๋ณ€์ˆ˜ X๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ’์˜ ํ™•๋ฅ ์ด ๋ชจ๋‘ ๊ฐ™์€ ํ™•๋ฅ ๋ถ„ํฌ $$ f(x) = \frac1n (x=1, 2,\ …,\ n) $$ ๋ฒ ๋ฅด๋ˆ„์ด ๋ถ„ํฌ B(1, p) ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์˜ค์ง ๋‘ ๊ฐœ๋ฟ์ธ ๊ฒฝ์šฐ $$ f(x)=p^xq^{1-x}\ (x=0, 1) $$ $E(x) = p$ $V(x) = pq$ ์ดํ•ญ๋ถ„ํฌ B(n, p) nํšŒ์˜ ๋ฒ ๋ฅด๋ˆ„์ด ์‹œํ–‰์—์„œ ์„ฑ๊ณตํ•  ํšŸ์ˆ˜ X์˜ ํ™•๋ฅ ๋ถ„ํฌ $$ f(x) = _nC_x p^xq^{(n-x)} $$ $E(X) = np$ $V(X) = npq$ ์ดˆ๊ธฐํ•˜๋ถ„ํฌ H(N, M, n) n๊ฐœ์˜ ํ‘œ๋ณธ์„ ๋น„๋ณต์› ์ถ”์ถœ์˜ ํ™•๋ฅ ๋ถ„ํฌ $$ f(x) = \frac{{}{M}C{x} \cdot {}{N-M}C{n-x}}{{}{N}C{n}} $$ $E(X) = n \frac{M}{N}$ $V(X) = n \frac{M}{N}(1-\frac{M}{N})(\frac{N-n}{N-1})$ ํ‘ธ์•„์†ก๋ถ„ํฌ P(m) ์ฃผ์–ด์ง„ ์ƒํ™ฉ ์†์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์–ด๋–ค ์‚ฌ๊ฑด์˜ ํ‰๊ท  ๋ฐœ์ƒํšŒ์ˆ˜ X์˜ ํ™•๋ฅ ๋ถ„ํฌ $$ f(x) = \frac{e^{-m}m^x}{x!}\ (x=0, 1, 2, …)$$ $E(X) = m$ $V(X) = m$ n>=20, p<=0.05 ์ด๋ฉด ์ดํ•ญ๋ถ„ํฌ๊ฐ€ ๊ทผ์‚ฌ ๊ฐ€๋Šฅ ๊ธฐํ•˜๋ถ„ํฌ Geo(p) ์ฒ˜์Œ์œผ๋กœ ์„ฑ๊ณตํ• ๋•Œ๊นŒ์ง€์˜ ์‹œํ–‰ํšŸ์ˆ˜๋ฅผ ๋”ฐ๋ฅด๋Š” ํ™•๋ฅ ๋ถ„ํฌ $$ p(x) = q^{x-1}p (x=1, 2, …) $$ $E(X) = \frac{1}{p}$ $V(X) = \frac{q}{p^2}$ ์Œ์ดํ•ญ๋ถ„ํฌ NB(k, p) ๋ฐ˜๋ณต์‹œํ–‰์—์„œ k๋ฒˆ ์„ฑ๊ณตํ• ๋•Œ๊นŒ์ง€์˜ ์‹œํ–‰ํšŸ์ˆ˜ X์˜ ํ™•๋ฅ ๋ถ„ํฌ $$ f(x) = {}{x-1}C{k-1}\ p^kq^{x-k} $$ $E(X)=\frac{k}{p}$ $V(X)=\frac{kq}{p^2}$
new ์ž๋ฃŒ๊ตฌ์กฐ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์ œ 1์žฅ : ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ์ค€๋น„ (230302) ๋ฐฐ์—ด ๋ฐฐ์—ด(Array): ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ธฐ์ดˆ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”์ƒ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…(ADT:Abstract Data Type) : ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”์ƒ์ ์ธ ์—ฐ์‚ฐ๋“ค๋กœ์จ ๊ตฌ์„ฑ ADT =~ ์ž๋ฐ”์˜ interface, ์ž๋ฃŒ๊ตฌ์กฐ =~ ์ž๋ฐ”์˜ class ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ 1-2 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ: ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” **์‹œ๊ฐ„๋ณต์žก๋„(Time Complexity)**์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” **๊ณต๊ฐ„๋ณต์žก๋„(Space Complexity)**์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ถ„์„ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(์—ฐ์‚ฐ)์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธฐ๋ณธ ์—ฐ์‚ฐ(Elementary Operation)์ด๋ž€ ๋ฐ์ดํ„ฐ ๊ฐ„ ํฌ๊ธฐ ๋น„๊ต, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ ๊ฐฑ์‹ , ์ˆซ์ž ๊ณ„์‚ฐ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์„ ์˜๋ฏธ 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ถ„์„ ์ตœ์•…๊ฒฝ์šฐ ๋ถ„์„(Worst-case Analysis) : ์ƒํ•œ์„ ์˜ ์˜๋ฏธ ํ‰๊ท ๊ฒฝ์šฐ ๋ถ„์„(Average-case Analysis) ์ตœ์„ ๊ฒฝ์šฐ ๋ถ„์„(Best-case Analysis) : ๊ฐ€์žฅ ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ƒ๊ฐ๋ถ„์„(Amortized Analysis) : ์ด ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ํ•ฉํ•˜๊ณ  ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋ถ„์„ 1-3 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ์ ๊ทผํ‘œ๊ธฐ๋ฒ• O (Big-Oh)-ํ‘œ๊ธฐ๋ฒ• ฮฉ (Big-Omega)-ํ‘œ๊ธฐ๋ฒ• ฮ˜ (Theta)-ํ‘œ๊ธฐ๋ฒ• O (Big-Oh) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N))์ด๋‹ค. ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N)) f(N) = O(g(N))์€ N0 ๋ณด๋‹ค ํฐ ๋ชจ๋“  N ๋Œ€ํ•ด์„œ f(N)์ด ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์€ f(N)์˜ ์ƒํ•œ(Upper Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮฉ (Big-Omega) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ฅ cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮฉ(g(N)) f(N) = ฮฉ(g(N))์€ ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์ด f(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์„ f(N)์˜ ํ•˜ํ•œ(Lower Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮ˜ (Theta) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ c1g(N) โ‰ฅ f(N) โ‰ฅ c2g(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c1, c2, N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮ˜(g(N)) ฮ˜-ํ‘œ๊ธฐ๋Š” ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ O-ํ‘œ๊ธฐ์™€ ฮฉ-ํ‘œ๊ธฐ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์˜ O-ํ‘œ๊ธฐ์™€ ์ด๋ฆ„ O(1), O(logN), O(N), O(NlogN), O(N2), O(N3), O(2N) 1-5 ์ˆœํ™˜ (Recursion) ์ˆœํ™˜์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌ์„ฑ์š”์†Œ ๊ธฐ๋ณธ(Base) case : ์Šค์Šค๋กœ๋ฅผ ๋” ์ด์ƒ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ˆœํ™˜ case : ์Šค์Šค๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„ ๊ผฌ๋ฆฌ ์ˆœํ™˜ (Tail Recursion) ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ์ˆœํ™˜ (ํ˜ธ์ถœ ํ›„ ๋˜๋Œ์•„ ์™”์„๋•Œ ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ) ๊ผฌ๋ฆฌ ์ˆœํ™˜์€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค 1public class TailRecursion { 2 public static int factorial(int n, int fact) { 3 if (n==1) 4 return fact; 5 return factorial( ,); 6 } 7} ์ œ 2์žฅ : ๋ฆฌ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ์ผ๋ จ์˜ ๋™์ผํ•œ ํƒ€์ž…์˜ ํ•ญ๋ชฉ๋“ค์ด ๋‚˜์—ด๋œ ๊ฒƒ ๋ฐฐ์—ด ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ๊ฐ ํ•ญ๋ชฉ์ด ํ•˜๋‚˜์˜ ์›์†Œ์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ ‘๊ทผ : O(1), ์‚ฝ์ž…/์‚ญ์ œ : O(n) ๋ฐฐ์—ด๋กœ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ (ArrList) peek, insert, resize, delete ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Singly Linked List) print, search, insertFront, insertAfter ์ž๊ธฐ์ฐธ์กฐ๋ณ€์ˆ˜ 1public class Node <E> { 2 private Node<E> next; // ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ 3 ... 4} ์ˆ˜ํ–‰์‹œ๊ฐ„ search : O(n) insert, delete : O(1), p๊ฐ€ ์•ˆ์ฃผ์–ด์ง€๋ฉด O(n) ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Doubly Linked List) head, tail, item insertBefore, insertAfter, delete, ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Circular Linked List) ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์ œ 3์žฅ : ์Šคํƒ๊ณผ ํ ์Šคํƒ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ / LinkedList๋กœ ๊ตฌํ˜„ ํ›„์œ„ ํ‘œ๊ธฐ <-> ์ค‘์œ„ ํ‘œ๊ธฐ ์ˆ˜ํ–‰์‹œ๊ฐ„ push, pop : O(1) ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ํ™•๋Œ€/์ถ•์†Œ : O(n) ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ pop, push : O(1) ์ œ 4์žฅ : ํŠธ๋ฆฌ ์šฉ์–ด root, parent, child leaf, sibling, ancesto๋ฆฌ(์กฐ์ƒ), descendant(ํ›„์†) subtree(๋…ธ๋“œ ์ž์‹ ๊ณผ ํ›„์†์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ) degree(์ฐจ์ˆ˜ : ์ž์‹ ์ˆ˜) level (๊นŠ์ด์™€ ๋™์ผ, 0 ๋˜๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘) height (ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ level) key (ํƒ์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ์— ์ €์žฅ๋œ ์ •๋ณด) ์™ผ์ชฝ ์ž์‹-์˜ค๋ฅธ์ชฝ ํ˜•์ œ (Left Child-Right Sibling) ํ‘œํ˜„ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๊ณผ ์˜ค๋ฅธ์ชฝ ํ˜•์ œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” 2๊ฐœ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋งŒ ์‚ฌ์šฉ ์ด์ง„ ํŠธ๋ฆฌ (Binary Tree) ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ด์ง„ํŠธ๋ฆฌ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Perfect Binary Tree) ๊ฐ ๋‚ด๋ถ€ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์ง€๊ณ  ๋ชจ๋“  ์ดํŒŒ๋ฆฌ๊ฐ€ ๊ฐ™์€ ์ธต์— ์žˆ๋Š” ํŠธ๋ฆฌ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๊ฐ ๋ ˆ๋ฒจ์ด ๋…ธ๋“œ๋“ค๋กœ ๊ฝ‰ ์ฐจ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์—๋Š” ๋…ธ๋“œ๋“ค์ด ์™ผ์ชฝ๋ถ€ํ„ฐ ๋น ์ง์—†์ด ์ฑ„์›Œ์ง„ ํŠธ๋ฆฌ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์†์„ฑ ๋ ˆ๋ฒจ k์— ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜ = $2^{k-1}$ ๋†’์ด๊ฐ€ h์ธ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ = $2^{h}-1$ n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด = $log_{2}(n+1)$ ๋†’์ด๊ฐ€ h์ธ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ n ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ ํŠธ๋ฆฌ 1A 2โ”œโ”€โ”€ B 3โ”‚ โ”œ-โ”€ D 4โ”‚ โ”‚ โ”œโ”€โ”€ H 5โ”‚ โ”‚ โ””โ”€โ”€ I 6โ”‚ โ””-โ”€ E 7โ”‚ โ”œโ”€โ”€ J 8โ”‚ โ””โ”€โ”€ K 9โ””โ”€โ”€ C 10 โ”œโ”€โ”€ F 11 โ””โ”€โ”€ G ์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋ฉด (์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ ์‹œ์ž‘) 1A = [A, B, C, D, E, F, G, H, I, J, K] a[i]์˜ ๋ถ€๋ชจ๋Š” a[i/2], ๋‹จ i>1 a[i]์˜ ์™ผ์ชฝ ์ž์‹์€ a[2i], ๋‹จ 2i <= n a[i]์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ a[2i+1], ๋‹จ 2i+1 <= n ํŽธํ–ฅ(skewed) ์ด์ง„ ํŠธ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๋‹ค ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ˆœํšŒ preorder ; root - left - right inorder : left - root - right postorder : left - right - root levelorder : left -> right (from top level) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ O(n) ์‹œ๊ฐ„์ด ์†Œ์š” ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ๋ฐฐ์—ด index 0 1 2 3 4 5 6 7 8 9 value 4 2 7 7 4 4 2 7 7 4 ์ง‘ํ•ฉ 1 17 2โ”œโ”€โ”€ 2 3โ”‚ โ”œ-โ”€ 1 4โ”‚ โ””-โ”€ 6 5โ”œโ”€โ”€ 8 6โ””โ”€โ”€ 3 ์ง‘ํ•ฉ2 14 2โ”œโ”€โ”€ 0 3โ”œโ”€โ”€ 5 4โ””โ”€โ”€ 9 ์ˆ˜ํ–‰ ์‹œ๊ฐ„ union : O(N) find : O(N) ์ œ 5์žฅ : ํƒ์ƒ‰ ํŠธ๋ฆฌ 5.1 ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ min ํ•จ์ˆ˜ deleteMin ํ•จ์ˆ˜ delete ํ•จ์ˆ˜ CASE 1 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‘ ์ž์‹์ด ๋ชจ๋‘ null CASE 2 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹๋งŒ null CASE 3 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๋งŒ null CASE 4 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ž์‹์ด ๋‘˜๋‹ค ์กด์žฌ ์‹œ๊ฐ„ ๋ณต์žก๋„ O($logn$) 5.2 AVL ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ x์— ๋Œ€ํ•ด x์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์„ ๋„˜์ง€ ์•Š๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ํšŒ์ „ ์—ฐ์‚ฐ LL ํšŒ์ „ : ์™ผ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateRight(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ RR ํšŒ์ „ : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateLeft(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ LR ํšŒ์ „ : rotateLeft(n.left) -> rotateRight(n)๋กœ ํ•ด๊ฒฐ RL ํšŒ์ „ : rotateRight(n.right) -> rotateLeft(n)๋กœ ํ•ด๊ฒฐ 4๊ฐ€์ง€ ํšŒ์ „์˜ ๊ณตํ†ต์  ํšŒ์ „ ํ›„์˜ ํŠธ๋ฆฌ๋“ค์ด ๋ชจ๋‘ ๊ฐ™๋‹ค, ๋ชจ๋‘ O(1) AVLํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…๊ณผ ๋™์ผํ•˜๊ฒŒ ์ƒˆ ๋…ธ๋“œ ์‚ฝ์ž… ์ƒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฃจํŠธ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋ถˆ๊ท ํ˜•์ด ๋ฐœ์ƒํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ํšŒ์ „ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ 5.3 2-3 ํŠธ๋ฆฌ 2-3 ํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋กœ, ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋‹ค. 2-3 ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ์ƒ‰ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ ํ‚ค๋ฅผ ๋ถ€๋ชจ๋กœ ์˜ฌ๋ ค ๋ณด๋ƒ„ ๋ถ€๋ชจ๊ฐ€ 3-๋…ธ๋“œ์ด๋ฉด ๋‹ค์‹œ ๋ถ„๋ฆฌ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๋ฃจํŠธ์—์„œ ์ผ์–ด๋‚˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด 1 ์ฆ๊ฐ€ ์‚ฝ์ž… ์—ฐ์‚ฐ ์‚ฝ์ž… ํ›„ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ๋นˆ ์ž๋ฆฌ๋ฅผ ํ˜•์ œ์™€ ๋ฐ”๊พผ๋‹ค ์ด๋™์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค 2-3 ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($logn$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ -> O(1) 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋‘๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_2(n+1) $ 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_3(n) $ 5.4 2-3-4 ํŠธ๋ฆฌ 2-3ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•œ 2-3-4 ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๊ฐ€ ์ž์‹์„ 4๊ฐœ๊นŒ์ง€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์™„์ „๊ท ํ˜•ํŠธ๋ฆฌ ์ด๋ก ์ ์œผ๋กœ๋Š” 2-3ํŠธ๋ฆฌ์™€ ๋™์ผํ•˜๋‹ค ์‹ค์ œ๋กœ๋Š” ๋” ๋น ๋ฆ„ 5.5 B-ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์ •์˜ ๋‹ค์ˆ˜์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋‹ค๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ๊ท ํ˜„ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ๋ฃจํŠธ ๋ถ€ํ„ฐ ์‹œ์ž‘ ๊ฐ ๋…ธ๋“œ์—์„œ ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ดํŒŒ๋ฆฌ์— ์ƒˆ ํ‚ค๋ฅผ ์ˆ˜์šฉํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด, ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‚ฝ์ž… ์ด๋ฏธ M-1๊ฐœ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ํ‚ค์˜ ์ˆ˜๊ฐ€ M/2-1๋ณด๋‹ค ์ž‘์œผ๋ฉด(underflow) ํ˜•์ œ, ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์ด๋Šฅ ์ด๋™ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค B-ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($log_{M/2}n$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ์ œ 6์žฅ : ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋Œ€ํ‘œ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜ ์ค‘๊ฐ„ ์ œ๊ณฑ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์ œ๊ณฑํ•œ ํ›„, ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ ์‚ฌ์šฉ ์ ‘๊ธฐ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ์ด๋“ค์„ ๋”ํ•œ ๊ฐ’์„ ์‚ฌ์šฉ ์ž๋ฐ”์˜ hashCode() 1private int hash(Key k) { 2 return (k.hashCode() & 0x7fffffff) % M; 3} ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ ๋ฐฉ์‹ ๊ฐœ๋ฐฉ ์ฃผ์†Œ ๋ฐฉ์‹ : ์ถฉ๋Œ๋œ ํ‚ค๋ฅผ ์ผ์ •ํ•œ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฐพ์•„๋‚ธ empty์›์†Œ์— ์ €์žฅ ์„ ํ˜• ์กฐ์‚ฌ, ์ด์ฐจ์กฐ์‚ฌ, ์ด์ค‘ํ•ด์‹ฑ ์„ ํ˜• ์กฐ์‚ฌ : ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ 1์ฐจ ๊ตฐ์ง‘ํ™” (ํ‚ค๋“ค์ด ๋ญ‰์ณ์ง€๋Š” ํ˜„์ƒ) ๋ฐœ์ƒ ๊ตฐ์ง‘ํ™”๋Š” ๊ตฐ์ง‘๋œ ํ‚ค๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์ผ์œผํ‚จ๋‹ค ์ œ 7์žฅ : ์šฐ์„ ์ˆœ์œ„ ํ ์šฐ์„ ์ˆœ์œ„ ํ (Priority Queue) ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์— ์ ‘๊ทผ๊ณผ ์‚ญ์ œ, ์ž„์˜์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์˜ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ํž™ (Heap) ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋กœ์„œ ๋ถ€๋ชจ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ž์‹์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์€ ์ž๋ฃŒ๊ตฌ์กฐ ์ตœ์†Œ ํž™, ์ตœ๋Œ€ ํž™ ํž™์˜ ์—ฐ์‚ฐ ์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ ๋ฃจํŠธ ์‚ญ์ œ ํ›„, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™ downheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋ถ€ํ„ฐ ๋น„๊ตํ•˜๋ฉด์„œ ๋‚ด๋ ค๊ฐ ์‚ฝ์ž… ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์˜ ๋‹ค์Œ์— ์‚ฝ์ž… upheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์˜ฌ๋ผ๊ฐ ์ƒํ–ฅ์‹ ํž™ 1public void createHeap() { 2 for (int i = N/2; i>0; i--) { 3 downheap(i); 4 } 5} O(n) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ ‘๊ทผ, ์‚ฝ์ž…, ์‚ญ์ œ : O(logn) ์ œ 8์žฅ : ์ •๋ ฌ ์„ ํƒ ์ •๋ ฌ (Selection Sort) ํ•ญ์ƒ O(n^2) ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(n) : ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ ํž™ ์ •๋ ฌ (Heap Sort) ํ•ญ์ƒ : O(nlogn) ํ•ฉ๋ณ‘ ์ •๋ ฌ (Merge Sort) ํ•ญ์ƒ : O(nlogn) Stable Sort : ๊ฐ™์€ ๊ฐ’์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ์œ ์ง€๋˜๋Š” ์ •๋ ฌ ํ€ต ์ •๋ ฌ (Quick Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(nlogn) ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ• Median of Three : ์ฒซ๋ฒˆ์งธ, ๋งˆ์ง€๋ง‰, ์ค‘๊ฐ„๊ฐ’ ์ค‘์—์„œ ์ค‘๊ฐ„๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ ์ž…๋ ฅ์ด ์ž‘์€ ํฌ๊ธฐ๊ฐ€ ๋˜์—ˆ์„๋•Œ ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉ
new ์šด์˜์ฒด์ œ - ์ค‘๊ฐ„๋ฒ”์œ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์šด์˜์ฒด์ œ ๊ฐœ์š” ์šด์˜์ฒด์ œ์˜ ์—ญํ•  Program execution Access to computer resources (I/O device, Data…) Error detection and response Accounting (ex: task manager) ์šด์˜์ฒด์ œ์˜ ๋ฐœ์ „ Serial Processing : No OS, No Job scheduling Simple batch system OS๊ฐ€ job์„ ํ• ๋‹น Controlled by monitor Uni-programming ๋‹ค ์‹คํ–‰๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ bad utilization Multiprogramming The processor can switch to the other job better utilization, needs more memory Time sharing proceess์—๊ฒŒ ์ •ํ•ด์ง„ time slice (time quantum)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. better utilization, bad throughput Symmetric multiprocessing (SMP) ์—ฌ๋Ÿฌ processors๊ฐ€ main memory, I/O ์žฅ์น˜๋“ค์„ ๊ณต์œ  ์—ฌ๋Ÿฌ processors๊ฐ€ ๋™์ผํ•œ function ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ ์šด์˜์ฒด์ œ์˜ ๊ตฌ์„ฑ ์š”์†Œ Distributed Systems (๋ถ„์‚ฐ์‹œ์Šคํ…œ) ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์‚ฌ์šฉ ๋น ๋ฅธ ์†๋„, ๋†’์€ ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ Command-Interpreter System user๊ฐ€ ์ง์ ‘ OS์—๊ฒŒ ์ผ์„ ์‹œํ‚จ๋‹ค OS Architecture Monolithic kernel ๋ชจ๋“  OS์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ kernel์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค ํ•˜๋‚˜ ์ˆ˜์ •ํ•˜๋ฉด ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•œ๋‹ค Microkernel kernel kernel ๋‚ด์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ Address space management, Interprocess communication, ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์„ธ์Šค scheduling ๊ธฐ๋Šฅ kernel๊ฐ„ ํ†ต์‹ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค Process Process๋ž€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฐ์ฒด register ์ค‘ PC๊ฐ€ context๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค Context๋Š” data์™€ code๋กœ ๊ตฌ์„ฑ Trace of Processes A -> time out -> B -> I/O request -> A ์‚ฌ์ด์‚ฌ์ด์— dispatcher๊ฐ€ processor์— process๋ฅผ ๊ต์ฒดํ•œ๋‹ค Process state model Process suspension์˜ ์ด์œ  Swapping : memory ๊ณต๊ฐ„ ํ™•๋ณด๋ฅผ ์œ„ํ•ด Timing : ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ Interactive user request : user์˜ ์š”์ฒญ Parent process request : parent process์˜ ์š”์ฒญ Process Control block ๊ตฌ์„ฑ์š”์†Œ : Identifier, State, Priority, PC, Memory pointers, Address of memory context, I/O state info, Accounting info Process 1๊ฐœ ๋‹น PCB 1๊ฐœ Process Context User Context : code, data, user stack System Context : kernel stack, PCB Virtual Address Space ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์„œ ์ ‘๊ทผ(access, reference) ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋“ค์˜ ๋ฒ”์œ„ 32bit address computer : $2^{32}$ = 4G ๋ฒˆ์ง€, 3G~4G๋ฒˆ์ง€์—๋Š” ์ปค๋„์ด ๋“ค์–ด๊ฐ„๋‹ค ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์˜ VAS๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜๋งŒํผ ์กด์žฌ ๊ตฌ์„ฑ | kernel | stack (local var) | bss (๋งŒ๋“ค๋•Œ ์ดˆ๊ธฐํ™” ์•ˆ ํ•œ global var) | data (๋งŒ๋“ค๋•Œ ์ดˆ๊ธฐํ™” ํ•œ global var) | code Process Creation Process๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ OS๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ์ค‘์ธ process๊ฐ€ ์ž์‹์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ User command fork() ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ memory infotable์ด ๋ถ€๋ชจ์˜ context๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค memory๋‚ด์—์„œ ๋ถ€๋ชจ์˜ data, stack์„ ๋ณต์ œํ•œ๋‹ค ์ž์‹์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ๋ณต์ œ๋œ context๋กœ ๋ฐ”๊พผ๋‹ค COW(Copy on write) : ๋ณต์‚ฌ๋ฅผ ๋Šฆ์ถค์œผ๋กœ์„œ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ Process switch Mode change : Memory ๋‚ด์—์„œ user mode <-> system mode Context change : ๋‹ค๋ฅธ process๋กœ switch Context change๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ Process์˜ ์†Œ๋ฉธ : Running -> Release Process์˜ block (I/O request, file open, page fault) : Running -> Blocked Expiration of time slice : Running -> Ready I/O interrupt : Blocked -> Ready Steps of context switch Save context(pc, other register) of processor Update the PCB Move PCB to appropriate queue Select another process to execute Update the PCB Update memory-management data structures Restore context of the selected process Process Termination Process๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ Normal ompletion Parent request Protection error : ๋น„์ •์ƒ์ ์ธ ์ ‘๊ทผ์„ ํ• ๋•Œ OS๊ฐ€ ๊ฐ•์ œ ์ข…๋ฃŒ Arithmetic Error, Invalid instruction… terminated ์ƒํƒœ : Computer resource๋Š” ๋บ๊ฒผ์ง€๋งŒ, PCB๋Š” ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ ํ•ด๋‹น ํ”„๋กœ์„ธ์„œ์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ wait syscall์„ ํ˜ธ์ถœํ•˜๋ฉด ์™„์ „ํžˆ ์‚ญ์ œ ์ง€์›Œ์ง€๋Š” ๋ถ€๋ชจ ๋ฐ‘์— ์ž์‹์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์ž์‹๋“ค์„ init ํ”„๋กœ์„ธ์Šค์˜ ์–‘์ž๋กœ ๋ณด๋‚ธ๋‹ค Inter-Process Communication (IPC) Message Passing : kernel๋‚ด mailbox๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• user mode -> kernel mode -> user mode ๊ตฌํ˜„์ด ์‰ฝ๋‹ค, ๋А๋ฆฌ๋‹ค Shared Memory VAD์— shared memory๋ฒ• ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค ๋น ๋ฅด๋‹ค, ๊ตฌํ˜„์ด ์–ด๋ ต๋‹ค Message / Signal Threads Process์™€ Thread์˜ ์ฐจ์ด Thread๋ž€ A unit of execution of in a process has an execution state ๊ตฌ์„ฑ ์š”์†Œ Stack Memory for registers context : thread control block multithread Thread์˜ ์žฅ์  Process ๋งŒ๋“œ๋Š”๊ฑฐ ๋ณด๋‹ค Thread ๋งŒ๋“œ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค Process ์—†์• ๋Š”๊ฑฐ ๋ณด๋‹ค Thread ์—†์• ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค Process๋ผ๋ฆฌ ํ†ต์‹ ํ•˜๋Š”๊ฑฐ๋ณด๋‹ค Thread๋ผ๋ฆฌ ํ†ต์‹ ์ด ๋” ๋น ๋ฅด๋‹ค (data ๊ณต์œ ) User-Level Threads mode change๊ฐ€ ํ•„์š”์—†๋‹ค user๊ฐ€ control ํ•  ์ˆ˜ ์žˆ๋‹ค ํ•˜๋‚˜๊ฐ€ block๋˜๋ฉด ๋‚˜๋จธ์ง€๋„ block (kernel ์ž…์žฅ์—์„œ 1๊ฐœ์˜ thread) Kernel-Level Threads kernel์— ์ข…์†์ ์ด๋‹ค kernel์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค Mutual Exclusion and Synchronization Key terms in Concurrency Race condition : ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ Mutual exclusion : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ๋œ data๋ฅผ accessํ• ๋•Œ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์„ฑ์งˆ Critical section : ๊ณต์œ ๋œ resource๋ฅผ accessํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ Starvation : Process์—๊ฒŒ ์ž์›์ด ๋ฐฐ์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Deadlock : Starvation for infinite duration Producer/Consumer : Finite Buffer producer 1item v; 2 3 4while (1) { 5 while (counter == BUFFER_SIZE) ; // busy waiting 6 /* produce item v */ 7 b[in] = v; 8 in = (in + 1) % BUFFER_SIZE; 9 counter++; 10} consumer 1item w; 2while (1) { 3 while (counter == 0) ; // busy waiting 4 w = b[out]; 5 out = (out + 1) % BUFFER_SIZE; 6 counter--; 7 /* consume item w */ 8} => Race condition ๋ฐœ์ƒ ๊ฐ€๋Šฅ Race Condition in a Uniprocessor counter++, counter–์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์€ assembly๋กœ ๋ฐ”๋€Œ๋ฉด 1๊ฐœ์ด์ƒ์˜ instruction์ด๋‹ค. ์ค‘๊ฐ„์— interrupt๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด race condition์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ atomicํ•˜๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผํ•œ๋‹ค. Race Condition in one Process Multithreading์—์„œ๋„ race condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Prevent Race Condition (SW solution) ์กฐ๊ฑด Mutual Exclusion : critical section์— ํ•˜๋‚˜๊ฐ€ ์ ‘๊ทผ ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ Progress : ์•„๋ฌด๋„ ์—†์œผ๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅ Bounded Waiting : ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ํ•œ๊ณ„ ์กด์žฌ (P1 -> P3 -> P1 -> P3 .., P2๋Š”?) ๋ฐฉ๋ฒ• 1 P0 1do { 2 while (turn != 0) ; 3 /* critical section */ 4 turn = 1; 5 /* remainder section */ 6} while (true); P1 1do { 2 while (turn != 1) ; 3 /* critical section */ 4 turn = 0; 5 /* remainder section */ 6} while (true); P0์—์„œ turn = 1์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— interrupt๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, P1๋„ ์ ‘๊ทผ ๋ถˆ๊ฐ€ -> progress ์„ฑ์งˆ ๋งŒ์กฑ X ๋ฐฉ๋ฒ• 2 (Peterson’s Algorithm) P0 1do { 2 flag[0] = true; 3 turn = 1; 4 while (flag [1] && turn == 1) ; 5 /* critical section */ 6 flag[0] = false; 7 /* remainder section */ 8} while (true); P1 1do { 2 flag[1] = true; 3 turn = 0; 4 while (flag [0] && turn == 0) ; 5 /* critical section */ 6 flag[1] = false; 7 /* remainder section */ 8} while (true); ๋ชจ๋“  ์กฐ๊ฑด ๋งŒ์กฑ ํ”„๋กœ์„ธ์Šค 2๊ฐœ์ผ๋•Œ๋งŒ ์ ์šฉ ๊ฐ€์—ฌ ๋ฐฉ๋ฒ• 3 (Bakery Algorithm) 1do { 2 // number๋ฅผ ๋ถ€์—ฌ๋ฐ›๋Š” ๊ณผ์ •์€ atomic ํ•˜์ง€ ์•Š๋‹ค 3 choosing[i] = true 4 // ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ + 1์„ ๋ถ€์—ฌ 5 number[i] = max(number[0], number[1], ..., number[n-1])+1; 6 choosing[i] = false; 7 8 for (j=0; j<n; j++) { 9 // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ choosing ์ค‘์ธ์ง€ ์ฒดํฌ 10 while (choosing[i]); 11 12 // ์ž์‹ ์ด ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•˜๋Š”์ง€, ๋ฐœ๊ธ‰ ๋ฐ›์€ ๋ฒˆํ˜ธ๊ฐ€ 1์ˆœ์œ„์ธ์ง€ ์ฒดํฌ 13 while ((number[i] != 0) && (number[j], j) < (number[i], i)) ; 14 } 15 16 /* critical section */ 17 18 number[i] = 0 19 20 /* remainder section */ 21 } while (true); ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑ Overhead๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค Test and Set Instruction (HW solution) testset function 1boolean testset (i) { 2 if (i == 0) { 3 // ๋“ค์–ด๊ฐ€์‹œ์˜ค 4 i = 1; 5 return true; 6 } 7 else { 8 // ๋“ค์–ด๊ฐ€์ง€ ๋งˆ์‹œ์˜ค 9 return false; 10 } 11} example 1const int n = /* number of processes */; 2int bolt; 3void P(int i) { 4 while (true) { 5 while (! testset(bolt)); 6 /* critical section */ 7 bolt = 0; 8 /* remainder section*/ 9 } 10} 11void main() { 12 bolt = 0; 13 parbegin (P(1), P(2), ... , P(n)) 14} Semaphore (HW solution) ๊ธฐ๋ณธ ์š”์†Œ 1struct semaphore { 2 int count; 3 queueType queue; 4} 5 6void semWait (semaphore s) { 7 s.count --; 8 if (s.count < 0) { 9 // place this process in s.queue; 10 // block this process 11 } 12} 13 14void semSignal (semaphore s) { 15 s.count++; 16 if (s.count <= 0) { 17 // remove a process P from s.queue; 18 // place process P on ready_list 19 } 20} basic example 1const int n = /* number of processes */ 2semaphore s = 1; 3void P (int i) { 4 while (true) { 5 semWait(s); 6 /* critical section */ 7 semSignal(s); 8 /* remainder section */ 9 } 10} 11void main() { 12 parbegin (P(1), P(2), ... , P(n)); 13} producer/consumer example producer 1semaphore count = 0; 2semaphore empty = BUFFER_SIZE; 3semaphore mut_ex = 1; 4void producer() { 5 while (true) { 6 produce(); 7 semWait(empty); 8 semWait(mut_ex); 9 append(); // put the produced item into buffer 10 semSignal(mut_ex); 11 semSignal(counter); 12 } 13} consumer 1void consumer() { 2 while (true) { 3 semWait(counter): 4 semWait(mut_ex); 5 take(); 6 semSignal(mut_ex); 7 semSignal(empty); 8 consume(); 9 } 10} 11void main() { 12 parbegin (producer1, producer2, ... , consumer); 13} reader/writer example writer process 1 void writer() { 2 while(true) { 3 semWait(wsem); 4 WRITEUNIT(); 5 semSignal(wsem); 6 } 7 } reader process 1 void reader() { 2 while (true) { 3 semWait(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๋ถˆ๊ฐ€ 4 readcount++; 5 if (readcount == 1) // ์ฒซ๋ฒˆ์งธ ๋“ค์–ด๊ฐ€๋Š” reader 6 semWait(wsem) // writer ์ ‘๊ทผ ๋ถˆ๋Šฅ 7 semSignal(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๊ฐ€๋Šฅ 8 9 READUNIT(); 10 11 semWait(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๋ถˆ๊ฐ€ 12 readcount--; 13 if (readcount == 0) // ๋งˆ์ง€๋ง‰ ๋‚˜์˜ค๋Š” reader 14 semSignal(wsem); // writer ์ ‘๊ทผ ๊ฐ€๋Šฅ 15 semSignal(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๊ฐ€๋Šฅ 16 } 17 } binary semaphore semaphore์˜ ๊ฐ’์ด 0๊ณผ 1๋กœ ์ œํ•œ ๊ฐ’์ด 1๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ,๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ready state๋กœ ๋ณ€ํ™˜ Lock binary semaphore๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ ๋™๊ธฐํ™” ๋ฐฉ์‹ Deadlock Deadlock์ด๋ž€ Starvation : ์–ด๋–ค ์ž์›์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฏธ ์ ์œ ํ•˜๊ณ  ์žˆ์–ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ Deadlock : 2๊ฐœ ์ด์ƒ์˜ process๋“ค์ด ์„œ๋กœ starvation์ธ ์ƒํƒœ Deadlock์˜ ์กฐ๊ฑด์„ ํ•˜๋‚˜์”ฉ ๊นจ๋ณด์ž Mutual exclusion : OS์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ Hold and wait : ์‹œ์ž‘๋ถ€ํ„ฐ ๋ชจ๋“  ์ž์›์„ ๋ฐ›๋„๋ก ๊ตฌํ˜„ -> ๋น„ํšจ์œจ์  No Preemption : ์ž์›์„ ์„œ๋กœ ๋บ์–ด๊ฐ -> ๋น„ํšจ์œจ์  Circular Wait : ์ž์›์„ ๋จผ์ € ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์กด์žฌ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ตœ์„ ์˜ ๋ฐฉ๋ฒ• : deadlock์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•œ ๊ฐœ์”ฉ ์ฃฝ์—ฌ๋ณด๊ธฐ File Management FCB File Control block, ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์— ์ €์žฅ ๊ตฌ์„ฑ file name, file size, uid, gid, file operation, creation time, last modified, last access time, address of file data… Device file ๋ธ”๋กํ˜• ํŒŒ์ผ (๋‹จ์œ„ : 4096byte) file size ๋Œ€์‹  major number, minor number ์กด์žฌ Device I/O๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น Device File๊ณผ I/O ํ•˜๋“ฏ์ด ์ž‘๋™
new ๋ฐ์ดํ„ฐํ†ต์‹ 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋ฉ”์‹œ์ง€(ํŒจํ‚ท, ํ”„๋ ˆ์ž„), ๊ณ„์ธต OSI 7 Model Physical Data Link Network Transport Session Presentation Application TCP/IP ๊ณ„์ธต ๊ณ„์ธต ์ด๋ฆ„ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ ๋‚ด์šฉ 1 Phisical Bits Bits 2 Data Link Ethernet Frame Ethernet ์ฃผ์†Œ 3 Network IP packet, Datagram IP ์ฃผ์†Œ 4 Transport TCP Segment, UDP Datagram Port ๋ฒˆํ˜ธ 5 Application HTTP ๋ฉ”์‹œ์ง€, Email ๋ฉ”์‹œ์ง€ URL, Email ์ฃผ์†Œ Protocol Suite HTTP - TCP - IP - ARP ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ - ์‚ฌ์ธ ํ•จ์ˆ˜ $$ y(t) = A sin(2\pi ft + \varphi) $$ A = ํฌ๊ธฐ(amplitude) f = ์ฃผํŒŒ์ˆ˜(frequency) $\varphi$ = ์œ„์ƒ(phase) ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ - ์šฉ์–ด ์ฃผ๊ธฐ(Period) : ์‹ ํ˜ธ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์‹œ๊ฐ„ ์ฃผํŒŒ์ˆ˜ (Frequency) : ์‹œ๊ฐ„๋‹น ๋ฐ˜๋ณต๋˜๋Š” ์‹ ํ˜ธ ๊ฐœ์ˆ˜ ๋Œ€์—ญํญ (Bandwidth) : ์•„๋‚ ๋กœ๊ทธ -> ์ฃผํŒŒ์ˆ˜ ๋ฒ”์œ„ (Hz), ๋””์ง€ํ„ธ -> ๋น„ํŠธ ์ „์†ก๋ฅ (bps) ๊ด€๋ จ ํ•จ์ˆ˜ 1# start์—์„œ end๊นŒ์ง€ step ์ฆ๊ฐ€ 2numpy.arange(start, stop, step) 3# start์—์„œ end๊นŒ์ง€ step๊ฐœ๋กœ ๋‚˜๋ˆ” 4numpy.linspace(start, stop, step) Analog -> Digital PCM (Pulse-code modulation, ํŽ„์Šค ๋ถ€ํ˜ธ ๋ณ€์กฐ) ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์˜ ๋””์ง€ํ„ธ ํ‘œํ˜„, ๋””์ง€ํ„ธ ๋น„๋””์˜ค์˜ ํ‘œ์ค€ ๊ณผ์ • : Sampling(ํ‘œ๋ณธํ™”), Quantization(์–‘์žํ™”), Encoding(๋ถ€ํ˜ธํ™”) Nyquist sampling theorem ์‹ ํ˜ธ์— ํฌํ•จ๋œ ๊ฐ€์žฅ ๋†’์€ ์ง„๋™์ˆ˜์˜ 2๋ฐฐ์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ๋„๋กœ ์ผ์ •ํ•˜๊ฒŒ ์ƒ˜ํ”Œ๋งํ•˜๋ฉด ์›๋ž˜์˜ ์‹ ํ˜ธ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋‹ค. Nyquist bit rate - ๋ฌด์žก์Œ ์ฑ„๋„ $$ Bit Rate = 2 \times bandwidth \times log_2(L)$$ bandwidth : ๋Œ€์—ญํญ L : ์‹ ํ˜ธ ๋ ˆ๋ฒจ Bit rate : ์ดˆ๋‹น๋น„ํŠธ์ˆ˜ ์„€๋„Œ ์šฉ๋Ÿ‰ (Shannon Capacity) - ์žก์Œ์ฑ„๋„ $$ Capacity = bandwidth \times log_2(1+SNR) $$ SNR์€ ์‹ ํ˜ธ์— ๋Œ€ํ•œ ์žก์Œ ๋น„์œจ Capacity : ์ฑ„๋„ ์šฉ๋Ÿ‰ (bps) SNR์ด ๋ฐ์‹œ๋ฒจ(dB)๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ $$ SNR = 10^{\frac{SNR(dB)}{10}} $$ Digital -> Analog ASK (Amplitude Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ํ˜ธ ํฌ๊ธฐ๋กœ ์ „์†ก FSK (Frequency Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผํŒŒ์ˆ˜๋กœ ์ „์†ก PSK (Phase Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์ƒ์œผ๋กœ ์ „์†ก QAM (Quadrature Amplitude Modulation) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ธฐ์™€ ๊ฐ๋„๋กœ ์ „์†ก Fourier Transfer ์‹œ๊ฐ„์ด๋‚˜ ๊ณต๊ฐ„์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๋ณ€ํ™˜ Reed-Solomon(RS) Code n = k(์›๋ž˜ ๋ฐ์ดํ„ฐ) + n-k(์˜ค๋ฅ˜ ์ •์ • ์ฝ”๋“œ) (n-k)/2 = t, t๊ฐœ ์ดํ•˜ symbol ์˜ค๋ฅ˜ ์ •์ • ๊ฐ€๋Šฅ Line coding Unipolar NRZ (Non return to Zero) 0 or 1 Polar NRZ-L -1 or 1 Polar NRZ-I -1 or 1, 1์ด ๋‚˜์˜ค๋ฉด transition RZ (Return to Zero) 0 or 5 Manchester ์‹ ํ˜ธ ๋ณ€ํ™” -> ์‹ ํ˜ธ์˜ ๋™๊ธฐํ™” Differential Manchester Manchester ๋ฐ˜๋Œ€ Cable ์ „์†ก ๋งค์ฒด (Transmission media) Guided(wired) Twisted-pair cable Coaxial cable Fiber-optic cable Unguided(wireless) Radio wave Microwave Infrared Ethernet cable (์ด๋”๋„ท ์ผ€์ด๋ธ”) Twisted-pair cable์˜ ํ•œ ์ข…๋ฅ˜ ์‹ฌ์„ ์„ ๊ผฌ์•„๋†“๋Š” ์ด์œ  : ๋…ธ์ด์ฆˆ ๋ฐฉ์ง€ ์ด๋”๋„ท ์ „์†ก ํ”„๋กœํ† ์ฝœ์˜ ๋งค์ฒด ์ ‘๊ทผ ๋ฐฉ์‹ = CSMA/CD ์ „ํ™”์„ , ์ด๋”๋„ท์— ํ™œ์šฉ Coaxial Cable (๋™์ถ• ์ผ€์ด๋ธ”) TV, ์ด๋”๋„ท์— ํ™œ์šฉ ๋‚ด๋ถ€์˜ ๋‹จ์ผ ๊ตฌ๋ฆฌ์„ , ์™ธ๋ถ€ ๋„์ฒด๋กœ ๊ตฌ์„ฑ ๊ณ ์ฃผํŒŒ์˜ ์‹ ํ˜ธ๋ฅผ ๋ฉ€๋ฆฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค Fiber-optic cable (๊ด‘ ์ผ€์ด๋ธ”) ๋ชจ๋“œ ๊ตฌ๋ถ„ Single mode, Multi mode > Step index, Graded index Single mode : ๋น ๋ฅด๊ณ , ๋ฉ€๋ฆฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. Multi mode : ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌ, ๊ฐ€๊ฒฉ์ด ์‹ธ๊ณ  ์ทจ๊ธ‰์ด ์šฉ์ดํ•˜๋‹ค ๋ฌด์„  ํ†ต์‹  ๊ธฐ์ˆ  ์ „ํŒŒ : CDMA, LTE, 5G, Bluetooth, Wifi, Zigbee(์ง๋น„, ์ €๊ฐ€ ์ €์ „๋ ฅ ๋„คํŠธ์›Œํฌ์˜ ํ‘œ์ค€) ๋น› : Li-fi ์†Œ๋ฆฌ : Pied-Piper ๋‹ค์ค‘ํ™” ๊ธฐ์ˆ  Multiplexing ์„  1๊ฐœ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ  ์†ก์‹ ์ž -> ์‹ ํ˜ธ -> MUX -> 1 link, n channels -> DEMUX -> ์ˆ˜์‹ ์ž ์ข…๋ฅ˜ FDM, WDM, TDM FDM (์ฃผํŒŒ์ˆ˜๋ถ„ํ• ๋‹ค์ค‘ํ™”: Frequency-division multiplexing) ์•„๋‚ ๋กœ๊ทธ ๊ธฐ์ˆ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹ ํ˜ธ๋ฅผ ๊ฐ๊ฐ์˜ ๋ฐ˜์†ก ์ฃผํŒŒ์ˆ˜์— ์‹ค์–ด๋ณด๋‚ด๋Š”(๋ณ€์กฐ) ๊ธฐ์ˆ  TDM(์‹œ๊ฐ„๋ถ„ํ• ๋‹ค์ค‘ํ™”) ๋””์ง€ํ„ธ ๊ธฐ์ˆ  ์‹œ๊ฐ„์„ ์ „์†ก ๋‹จ๋ง๊ธฐ์— ๋‚˜๋ˆ„์–ด ์ฃผ๋Š”๊ฒƒ ์ „์†ก ๋‹จ์œ„ input slot์˜ duration output slot์˜ duration output bit rate output frame rate = ์ดˆ๋‹น ํ”„๋ ˆ์ž„ ์ˆ˜ frame duration = 1 / frame rate ํ™œ์šฉ : T1, T3… T1 ๋‹ค์ค‘ํ™” 1.544 Mbps๋กœ ์Œ์„ฑ 24์ฑ„๋„ (์ „ํ™”ํšŒ์„ )์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๋‹ค์ค‘ํ™” ์ „์†ก Switching ํšŒ์„  ๊ตํ™˜๋ง (Circuit-switched Network) ํšŒ์„ ์˜ ์„ค์ •, ๋ฐ์ดํ„ฐ์˜ ์ด๋™, ํšŒ์„ ์˜ ๋‹จ์ ˆ 3๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค ๊ณต๊ฐ„ ๋ถ„ํ•  ๋ฐฉ์‹, ์‹œ๋ถ„ํ•  ๋ฐฉ์‹ ์กด์žฌ ํšŒ์„ ์ด ๋‹จ์ ˆ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋…์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด๋‹ค ์ง€์—ฐ์‹œ๊ฐ„์ด ์งง๋‹ค ํŒจํ‚ท ๊ตํ™˜๋ง (Packet-switched Network) ๊ณ ์ •๋œ ๊ฒฝ๋กœ๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋ฐฉ์‹, ๊ฐ€์ƒ ํšŒ์„  ๋ฐฉ์‹ ์กด์žฌ ํšจ์œจ์ (ํšŒ์„  ๋‹ค์ค‘ํ™”)์ด๊ณ  ์‹ ๋ขฐ๋„๊ฐ€ ๋†’๋‹ค(์šฐํšŒ ๊ฐ€๋Šฅ) ๋Œ€๊ธฐ์ง€์—ฐ์‹œ๊ฐ„(ํ์ž‰) : ๊ตํ™˜๊ธฐ(๋ผ์šฐํ„ฐ)์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ํ›„ ๋ชฉ์ ์ง€ ์ฃผ์†Œ ๊ฒ€์ƒ‰ ํ†ต์‹ ์—์„œ 4๊ฐ€์ง€ ์ง€์—ฐ์‹œ๊ฐ„ : ์ „ํŒŒ์‹œ๊ฐ„, ์ „์†ก์‹œ๊ฐ„, ํ์ž‰์‹œ๊ฐ„, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ ํŒจํ‚ท ๊ตํ™˜๊ธฐ (๋ผ์šฐํ„ฐ) web ๋˜๋Š” ssh๋กœ ์ ‘์† ๊ฐ€๋Šฅ ํŒจํ‚ท ๊ตํ™˜์˜ ํŠน์ง• ๋‹ค์ค‘ํ™”: ํŒจํ‚ท์„ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋กœ ๊ฒฝ์œ  ์ฑ„๋„ : ๊ฐ€์ƒ ํšŒ์„  ํ˜น์€ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๊ตํ™˜ ์ฑ„๋„์„ ์‚ฌ์šฉ ๊ฒฝ๋กœ ์„ ํƒ : ํŒจํ‚ท๋งˆ๋‹ค ์ตœ์ ์˜ ๊ฒฝ๋กœ ์„ค์ • ์ˆœ์„œ ์ œ์–ด : ํŒจํ‚ท์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•œ๋‹ค (์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ) ํŠธ๋ž˜ํ”ฝ ์ œ์–ด : ์ „์†ก ์†๋„ ๋ฐ ํ๋ฆ„์„ ์ œ์–ด ์—๋Ÿฌ ์ œ์–ด : ์—๋Ÿฌ๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์žฌ์ „์†ก ๊ด€๋ จ ๋ช…๋ น์–ด 1# ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”, ์—ฐ๊ฒฐ๋œ ํฌํŠธ๋ฒˆํ˜ธ ํ™•์ธ 2netstat -rn 3# ํ™œ์„ฑํ™”๋œ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ธ๋ถ€์‚ฌํ•ญ ํ‘œ์‹œ 4ifconfig 5# NATํ…Œ์ด๋ธ”์—์„œ vn์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ฒด์ธ์— ๋Œ€ํ•œ ๊ทœ์น™ ์กฐํšŒ 6iptables -t nat -L -vn 7 8# Router view ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ˜ธ์ŠคํŠธ์— ์ ‘์† 9telnet route-views.routeviews.org 10# ํ˜„์žฌ ์žฅ๋น„์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์š”์•ฝ ์ •๋ณด ์ถœ๋ ฅ 11show interface summary 12# BGP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ๋น„์˜ ์š”์•ฝ ์ •๋ณด ์ถœ๋ ฅ 13show ip bgp summary 14# ์™ธ๊ตญ ๋ผ์šฐํ„ฐ์—์„œ ์ถฉ๋‚จ๋Œ€๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ๊ธธ 15show ip bgp 168.188.0.0/16 NAT (Network Address Translation : ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜) IP ํŒจํ‚ท์—์žˆ๋Š” ์ถœ๋ฐœ์ง€ ๋ฐ ๋ชฉ์ ์ง€์˜ IP์ฃผ์†Œ์™€ TCP/UDP ํฌํŠธ ์ˆซ์ž ๋“ฑ์„ ๋ฐ”๊ฟ” ์žฌ๊ธฐ๋กํ•˜๋ฉด์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ฃผ๊ณ  ๋ฐ›๊ฒŒํ•˜๋Š” ๊ธฐ์ˆ  BGP (Border Gateway Protocol) ์„œ๋กœ ๋‹ค๋ฅธ ์กฐ์ง์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ ํ†ต์‹  ์†๋„ ์ฒ˜๋ฆฌ์œจ (Throughput) A -> B๋กœ ์ „์†กํ•˜๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ๋””์ง€ํ„ธ ์ „์†ก๋ฅ  1# ์„œ๋ฒ„ networks.cnu.ac.kr:8080 ์œผ๋กœ ์‹œํ—˜ ํŒจํ‚ท์„ ์ „์†ก 2iperf3 -c networks.cnu.ac.kr -p 8080 ๊ฐ์ข… ์ „์†ก ๋น„ํŠธ ์ „์†ก๋ฅ  ๊ณ„์‚ฐ (๊ฐ•์˜ ์ž๋ฃŒ ์ฐธ๊ณ ) ํ†ต์‹  ์ง€์—ฐ ์‹œ๊ฐ„ d(nodal) : nodal delay (์ „์ฒด ๋…ธ๋“œ ์ง€์—ฐ) d(nodal) = d(proc) + d(queue) + d(trans) + d(prop) d(proc) : nodal processing delay (๋…ธ๋“œ ์ฒ˜๋ฆฌ ์ง€์—ฐ) ํŒจํ‚ท ํ—ค๋”๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ๊ทธ ํŒจํ‚ท์„ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์‹œ๊ฐ„ d(queue) : queueing delay (ํ์ž‰ ์ง€์—ฐ) ํŒจํ‚ท์ด ํ์—์„œ ๋งํฌ๋กœ ์ „์†ก๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ d(trans) : transmission delay (์ „์†ก ์ง€์—ฐ) ํŒจํ‚ท์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋งํฌ๋กœ ๋ฐ€์–ด๋‚ด๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„ d(prop) : propagation delay (์ „๋‹ฌ ์ง€์—ฐ/์ „ํŒŒ ์ง€์—ฐ) ๋น„ํŠธ๊ฐ€ ๋ผ์šฐํ„ฐ A ์ƒ์—์„œ์˜ ๋งํฌ์—์„œ ๋ผ์šฐํ„ฐ B๊นŒ์ง€์˜ ์ „ํŒŒ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ ๋ช…๋ น์–ด 1ping www.google.com 2traceroute www.eurecom.fr Decibel, dB ์‹ ํ˜ธ ์„ธ๊ธฐ์˜ ์ธก์ • ๋‹จ์œ„ $$ L_b = 10log {B \over A} |dB| $$ ๋‘ ์‹ ํ˜ธ(A, B) ๊ฐ’์— ๋Œ€ํ•œ ์ƒ๋Œ€์  ํฌ๊ธฐ ์ฐจ์ด ์ „๋ ฅ, ๋ฌด์„ ์‹ ํ˜ธ ์‹ ํ˜ธ๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ์š”์†Œ ์•ฝํ™” (attenuation) ์™œ๊ณก (distortion) ์žก์Œ (noise) (SNR:Signal-to-noise ratio : ์‹ ํ˜ธ ๋Œ€ ์žก์Œ ๋น„์œจ) ์ง€ํ„ฐ ์ง€์—ฐ๊ฐ’์ด ๋‹ค์–‘ํ•˜๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ (๋“ค์ญ‰๋‚ ์ญ‰) ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต ๋ฌผ๋ฆฌ ๊ณ„์ธต์„ ์ด์šฉํ•˜์—ฌ ์ „์†ก ์žฅ๋น„ : ๋ธŒ๋ฆฌ์ง€, L2 switch(ethernet address) ์„œ๋ธŒ ๊ณ„์ธต 2๊ฐœ ๋…ผ๋ฆฌ์  ๋งํฌ ์ œ์–ด ๋งค์ฒด ์ ‘๊ทผ ์ œ์–ด Mac Address Network interface card(NIC) identifier ๋Œ€๋ถ€๋ถ„ ๊ณ ์ •, ์ผ๋ถ€๋Š” ๊ฐ€๋ณ€ 48๋น„ํŠธ 6๋ฐ”์ดํŠธ (MAC-48) IP Address IPv4 : 32bit (4bytes) IPv6 : 128bit (16bytes) Class ๊ตฌ๋ถ„ ์‹œ์ž‘(2์ง„์ˆ˜) ์‹œ์ž‘ (10์ง„์ˆ˜) ๊ตฌ์„ฑ host ๋ฒ”์œ„ A 0 1~126 network 7, host 24 $2^7-1$ B 10 128.0~191.255 network 14, host 16 $2^{14}$ C 110 192.0.0~223.255.255 network 21, host 8 $2^ {22}$ ์˜ˆ) 192.168.1.132, subnet mask = 255.255.255.192 ํ•ด๋‹น ์ฃผ์†Œ 192.168.1.128 (132 & 192) ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์™€, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ œ์™ธํ•œ ํ˜ธ์ŠคํŠธ ๊ฐœ์ˆ˜ $2^6-2 = 62๊ฐœ$ CIDR (Classless Inter-Domain Routing) ์˜ˆ) 143.7.65.203/24 ์ฃผ์†Œ ๊ณต๊ฐ„ ์•ž์—์„œ 24๋น„ํŠธ ๋นผ๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅ : 143.7.65.0 ~ 143.7.65.255 ์„œ๋ธŒ๋„ท ๋งˆ์Šคํฌ ์•ž 24์ž๋ฆฌ๊ฐ€ 1์ด๋‹ค : 255.255.255.0 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์ฃผ์†Œ ์ฃผ์†Œ๊ณต๊ฐ„์˜ ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ : 143.7.65.255 ARP, PPP ARP (Address Resolution Protocol) IP ์ฃผ์†Œ (๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ) -> MAC ์ฃผ์†Œ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” L2 ํ”„๋กœํ† ์ฝœ Reverse ARP : MAC ์ฃผ์†Œ -> IP ์ฃผ์†Œ Gratuitous ARP : ์ž์‹ ์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ARP ํ…Œ์ด๋ธ” IP ์ฃผ์†Œ, MAC ์ฃผ์†Œ, TTL(Time To Live) TTL : ARP ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ฃผ์†Œ์˜ ์œ ํšจ๊ธฐ๊ฐ„ ARP ํ…Œ์ด๋ธ”์— ์—†๋Š” ๊ฒฝ์šฐ, ARP Request๋ฅผ ๋ณด๋‚ธ๋‹ค Proxy ARP : ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์˜ ํ˜ธ์ŠคํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ผ์šฐํ„ฐ (์ฃผ๋กœ ๊ณต์œ ๊ธฐ) ARP Spoofing : ARP ํ…Œ์ด๋ธ”์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• PPP (Point-to-Point Protocol) ์ปดํ“จํ„ฐ/๋ผ์šฐํ„ฐ ๊ฐ„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ L2 ํ”„๋กœํ† ์ฝœ PPP ๊ธฐ๋Šฅ : ์ธ์ฆ, ์ „์†ก, ์•”ํ˜ธํ™”, ๋ฐ์ดํ„ฐ ์••์ถ• ์„ธ๋ถ€ ํ”„๋กœํ† ์ฝœ : LCP, NCP NCP (Network Control Protocol) IP, IPX, AppleTalk ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ PPP ํ”„๋ ˆ์ž„์˜ ํ”„๋กœํ† ์ฝœ ํ•„๋“œ์— ์‚ฌ์šฉ๋จ PPTP (Point-to-Point Tunneling Protocol) PPP๋ฅผ ์ด์šฉํ•œ VPN (Virtual Private Network) ๊ตฌํ˜„ ํ”„๋กœํ† ์ฝœ Tunneling packets : ํŒจํ‚ท ์•ˆ์— ํŒจํ‚ท์„ ๋„ฃ์–ด์„œ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ณต์œ ๊ธฐ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜ NAT, ๊ณต์œ ๊ธฐ ๊ณต์œ ๊ธฐ (Network Address Translator) IP ์ฃผ์†Œ ๋ณ€ํ™˜ : public IP <-> private IP NAT๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์„ค IP ์ฃผ์†Œ RFC1918 name CIDR Host size Mask bits Classful description 24-bit block 10.0.0.0/8 24 bits 8 bits single class A network 20-bit block 172.16.0.0/12 20 bits 12 bits 16 contiguous class B networks 16-bit block 192.168.0.0/16 16 bits 16 bits 256 contiguous class C networks ์ฃผ์†Œ๋ฒˆ์—ญ IP์ฃผ์†Œ, Port๋ฒˆํ˜ธ ๋‘˜๋‹ค ๋ณ€ํ•œ๋‹ค NAT์˜ ์‚ฌ์šฉ : IP ๊ณต์œ ๊ธฐ, ํ…Œ๋”๋ง, Docker, VirtualBox, ์ด๋™ํ†ต์‹ ๋ง, Cloud ๊ณต์œ ๊ธฐ = ํ”„๋กœํ† ์ฝœ์˜ ์ง‘ํ•ฉ DNS Server (L7) IP Router + NAT + DHCP (L3) Bridge, Ethernet Switch, Ethernet, Wifi (L2) Modem (L1) ๋น„ํŠธ์˜ค๋ฅ˜ ํƒ์ง€ ๋ฐ ์ˆ˜์ • ์šฉ์–ด ๋ฐ์ดํ„ฐ ์›Œ๋“œ : ์›๋ž˜ ๋ฐ์ดํ„ฐ k bits ์ฝ”๋“œ์›Œ๋“œ : ๋ฐ์ดํ„ฐ ์›Œ๋“œ + r bits์˜ ์˜ค๋ฅ˜ํƒ์ง€ ์ฝ”๋“œ ๋น„์‹ ๋ขฐ์„ฑ ์ฑ„๋„ (์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ๊ฐ€๋Šฅ) ์ด๋ผ๊ณ  ๊ฐ€์ • ํ•ด๋ฐ ๊ฑฐ๋ฆฌ (Hamming distance) : ๋‘ ์ฝ”๋“œ์›Œ๋“œ์˜ ๋น„ํŠธ๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ์ˆ˜ ์ตœ์†Œ ํ•ด๋ฐ ๊ฑฐ๋ฆฌ : ์ฝ”๋“œ์›Œ๋“œ ๊ฐ„์˜ ์ตœ์†Œ ํ•ด๋ฐ ๊ฑฐ๋ฆฌ ์ฝ”๋“œ์›Œ๋“œ ๋น„ํŠธ ์—๋Ÿฌ ํƒ์ง€ s๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. $$ d_{min} = s + 1$$ t๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. $$ d_{min} = 2t + 1$$ ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• Parity bit Even or Odd, ์˜ค๋ฅ˜ ํƒ์ง€ ๋Šฅ๋ ฅ CRC (Cyclic Redundancy Check) ๋ฐ์ดํ„ฐ ์›Œ๋“œ๋ฅผ x๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ฝ”๋“œ์›Œ๋“œ์— ์ถ”๊ฐ€ Checksum ๋ฐ์ดํ„ฐ ์›Œ๋“œ์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋”ํ•œ ๊ฐ’์˜ ๋ณด์ˆ˜๋ฅผ ์ฝ”๋“œ์›Œ๋“œ์— ์ถ”๊ฐ€ ์“ฐ์ด๋Š” ๊ณณ : IPํ—ค๋”, UDP ํ—ค๋”, TCPํ—ค๋” ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ ๋น› ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• FEC Reed Solomon Code (n-k)/2 = t๊ฐœ ์ดํ•˜ symbol ์˜ค๋ฅ˜ ์ •์ • ๊ฐ€๋Šฅ (k๋Š” ๋ฐ์ดํ„ฐ์›Œ๋“œ ๊ธธ์ด, n์€ ์ฝ”๋“œ ์›Œ๋“œ ๊ธธ์ด) ์˜ค๋ฅ˜์ œ์–ด : ์žฌ์ „์†ก Stop-and-Wait ARQ ์ „์†ก ํ›„, ACK๋ฅผ ๋ฐ›์•„์•ผ ๋‹ค์Œ ํŒจํ‚ท์„ ์ „์†ก Go-Back-N ARQ N๊ฐœ์˜ ํŒจํ‚ท์„ ์ „์†กํ•˜๊ณ , ACK๋ฅผ ๋ฐ›์œผ๋ฉด ๋‹ค์Œ N๊ฐœ๋ฅผ ์ „์†ก ํŒจํ‚ท 1,2,3,4,5 ์ค‘ 3์ด ๋ถ„์‹ค๋˜๋ฉด 4,5์— ๋Œ€ํ•œ ACK๋„ 2 -> ์ˆœ์„œ๊ฐ€ ํ‹€๋ฆฌ๋ฉด ๋’ค์˜ ๊ฒƒ์€ ๋‹ค ๋ฒ„๋ฆฐ๋‹ค -> ๋น„ํšจ์œจ์  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ : ACK๊ฐ€ ๋ชจ๋‘ ๋ถ„์‹ค๋˜๋Š” ๊ฒฝ์šฐ Selective Repeat ARQ ํŒจํ‚ท 1,2,3,4,5 ์ค‘ 3์ด ๋ถ„์‹ค๋˜๋ฉด 4,5์— ๋Œ€ํ•œ ACK๋Š” ๊ฐ๊ฐ 4, 5 -> ์ˆœ์„œ๊ฐ€ ํ‹€๋ ค๋„ ๋’ค์˜ ๊ฒƒ์€ ๋ฒ„ํผ์— ์ €์žฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ : ACK๊ฐ€ ๋ชจ๋‘ ๋ถ„์‹ค๋˜๋Š” ๊ฒฝ์šฐ ์œˆ๋„์šฐ ํฌ๊ธฐ ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ ์ˆ˜์‹ ์ž SW 0 or 1 1 GN $2^m-1$ 1 SR $2^{m-1}$ $2^{m-1}$ RTT (Round Trip Time) $$ U_{sender} = {L/R \over RTT+L/R} $$ ์ด๋”๋„ท๊ณผ ๋žœ ์ด๋”๋„ท ์ตœ์†Œํฌ๊ธฐ : 64bytes ๋น„ํŠธ ์ „ํŒŒ ์†๋„ : 2.8$\mu$s ์ „์†ก ์ง€์—ฐ์‹œ๊ฐ„ : 64byte / 10Mbps = 51.2$\mu$s ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ : 2*10^8m/s * 51.2/2 = 5.12km 2500m ์ด๋‚ด์˜ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ธฐ์œ„ํ•ด์„œ 64byte๋กœ ์„ค๊ณ„ (2๋ฐฐ ๋ฒ„ํผ) Mac์ฃผ์†Œ 6byte (48bit) ํ‘œ์ค€ ์ด๋”๋„ท MAC IEEE 802.3 (CSMA/CD) 1-persistent : ์‹ ํ˜ธ ๊ฐ์ง€ ํ”„๋กœํ† ์ฝœ ์ „ํŒŒ์ง€์—ฐ = ์ „์†ก๊ฑฐ๋ฆฌ / ์ „ํŒŒ์†๋„ ์ „์†ก์ง€์—ฐ = ํŒจํ‚ทํฌ๊ธฐ / ๋Œ€์—ญํญ a = ์ „ํŒŒ์ง€์—ฐ / ์ „์†ก์ง€์—ฐ Efficiency $$ 1 \over (1 + 6.4 \times a) $$ ํ˜„๋Œ€ ์ด๋”๋„ท ์Šค์œ„์น˜, ์ด๋”๋„ท : ์ถฉ๋ŒX, CSMA/CD -> CSMA/CA ๊ฐ€์ƒ ๋žœ ์—๋Ÿฌ์ œ์–ด : GE : FEC, 10GE : ITU G.975 Reed Solomon Code, ์žฌ์ „์†กX Virtual LAN (VLAN) ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ LAN์„ ๊ฐ™์€ LAN์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ˆ  VirtualBox, Docker์—์„œ ํ™œ์šฉ LAN์—์„œ์˜ ์‚ฌ์ดํด ๋ฌธ์ œ ์ด๋”๋„ท์€ TTLํ•„๋“œ๊ฐ€ ์—†์Œ -> ๋ฃจํ”„ ๋ฐœ์ƒ์‹œ ํŠธ๋ž˜ํ”ฝ์ด ํญ์ฃผ Spanning Tree Protocol (STP) ์‚ฌ์šฉ MAC - CSMA/CD (IEEE 802.3) ๋งค์ฒด์ ‘๊ทผ์ œ์–ด ๊ธฐ์ˆ  ์—ฌ๋Ÿฌ ์†ก์‹ ์ž - ์—ฌ๋Ÿฌ ์ˆ˜์‹ ์ž์—์„œ ๊ณต์œ  ๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ  Aloha ๊ทธ๋ƒฅ ๋ณด๋‚ธ๋‹ค -> ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์žฌ์ „์†ก Slotter aloha : ์Šฌ๋กฏ์„ ๋‚˜๋ˆ ์„œ ๋ณด๋‚ธ๋‹ค ์ดํ›„์— ์ด๋”๋„ท์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š”๋ฐ ๊ธฐ์—ฌ G = ํ”„๋ ˆ์ž„ 1๊ฐœ ์ „์†กํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ (ms) slotted aloha์˜ ์ฒ˜๋ฆฌ์œจ $$ S = G \times e^{-G} $$ aloha์˜ ์ฒ˜๋ฆฌ์œจ $$ S = G \times e^{-2G} $$ CSMA/CD (Carrier Sense Multiple Access with Collision Detection) ์ „์†ก ํ”„๋ ˆ์ž„ ์ค€๋น„ ๋งค์ฒด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ• ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (carrier sensing) ์ „์†ก ์‹œ์ž‘ (multiple access) ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ๋‹ค๋ฉด ์ถฉ๋Œ ํƒ์ง€ ์ ˆ์ฐจ๋กœ ์ด๋™ (collision detection ์žฌ์ „์†ก ์นด์šดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํ”„๋ ˆ์ž„ ์ „์†ก ์ข…๋ฃŒ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์žผ ์‹ ํ˜ธ๋ฅผ ๋ชจ๋‘์—๊ฒŒ ์ „๋‹ฌ๋˜๋„๋ก ์ตœ์†Œ ํŒจํ‚ท ์ „์†ก ์‹œ๊ฐ„๊นŒ์ง€ ๊ณ„์† ์ „์†ก ์žฌ์ „์†ก ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค ์ž„์˜์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐ (backoff) (์ถฉ๋Œํ• ๋•Œ๋งˆ๋‹ค 2๋ฐฐ์”ฉ ์ฆ๊ฐ€) ํ˜„๋Œ€์˜ Ethernet ์Šค์œ„์น˜(์‹ ํ˜ธ๊ฐ€ ์ง€๋‚˜๋Š” ๊ธธ์„ ๋‚˜๋ˆˆ๋‹ค) ํ™˜๊ฒฝ : ์ถฉ๋ŒX Full Duplex CSMA/CD ์‚ฌ์šฉ X Carrier Sensing Nonpersistent : ๋งค์ฒด๊ฐ€ ์‚ฌ์šฉ์ค‘์ด๋ฉด, ์ž„์˜์˜ ์‹œ๊ฐ„ ํ›„ ๋‹ค์‹œ ์„ผ์‹ฑ, ์‚ฌ์šฉ์ค‘์ด์ง€ ์•Š์œผ๋ฉด ๋ฐ”๋กœ ์ „์†ก Persistent : ์„ผ์‹ฑ์„ ์ง€์†์ ์œผ๋กœ, ๋†€๊ณ ์žˆ์–ด๋„ ๋ฐ”๋กœ ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค p-persistent : pํ™•๋ฅ ๋กœ ๋ณด๋‚ด๊ธฐ (1-persistent : ๋ฐ”๋กœ ๋ณด๋‚ด๊ธฐ) CSMA/CA CSMA/CD -> ๋ฌด์„ ์—์„œ๋Š” ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค ๋™์‹œ ์†ก์ˆ˜์‹ ์€ ๋งŽ์€ ์—๋„ˆ์ง€๋ฅผ ์†Œ๋ชจ Hidden station problem ๋ฐœ์ƒ ๊ฐ€๋Šฅ (๋ฌด์„ ์—์„œ๋งŒ ๋ฐœ์ƒ) ์‹ ํ˜ธ ๊ฐ์‡„ -> ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ์–ด๋ ค์›€ CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) Idle ์ƒํƒœ์—์„œ IFS(Inter Frame Space)๋งŒํผ ๋Œ€๊ธฐ IFS ๊ธฐ๋‹ค๋ฆฐ ๋’ค์—๋„ idle ์ƒํƒœ๋ผ๋ฉด Contention Window ๋‚ด slot time๋งŒํผ ๋Œ€๊ธฐ RTS/CTS ๋„์ž… (ํ˜„์žฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„ ๋˜๋Š”์ง€ ํ™•์ธ) -> Hidden station problem ํ•ด๊ฒฐ NAV (Network Allocation Vector) ๋งค์ฒด๋ฅผ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’ -> ์ถฉ๋ŒํšŒํ”ผ๋ฅผ ๋•๋Š”๋‹ค Exposed Station Problem ๋‹ค๋ฅธ ๋…ธ๋“œ ์Œ์˜ ์ „์†ก์œผ๋กœ ์ธํ•ด ์ „์†ก์„ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ Wifi Wifi IEEE 802.11 ํ‘œ์ค€์— ๊ทผ๊ฑฐํ•œ Wireless LAN AlohaNet -> Ethernet -> Wifi ๊ตฌ์„ฑ๋ฐฉ๋ฒ• AP (Access Point) ์ด์šฉ Ad-hoc (Peer-to-Peer) ๋ฐฉ์‹ ์ธ์ฆ ๋ฐฉ์‹ : WPA, WPA2, EAP MAC ๊ธฐ์ˆ  : CSMA/CA, RTS/CTS, NAV ํ”„๋ ˆ์ž„ : IEEE 802.11 IEEE 802.11 ํ”„๋ ˆ์ž„ FC D Addr1 Addr2 Addr3 SC Addr4 Frame body CRC FC (Frame Control) Protocol version Type Subtype To DS From DS More frag Retry Pwr mgt More Data WEP Rsvd Subtype : 1011 (RTS), 1100 (CTS), 1101 (ACK) AP๊ฐ€ ๊ฐœ์ž…๋˜๋Š” ํ™˜๊ฒฝ ๋“ฑ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๊ณ ๋ ค -> ์ฃผ์†Œ ํ•„๋“œ๊ฐ€ 4๊ฐœ Wifi ์‘์šฉ ๊ธฐ์ˆ  MIMO (Multiple Input Multiple Output) : ์•ˆํ…Œ๋‚˜ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€ -> ์„ฑ๋Šฅ ์ฆ๊ฐ€ ์ „ํ™”๋ง, ์ผ€์ด๋ธ”๋ง, ๊ด‘ํ…Œ์›Œํฌ ์ „ํ™”๋ง SS7(Signaling System 7) ์ „ํ™”๋ง์˜ ์ œ์–ด๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ DSL ์ „ํ™”๋งํฌ ์ด์šฉํ•œ ๊ณ ์† ํ†ต์‹  ๊ธฐ์ˆ  ์ผ€์ด๋ธ”๋ง HFC ๊ด‘์ผ€์ด๋ธ” + ๋™์ถ•์ผ€์ด๋ธ” ๊ด‘๋„คํŠธ์›Œํฌ SONET (Synchronous Optical Network) ๊ด‘์ผ€์ด๋ธ”์„ ์ด์šฉํ•œ ๋„คํŠธ์›Œํฌ ATM (Asynchronous Transfer Mode) ๊ฐ€์ƒํšŒ์„  ์ด์šฉ ๋น„๋™๊ธฐ ํ†ต์‹  ๊ธฐ์ˆ  : ํšŒ์„  + ํŒจํ‚ท ๊ตํ™˜๋ง ๊ธฐ์ˆ  ํŒจํ‚ท(์…€) : ๊ณ ์ • 53Byte ์ด๋™ํ†ต์‹  ๋ธ”๋ฃจํˆฌ์Šค 2.4Ghz ๋ฌด์„  ์ฑ„๋„ ์‚ฌ์šฉ FHSS RTLS (Real Time Location System) : ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ์ถ”์  ์‹œ์Šคํ…œ Zigbee ์†Œํ˜•, ์ €์ „๋ ฅ ๋ฌด์„  ๋„คํŠธ์›Œํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ  ์ด๋™ํ†ต์‹ ๋ง ์ฝ”์–ด๋„คํŠธ์›Œํฌ + ์•ก์„ธ์Šค ๋„คํŠธ์›Œํฌ 3G ๋„คํŠธ์›Œํฌ GGSN (Gateway GPRS Support Node) GPRS ๋„คํŠธ์›Œํฌ์™€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ผ์šฐํ„ฐ
new ๋ฐฑ์ค€ - 11444 : ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 6 (G2)
๐Ÿง  Algorithm
1def multiply(m1, m2): 2 result = [0, 0, 0, 0] 3 result[0] = (m1[0]*m2[0] + m1[1]*m2[2]) % 1000000007 4 result[1] = (m1[0]*m2[1] + m1[1]*m2[3]) % 1000000007 5 result[2] = (m1[2]*m2[0] + m1[3]*m2[2]) % 1000000007 6 result[3] = (m1[2]*m2[1] + m1[3]*m2[3]) % 1000000007 7 return result 8 9def power(m, n): 10 if (n > 1): 11 m = power (m, n//2) 12 13 m = multiply (m, m) 14 if n % 2 == 1: 15 m = multiply(m, [1,1,1,0]) 16 return m 17 18N = int(input()) 19 20mat = power ([1,1,1,0], N) 21print (mat[1]%1000000007) ๋ฌธ์ œ n์ด ์ฃผ์–ด์งˆ ๋•Œ n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ. ์ด๋•Œ n์€ 1,000,000,000,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. TC input 1000 ouput 517691607 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ํ–‰๋ ฌ์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ์ด์šฉํ•ด์—ฌ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜์˜€๋‹ค ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค $$ \begin{bmatrix}F*{n+1} & F*{n} \\ F*{n} & F*{n-1} \ \end{bmatrix} = \begin{bmatrix}1&1 \\ 1&0 \\ \end{bmatrix} ^n$$ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ํ•œ๋ฒˆ ๋” ๊ณฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค
new ์šด์˜์ฒด์ œ - ๊ธฐ๋ง๋ฒ”์œ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
06-File-Management Directory File Directory Directory๋„ ์ผ์ข…์˜ ํŒŒ์ผ์ด๋‹ค ํ•ด๋‹น ํŒŒ์ผ FCB์˜ ์‹๋ณ„์ž๋งŒ ์ €์žฅํ•œ๋‹ค inode (index node) Unix์—์„œ๋Š” FCB์™€ inode๊ฐ€ ๊ฐ™๋‹ค ๋ชจ๋“  ํŒŒ์ผ, ํด๋”๊ฐ€ Uniqueํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. (root๋Š” 2๋กœ ๊ณ ์ •) File Systems ํŒŒํ‹ฐ์…˜์˜ ๊ตฌ์กฐ boot block, super block, FCB list, data blocks Partition Control block (Super block) blocks ๊ฐœ์ˆ˜, free data blocks ๊ฐœ์ˆ˜, free data blocks list ์ €์žฅ inode table, free inode ๊ฐœ์ˆ˜, free inode list ์ €์žฅ File Control Block (FCB) UNIX์—์„œ 128byte์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค ํŒŒ์ผ ์ด๋ฆ„, ํŒŒ์ผ ํฌ๊ธฐ, uid, gid, ํŒŒ์ผ ์ฃผ์†Œ ๋“ฑ๋“ฑ ์ €์žฅ Management of Data Blocks Contiguous Allocation ๊ฐ๊ฐ์˜ ํŒŒ์ผ์„ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ Direct Access File grow problem ์กด์žฌ External fragmentation, Internal fragmentation ๋ฐœ์ƒ Chained Allocation Direct acess File grow problem X External fragmentation X Poor data safety (์•ž ๋ธ”๋ก์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋’ค ๋ธ”๋ก๋„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ) Indexed Allocation (ํ˜„๋Œ€์— ์‚ฌ์šฉ) Direct access File grow problem X External fragmentation X Medium level data safety (index block๋งŒ ๊ดœ์ฐฎ์œผ๋ฉด ๋œ๋‹ค) Index block์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋‹ค Free-Space Management Counting N-M… N๋ฒˆ๋ถ€ํ„ฐ M๊ฐœ์˜ ๋ธ”๋ก์ด ๋น„์–ด์žˆ๋‹ค. Linked List ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก๋“ค์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. Grouping ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. Bit Vector ๋ชจ๋“  ๋ธ”๋ก๋“ค์„ ๋น„ํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. (0์ด๋ฉด ์‚ฌ์šฉ ์ค‘, 1์ด๋ฉด ๋น„์–ด์žˆ์Œ) ๋‹จ์  : ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค. File System Example (UNIX) Addresses of Data Blocks Index ๋ธ”๋ก ํ•˜๋‚˜๋Š” 4096 byte 4096 / 4 = 1024๊ฐœ์˜ ๋ธ”๋ก ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 10๊ฐœ์˜ data blocks๋Š” inode๋‚ด(direct block field)์— ์ €์žฅํ•œ๋‹ค Data Block Addressing direct block 10๊ฐœ : 40KB (10 X 4 X 2^10 bytes) single indirect block 1๊ฐœ : 4MB (4KB X 2^10 = 2^22 bytes) double indirect block 1๊ฐœ : 4GB (4KB X 2^10 X 2^10 = 2^32 bytes) triple indirect block 1๊ฐœ : 4TB File System Example (Linux) Virtual File System ์ ์šฉ Linux Inode Inode์˜ ํฌ๊ธฐ : 128 bytes (ext2, ext3), 256 bytes (ext4) Direct block 12๊ฐœ, Indirect block 3๊ฐœ 07-IO-Management-Disk-Scheduling Kernel Modules for IO Management Kernel I/O Management Device Scheduling Error handling Buffering (copy semantics๋ฅผ ์œ ์ง€) Caching : ๋น ๋ฅธ ์†๋„๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ Spooling : ๋ณด์กฐ ๊ธฐ์–ต ์žฅ์น˜์— ์ž„์‹œ๋กœ ์ €์žฅ (์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ) Interrupt handling Interrupt ์ฃผ๋ณ€ ์žฅ์น˜ -> OS : ๋น„๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ IDT (Interrupt Descriptor Table = IVT) : ์ธํ„ฐ๋ŸฝํŠธ ๋ฒˆํ˜ธ์™€ ISR์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ ISR (Interrupt Service Routine) : ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ Interrupt ์ฒ˜๋ฆฌ ๊ณผ์ • Mode change IDT์—์„œ ISR์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ ISR์—์„œ ๊ธ‰ํ•œ ์ผ ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ, ํ•„์š”ํ•˜๋ฉด ๋ฏธ๋ฃฌ๋‹ค Scheduler๊ฐ€ ํ•  ์ผ์„ ๊ฒฐ์ • Trap OS์—๊ฒŒ ๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ ์˜ˆ) div_by_zero, seg_fault, protection_fault, page_fault page fault๋งŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ ์‹œํ‚ค์ง€ ์•Š์Œ Kernel์€ Interrupt์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ System Call Process -> OS : ๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ System call ์ฒ˜๋ฆฌ Using system call table ex) int $0x80 sysenter ๋ช…๋ น I/O Control : Polling I/O Control Polling : ์ฃผ๊ธฐ์ ์œผ๋กœ I/O ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ Interrupt-driven I/O : I/O ์žฅ์น˜๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ DMA(Direct Memory Access) : CPU์˜ ๊ฐœ์ž… ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ฃผ๋ณ€์žฅ์น˜ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ „์†ก Polling Busy-wait cycle Host๊ฐ€ busy bit๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ™•์ธ Host๊ฐ€ write bit ์„ค์ •, data-out register์— ๋ฐ์ดํ„ฐ ์ €์žฅ Host๊ฐ€ command-ready bit ์„ค์ • Controller๊ฐ€ command-ready bit ์„ค์ •์„ ํ™•์ธํ•˜๋ฉด busy bit ์„ค์ • Controller๊ฐ€ control register (write command)๋ฅผ ์ฝ๊ณ , data-out register์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค I/O๊ฐ€ ๋๋‚˜๋ฉด controller๊ฐ€ command-ready bit, busy bit ํ•ด์ œ ํŠน์ง• I/O๊ฐ€ ๋นจ๋ฆฌ ๋๋‚˜๋ฉด ํšจ์œจ์ , ๋Šฆ๊ฒŒ ๋๋‚˜๋ฉด ๋น„ํšจ์œจ์  I/O Control : Interrupt I/O, DMA Interrupt-Driven I/O 1~3์€ Polling๊ณผ ๋™์ผ 4 : Process management๋ฅผ ํ†ตํ•ด Context switch 8 : IO๊ฐ€ ๋๋‚˜๋ฉด Interrupt ReQuest(IRQ)๋ฅผ cpu์—๊ฒŒ ๋ณด๋‚ธ๋‹ค ์žฅ์  : ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์•ˆ์— ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ์ˆ˜์šฉ ๊ฐ€๋Šฅ, I/O๊ฐ€ ๋А๋ฆด์ˆ˜๋ก ํšจ์œจ์  ๋‹จ์  : I/O๊ฐ€ ๋น ๋ฅด๋ฉด ๋น„ํšจ์œจ์  (์žฆ์€ Context Switch, mode change) DMA (Direct Memory Access) ๊ธฐ์กด ๋ฐฉ์‹์€ ๋ฌด์กฐ๊ฑด processor๋ฅผ ๊ฑฐ์ณ๊ฐ€์•ผํ•œ๋‹ค DMA ๋ชจ๋“ˆ์ด I/O์™€ Memory ์‚ฌ์ด ์—ญํ•  ์ˆ˜ํ–‰, ๋๋‚˜๋ฉด Interrupt ๋ฐœ์ƒ ์žฅ์  : CPU๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—… ๊ฐ€๋Šฅ, ๋น ๋ฅด๋‹ค Disk Scheduling Disk Structure Sector, Track, Cylinder Disk๋Š” logical block์˜ ๋ฐฐ์—ด์ด๋‹ค Timing of a Disk I/O Transfer Seek time : ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค Rotational delay Transfer time Disk Scheduling Policies FIFO ์š”์ฒญ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ SSTF (Shortest Seek Time First) ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์ฒญ์„ ์ฒ˜๋ฆฌ starvation ๋ฌธ์ œ ๋ฐœ์ƒ (์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ์ˆซ์ž๋งŒ ๋‚˜์˜ค๋ฉด?) SCAN (Elevator Algorithm) ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ›‘์œผ๋ฉด์„œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๋น„๊ต SSTF > SCAN > FIFO Disk Cache Main memory์— ๋ช‡๋ช‡ ์„นํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅ Replacement Policy LRU (Least Recently Used) ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์„นํ„ฐ๋ฅผ ๊ต์ฒด LFU (Least Frequently Used) ๊ฐ€์žฅ ์ ๊ฒŒ ์‚ฌ์šฉ๋œ ์„นํ„ฐ๋ฅผ ๊ต์ฒด RAID RAID Redundant Array of Inexpensive Disks : ์ €๋ ดํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋””์Šคํฌ ๋ฌถ์Œ RAID 0 (non-redundant) ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๋ถ„์‚ฐ ์ €์žฅ ์žฅ์  : ์šฉ๋Ÿ‰์ด 4๋ฐฐ ๋‹จ์  : ํ•˜๋‚˜์˜ ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์†์‹ค RAID 1 (mirrored) RAID 0์„ ๋ณต์ œ ์žฅ์  : ์‹ ๋ขฐ์„ฑ์ด ๋†’๋‹ค ๋‹จ์  : ๋””์Šคํฌ๊ฐ€ 2๋ฐฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค RAID 3 (bit-interleaved parity) ํ•œ ๋””์Šคํฌ์— parity bit๋ฅผ ์ €์žฅ (๊ฐ™์€ ์œ„์น˜์˜ bit๋“ค์˜ parity) ์žฅ์  : ํ•˜๋‚˜์˜ ๋””์Šคํฌ ๋ณต์› ๊ฐ€๋Šฅ ๋‹จ์  : ์–ด๋–ค ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค, 5๊ฐœ๋ฅผ ๋™์‹œ์— ์ฝ์–ด์„œ ๋А๋ฆผ RAID 4 (block-level parity) ํ•œ ๋””์Šคํฌ์— parity bit๋ฅผ ์ €์žฅ (๊ฐ™์€ ์œ„์น˜์˜ block๋“ค์˜ parity) ์žฅ์  : ๋ธ”๋ก ๋‹จ์œ„ -> ๋ณ‘๋ ฌ์ ์œผ๋กœ IO ๊ฐ€๋Šฅ (RAID 3๋ณด๋‹ค ๋น ๋ฆ„) ๋‹จ์  : ์–ด๋–ค ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค RAID 5 (block-level distributed parity) RAID 4์™€ ๋™์ผํ•˜๋‚˜ parity bit๋ฅผ ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๋ถ„์‚ฐ ์ €์žฅ RAID 6 (dual redundancy) RAID 5์™€ ๋™์ผํ•˜๋‚˜ parity bit๋ฅผ 2๊ฐœ ์ €์žฅ (1๊ฐœ๋Š” odd, 1๊ฐœ๋Š” even) ์žฅ์  : RAID5 ๋ณด๋‹ค ๋†’์€ ์‹ ๋ขฐ์„ฑ RAID 01, RAID 10 RAID 0๊ณผ RAID 1์„ ํ•ฉ์นœ ๊ฒƒ RAID 01 < RAID 10 08-Memory-Management Memory Management Memory Management Requirements Memory Allocation : ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น Memory Protection : ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ—ˆ์šฉ๋œ ์˜์—ญ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ Relocation : ํฉ์–ด์ง„ ์ž‘์€ ๊ณต๊ฐ„์„ ํ•ฉ์น˜๊ธฐ Sharing : ๋ถ€๋ชจ ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ฐ„ shared memory Memory Partitioning Fixed Partitioning : ๊ฐ™์€ ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ• ๋‹น ์žฅ์  : ๊ฐ„๋‹จํ•˜๋‹ค ๋‹จ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ Dynamic Partitioning : ํ”„๋กœ์„ธ์Šค ํฌ๊ธฐ์— ๋งž๊ฒŒ ํ• ๋‹น ์žฅ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ X ๋‹จ์  : ์™ธ๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ (compaction์„ ํ†ตํ•ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ but, overhead๊ฐ€ ํฌ๋‹ค) Dynamic Partition Placement Algorithm First-fit : ์ฒ˜์Œ์œผ๋กœ ๋งž๋Š” ๊ณต๊ฐ„์— ๋„ฃ๋Š”๋‹ค ์žฅ์  : ๋น ๋ฅด๋‹ค ๋‹จ์  : ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์ง€ ์•Š๋‹ค Best-fit : ๋๊นŒ์ง€ ์กฐ์‚ฌํ•ด์„œ ๊ฐ€์žฅ ๋น„์Šทํ•œ ๊ณณ์— ํ• ๋‹น ์žฅ์  : ๋А๋ฆฌ๋‹ค ๋‹จ์  : ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๋‹ค Buddy System Allocation 2^k ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์„ ํ• ๋‹น Deallocation Buddy ํ•œ ์Œ์ด ๋ชจ๋‘ free์ธ ๊ฒฝ์šฐ, ํ•ฉ์นœ๋‹ค (ํƒ์ƒ‰ Overhead๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด) ์žฅ์  : ์™ธ๋ถ€ ๋‹จํŽธํ™”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค ๋‹จ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ Virtual Address Space Type of Memory Addresses Physical address : ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ Logical address : ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณด๋Š” ์ฃผ์†Œ Virtual address : Virtaul memory์˜ Logical address Relative address (์ฃผ์†Œ ๊ณ„์‚ฐ ๋ฐฉ์‹) : ์ƒ๋Œ€์ ์ธ ์ฃผ์†Œ Virtual Address Space ํฌ๊ธฐ : 4GB (32bit ์ปดํ“จํ„ฐ) : 0x00000000 ~ 0xFFFFFFFF kernel - stack - heap - bss - data - code Address Binding Address binding instruction๊ณผ ๋ฐ์ดํ„ฐ์˜ Physical address๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ 3๊ฐ€์ง€ ์ƒํ™ฉ์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค (Compile time, Load time, Execution time) Compile time binding Compileํ• ๋•Œ, base address๋ฅผ ์•Œ๋ ค์คŒ์œผ๋กœ์จ ๋ฏธ๋ฆฌ physical address๋ฅผ ๋„ฃ์–ด๋†“๋Š”๋‹ค Logical address = Physical address ๋ฌธ์ œ์  : Relocation ๋ถˆ๊ฐ€ (base address๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค์‹œ compile ํ•ด์•ผํ•จ) Load time binding Loadํ• ๋•Œ, physical address๋ฅผ ๊ณ„์‚ฐ Logical address = Physical address ๋ฌธ์ œ์  : Relocation ๋ถˆ๊ฐ€ Execution time binding ์‹คํ–‰ํ•  ๋•Œ, physical address๋ฅผ ๊ณ„์‚ฐ Logical address != Physical address Relocation ์ผ์–ด๋‚˜๋Š” ์ด์œ  : Swapping, Compaction Hardware for Execution Time Binding Base register : ์‹œ์ž‘ ์ฃผ์†Œ Bounds register (limit register) : ๋ ์ฃผ์†Œ Adder๊ฐ€ Base Register + releative address ๊ณ„์‚ฐ Comparato๊ฐ€ Bounds Register์™€ ๋น„๊ต ์˜์—ญ ๋ฐ–์ธ ๊ฒฝ์šฐ Segementation Fault(Trap) ๋ฐœ์ƒ Paging Paging ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆˆ๋‹ค page size = frame size = disk block size = 4KB Internal fragmentation ๋ฐœ์ƒ (๋ฌด์‹œ ๊ฐ€๋Šฅ) Page Table PCB์— ์ €์žฅ ๋˜์–ด์„œ ๊ด€๋ฆฌ Virtual Memory ์‚ฌ์šฉ ์‹œ N๊ณผ frame number๊ฐ€ ์„ž์—ฌ์„œ ์กด์žฌ Page number and offset Logical address = Page number + offset Page size 16 Bytes (128bit), 8 bit address์ธ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์ฃผ์†Œ ๊ฐœ์ˆ˜ = 128 / 8 = 16๊ฐœ offset = 4bit (2 ^ 4 = 16) page number = 8 - 4 = 4bit (๋‚จ๋Š” ๊ฑฐ) Address translation in Paging Logical address -> Physical address offset์€ ๊ทธ๋Œ€๋กœ, page ๋ฒˆํ˜ธ๋งŒ frame ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊พผ๋‹ค Segmentation ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„์ธ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค Dynamic partitioning๊ณผ ์œ ์‚ฌ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋น„์Šทํ•œ ๊ฒƒ๋“ค์„ ๋ฌถ๋Š”๋‹ค. 09-Virtual-Memory Advantages of Virtual Memory Virtual Memory ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค ๋” ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ์ˆ˜์šฉ ๊ฐ€๋Šฅ -> swap ๋นˆ๋„ ๊ฐ์†Œ, ์ข‹์€ ๋ฐ˜์‘์„ฑ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ณด๋‹ค ํฐ ํ”„๋กœ์„ธ์Šค๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ Types of Memory Real Memory address : Real address, Physical address, Absolute address Virtual Memory address : Logical address, Virtual address Execution of a Program Resident set : Main memory์— ์กด์žฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ง‘ํ•ฉ Main Memory์— ์—†๋Š” Page๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ -> Page fault (interrupt) ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค block -> ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ -> Disk I/O ๋๋‚˜๋ฉด ๋‹ค์‹œ ready Principle of Locality ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ฐ์ดํ„ฐ ์ฐธ์กฐ๋Š” ๋ญ‰์นœ๋‹ค๋Š” ์„ฑ์งˆ Virtual Memory๊ฐ€ ํšจ์œจ์ ์ธ ์ด์œ  ์ค‘ ํ•œ ๊ฐ€์ง€ Demand paging Demand paging Virtual Memory์˜ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ• Demand paging Demand segmentation : ๋А๋ ค์„œ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค Address Translation in demand paging Page table base register์— page table ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์ €์žฅ ๋งค๋ฒˆ 2๋ฒˆ์”ฉ Main memory๋ฅผ accessํ•  ํ•„์š” ์—†์Œ Page Table Entry P M R U W COW page frame number (p`) P : present(valid) bit : Main memory์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€ M : modified bit : ํŽ˜์ด์ง€๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ R : referenced bit : ํŽ˜์ด์ง€๋ฅผ ์ ‘๊ทผํ•œ์  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ U : user mode : User context์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์—ฌ๋ถ€ W : writable : ํŽ˜์ด์ง€๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€ COW : copy-on-write : ํŽ˜์ด์ง€๋ฅผ ๋ถ€๋ชจ๋ž‘ ๊ณต์œ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ Modify Bit in page table M bit๊ฐ€ 0์ด๋ฉด ๋””์Šคํฌ์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  ์‚ญ์ œ ๊ฐ€๋Šฅ Sharing of Pages ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•ด์•ผํ•  ๋•Œ, Page table์— ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ €์žฅ Multi-level Page Table Size of Page tabbles ํฐ ํ”„๋กœ์„ธ์Šค๋Š” 1๊ฐœ์˜ page table๋กœ ์ฒ˜๋ฆฌ๋ถˆ๊ฐ€ -> Multi-level apge table Two-Level Scheme for 32-bit address 1๊ฐœ์˜ Page Table์ด ์ˆ˜์šฉํ•˜๋Š” ํŽ˜์ด์ง€์ˆ˜๋Š” = 1K๊ฐœ 4GB User address space = 1M๊ฐœ์˜ ํŽ˜์ด์ง€ -> ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์ด ๋” ํ•„์š” Two-Level Paging Example Page number๊ฐ€ 2๊ฐœ ์กด์žฌ page number1 : 10bit page number2 : 10bit page offset : 12bit Addres-Translation Scheme Page ํฌ๊ธฐ 4096B / Page tableํฌ๊ธฐ 4B = 1024 -> page number์˜ ๊ฐœ์ˆ˜ = 10bit (2^10=1024) ํŽ˜์ด์ง€์˜ ํฌ๊ธฐ 4096B์ด๊ธฐ ๋•Œ๋ฌธ์— -> Offset bit = 12bit (2^12=4096) Translation Lookaside Buffer Translation Lookaside Buffer ๊ณ„์ธต์ด ๋งŽ์•„์ง€๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค TLB์— accessํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ TLB๋Š” ๋ณ‘๋ ฌ๋กœ ํƒ์ƒ‰, O(1)๋กœ ํƒ์ƒ‰๊ฐ€๋Šฅ TLB ํ™•์ธ -> ์—†์œผ๋ฉด Page table ํ™•์ธ -> ์—†์œผ๋ฉด Page fault Effective Access Time Memory cycle = 1์ด๋ผ๊ณ  ๊ฐ€์ • TLB ์ฝ๋Š” ์‹œ๊ฐ„ = $\varepsilon$ TLB hit ratio = $\alpha$ EAT = TLB์— ์žˆ์„ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ + ์—†์„๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ $$ EAT = (\varepsilon+1)\alpha + (\varepsilon+1+1)(1-\alpha) = 2+\varepsilon-\alpha $$ Page Replacement Replacement Policy Main Memory๊ฐ€ ๊ฝ‰์ฐจ๋ฉด page๋ฅผ swap out ์‹œ์ผœ์•ผํ•œ๋‹ค Basic Replacement Algorithms FIFO ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋น„ํšจ์œจ์  Optimal policy ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋  ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋‚˜์ค‘์— ์–ด๋–ค page๊ฐ€ ํ•„์š”ํ• ์ง€ ์•„๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๊ฐ€๋Šฅ Least Recently Used (LRU) ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์‚ฌ์šฉ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ธ์ œ ์“ฐ์˜€๋Š”์ง€ ํ•ญ์ƒ ์ฐพ์•„์•ผ ํ•œ๋‹ค -> Overhead ๋ฐœ์ƒ Clock Policy (Second change algorithm) ๋Œ์•„๊ฐ€๋ฉด์„œ user bit -= 1 user == 0์ด๋ฉด ๊ต์ฒด ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด user ๋น„ํŠธ = 1 ์„ฑ๋Šฅ ๋น„๊ต FIFO < Clock < LRU < OPT Enhanced Clock Policy U๋น„ํŠธ์™€ M๋น„ํŠธ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ U = 0, M = 0 U = 0, M = 1 U = 1, M = 0 U = 1, M = 1 Performance of Demand Paging Page Fault Rate = page fault ํšŸ์ˆ˜ / page ๋ถˆ๋Ÿฌ์˜ค๋Š” ํšŸ์ˆ˜ Effective Access Time(EAT) = (1-p) x memory access + p x (page fault overhead + swap page out + swap page in + restart overhead)
new ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ฐœ์š” ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์ด ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ผ๊ณ  ํ•œ๋‹ค cpu์นฉ์…‹์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊ฐ€ ๋ฐ”๋€๋‹ค ๊ณ ๊ธ‰์–ธ์–ด ๊ณ ๊ธ‰์–ธ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(Compiler)๋ผ๊ณ  ํ•œ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ •ํ™•ํ•œ ์ •์˜ ์–ด๋–ค ์–ธ์–ด๋กœ ์“ฐ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์€ ์—ญํ• ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ 1952๋…„ ๊ทธ๋ ˆ์ด์Šค ํ˜ธํผ(Grace Hopper)๊ฐ€ UNIVAC์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด A-0 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ œ์ž‘ ์ปดํŒŒ์ผ๋Ÿฌ vs ์ธํ„ฐํ”„๋ฆฌํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ๊ณผ์ • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ • Lexical analysis (์–ดํœ˜ ๋ถ„์„) token์„ ์ƒ์„ฑํ•˜๋Š”์ผ, token์€ ์–ดํœ˜์˜ ์ตœ์†Œ ๋‹จ์œ„ Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค (์ฃผ๋กœ ํŠธ๋ฆฌํ˜•ํƒœ) Semantic analysis (์˜๋ฏธ ๋ถ„์„) type checking Intermediate code generation (์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ) ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ Code optimization (์ฝ”๋“œ ์ตœ์ ํ™”) ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ™˜ Code generation (์ฝ”๋“œ ์ƒ์„ฑ) ๋ชฉ์  ์ฝ”๋“œ ์ƒ์„ฑ Lexical analysis (์–ดํœ˜ ๋ถ„์„) token : ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜๋ฏธ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„ FSA (Finite State Automata, ์œ ํ•œ ์ƒํƒœ ์˜คํ† ๋งˆํƒ€) token์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹œ์ž‘ ์ƒํƒœ ํ•œ ๊ฐœ์™€ ๋ ์ƒํƒœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ€์ง DFA (Deterministic Finite Automata) FSA์˜ ํ•œ ์ข…๋ฅ˜ ๊ฐ ์ƒํƒœ์—์„œ ๋ป—์–ด๋‚˜๊ฐ€๋Š” edge๊ฐ€ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌ ฮต๊ฐ€ ๋ถ™์€ edge ์—†์Œ ๋ถ„์„ํ•œ ํ† ํฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• Lexeme = <ํ† ํฐ๋ฒˆํ˜ธ, ํ† ํฐ ๊ฐ’> ์˜ˆ์‹œ if X < Y … (29, 0) (1, X) (18, 0) (1, Y) … ์‹๋ณ„์ž์˜ ํ† ํฐ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ, ์ƒ์ˆ˜๋Š” 2๋ฒˆ ๋“ฑ์œผ๋กœ ๊ณ ์ • Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, parse tree๋ฅผ ๋งŒ๋“ ๋‹ค CFG (Context Free Grammer) ๊ตฌ๋ฌธ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• G = (N, T, P, S) N = nonterminal symbol ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ T = terminal symbol (token) ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž+์ˆซ์ž, ์—ฐ์‚ฐ์ž, ๊ตฌ๋ถ„์ž, ํ‚ค์›Œ๋“œ ๋“ฑ P = production rule ์˜ˆ) S -> T+T, T -> ‘0’|‘1’|‘2’ S = start symbol L(G) : ์ด ๋ฌธ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์–ธ์–ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ CFG ํ‘œํ˜„๋ฒ• BNF (Backus-Naur Form) EBNF (Extended BNF) ์œ ๋„ (derivation) ์ƒ์„ฑ ๊ทœ์น™๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์žฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ์œ ๋„๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ์„œ ๋ฐ”๊ฟˆ ์œ ๋„ ํŠธ๋ฆฌ : ์œ ๋„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ƒํ™” ์‹œ์ผœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ขŒ์ธก ์œ ๋„(leftmost derivation) ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ์šฐ์ธก ์œ ๋„(rightmost derivation) ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ๋ชจํ˜ธ์„ฑ (ambiguity) ๋ฌธ๋ฒ• G์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์–ด๋–ค ๋ฌธ์žฅ์ด ๋‘๊ฐœ ์ด์ƒ์˜ ์œ ๋„ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด ๋ฌธ๋ฒ• G๋Š” ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•์€ ์ขŒ์ธก ์œ ๋„์™€ ์šฐ์ธก ์œ ๋„๊ฐ€ ๊ฐ™๋‹ค ๋ชจํ˜ธ์„ฑ ํ•ด๊ฒฐ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋„์ž… ๊ฒฐํ•ฉ ๋ฒ•์น™ ๋„์ž… Left Recursion์€ ์ขŒ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> A+a | a Right Recursion์€ ์šฐ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> a+A | a ๊ตฌ๋ฌธ ๋ถ„์„์˜ 2๊ฐ€์ง€ ๋ฐฉ์‹ top-down, bottom-up Top-down parsing Top-down ๋ฐฉ์‹ ์ขŒ์ธก ์œ ๋„์™€ ๊ฐ™์€ ์ˆœ์„ ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ backtracking : ์œ ๋„๋œ ๋ฌธ์ž์—ด๊ณผ ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ƒ์„ฑ๊ทœ์น™ ์ ์šฉ Bottom-up ๋ฐฉ์‹ ์šฐ์ธก ์œ ๋„์˜ ์—ญ์ˆœ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ LL ํŒŒ์‹ฑ ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์–ด์„œ ์ขŒํŒŒ์Šค ์ƒ์„ฑ backtracking X, ๋น ๋ฅด๋‹ค ๊ฒฐ์ •์ ์œผ๋กœ ํŒŒ์‹ฑ ์‚ฌ์šฉ๋œ ์ •์˜ ฮต-์ƒ์„ฑ๊ทœ์น™ Nonterminal A๊ฐ€ ฮต๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด A๋ฅผ nullableํ•˜๋‹ค๊ณ  ๋ถ€๋ฅธ๋‹ค lhs, rhs A->XXX์—์„œ lhs๋Š” A, rhs๋Š” XXX โŠ• (Ring Sum) A์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, AโŠ•B = (A์—์„œ ฮต๋นผ๊ณ  A ํ•ฉ์ง‘ํ•ฉ B) A์— ฮต๊ฐ€ ์—†์œผ๋ฉด, AโŠ•B = A First nonterminal A๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋˜์–ด ์ฒซ๋ฒˆ์งธ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” terminal์˜ ์ง‘ํ•ฉ X->Y1Y2Y3์ผ๋•Œ, FIRST(X) = FIRST(X) U FIRST(Y1) โŠ• FIRST(Y2) โŠ• FIRST(Y3) Follow A ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” terminal์˜ ์ง‘ํ•ฉ A->ฮฑBฮฒ, ฮฒ != ฮต ์ผ๋•Œ, FOLLOW(B) = FOLLOW(B) U (FIRST(ฮฒ)-{ฮต}) A->ฮฑB ๋˜๋Š” A->ฮฑBฮฒ, FIRST(ฮฒ)์— ฮต๊ฐ€ ์†ํ•  ๋•Œ, FOLLOW(B) = FOLLOW(B) U FOLLOW(A) LL์กฐ๊ฑด FIRST(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค FIRST(ฮฑ)์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, FOLLOW(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ๋ฒ• = LL ํŒŒ์‹ฑ ๋˜๋Š” ๋ฌธ๋ฒ• LL(1) ๋ฌธ๋ฒ• ์ž„์˜์˜ ๋ฌธ๋ฒ•์— ๋Œ€ํ•˜์—ฌ LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” CFG 1 : LOOKAHEAD๊ฐ€ 1๊ฐœ๋ผ๋Š” ์˜๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ LL(1)๋ฌธ๋ฒ•์ด ๋˜์ง€ ์•Š๋Š”๋‹ค ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ• ์šฐ์„ ์ˆœ์œ„ ์ฃผ๊ธฐ, ๊ฒฐํ•ฉ๋ฒ•์น™ ๋ฐ˜์˜์œผ๋กœ ํ•ด๊ฒฐ left-factoring์ด ๋˜๋Š” ๊ฒฝ์šฐ ๊ณตํ†ต ์•ž๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด nonterminal๋กœ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐ left-recursiveํ•œ ๊ฒฝ์šฐ ์ง์ ‘ recursion : A -> Aฮต ์ธ๊ฒฝ์šฐ ๊ฐ„์ ‘ recursion : A -> B, B -> A ์ธ๊ฒฝ์šฐ LOOKAHEAD ์–ด๋–ค ๊ทœ์น™์ด ์ ์šฉ๋˜์—ˆ์„๋•Œ ๋งจ ์ฒ˜์Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” terminal ์ง‘ํ•ฉ A->X1X2X3์ผ๋•Œ, LOOKAHEAD(A) = FIRST(X1) โŠ• FIRST(X2) … โŠ• FOLLOW(A) Strong LL(1) LL(1)๊ณผ ํ•ญ์ƒ ๋™์ผ (1์ด ์•„๋‹๋•Œ๋Š” ๋‹ค๋ฆ„) LOOKAHEAD(A->ฮฑ)์™€ LOOKAHEAD(A->ฮฒ)๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ• LL(1) ํŒŒ์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• Recursive descent parser ์žฅ์  : ์ง๊ด€์  ์‰ฝ๋‹ค ๋‹จ์  : ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค Predictive parser PDA(PushDown Automata)์— ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”๋งŒ ์ˆ˜์ • ํŒŒ์‹ฑํ…Œ์ด๋ธ” ์˜ˆ์‹œ (?์—๋Š” ๊ทœ์น™๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค) a b S ? ? A ? ? ํŒŒ์‹ฑํ…Œ์ด๋ธ”์— ๋‘๊ฐœ ์ด์ƒ์˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ -> NOT LL(1) Stack์˜ ์˜ˆ์‹œ Bottom-up parsing left-recursive ๋ฌธ๋ฒ•๋„ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ LL(k) ์ขŒ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Top-down parsing, recursive descent parsing, predictive parsing, LL parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ pre-roder๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ LR(k) ์šฐ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Bottom-up parsing, shift-reduce parsing, LR parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ post-order๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ Reduce S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ A๋กœ ๋Œ€์น˜ํ•˜๋Š” ๊ฒƒ : S=>ฮฑAฯ‰ ์‹œ์ž‘ symbol์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ reduce ํ•œ๋‹ค Handle S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ ฮฑฮฒฯ‰์˜ handle์ด๋ผ๊ณ  ํ•œ๋‹ค ๋‘ ๊ฐœ ์ด์ƒ์˜ handle์ด ์กด์žฌํ• ๋•Œ -> ๋ชจํ˜ธํ•˜๋‹ค Shift์™€ Reduce๋กœ Parsing ํ•˜๊ธฐ Stack์˜ ์˜ˆ์‹œ Issue Shift์™€ Reduce ์ค‘ ์–ด๋А ๊ฒƒ์„ ํ• ๊นŒ? Stack์˜ top์—์„œ ์–ผ๋งˆ๋งŒํผ์„ handle๋กœ ๋ณผ ๊ฒƒ์ธ๊ฐ€? ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: LR Parsing Table YACC LALR ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ foo.y –(yacc)–> y.tab.c –(gcc)–> a.out *.y ํŒŒ์ผ ๊ตฌ์กฐ 1<์„ ์–ธ๋ถ€> 2... 3%% 4... 5exp : exp '+' term; 6factor : ident; 7... 8%% 9<์—ฌ๋Ÿฌ ํ•จ์ˆ˜> ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ•์œผ๋กœ LR Conflict ๋ฐœ์ƒ ์‹œ ์„ ์–ธ๋ถ€์—์„œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐ LR Parsing Table Action table : Action + Parser ์ƒํƒœ Goto table : Parser ์ƒํƒœ LR(0) ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ LR(0) ์•„์ดํ…œ rhs์— ์ (’.’) symbol์„ ๊ฐ€์ง„ ์ƒ์„ฑ ๊ทœ์น™ ex) A->ฮฑ.ฮฒ, A->. closure ์ (’.’)๋’ค์— non-terminal์ด ์˜ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ์ถ”๊ฐ€ S’ -> S, S -> (L)|id, L -> S | L,S closure({[S’->.S]}) = {[S’->.S], [S->.(L)], [S->.id]} goto goto(I, X)์ด๋ฉด ์ ์„ X๋’ค๋กœ ์˜ฎ๊ธฐ๊ณ  closure๋ฅผ ์ทจํ•œ๋‹ค X๊ฐ€ ์—†์œผ๋ฉด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค I={[G->E=E], [E->E.+T]} ์ผ๋•Œ, goto(I, +) = closure({E->E+.T}) : ์ ์„ +๋’ค๋กœ ์˜ฎ๊น€ C0 ์ƒ์„ฑ๊ทœ์น™ S’->S์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ closure์™€ goto๋ฅผ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๋ชจ๋“  ํƒ€๋‹นํ•œ LR(0)์˜ ์•„์ดํ…œ ์ง‘ํ•ฉ๋“ค Item์˜ ์ข…๋ฅ˜ [A->X.Y] : X!=ฮต์ผ๋•Œ kernel item [A->.X] : closure item [A->X.] : reduce item SLR ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ reduce Item์ด [X->ฮฑ.]์ผ๋•Œ, FOLLOW(X)์˜ ๋ชจ๋“  terminal์—๋งŒ reduce action์„ ๋„ฃ๋Š”๋‹ค ๋‚˜๋จธ์ง€๋Š” LR(0)๊ณผ ๋˜‘๊ฐ™๋‹ค LR(0)๋ณด๋‹ค conflict๊ฐ€ ์ ์–ด, ๋” ์ •๊ตํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. LALR Parsing ์ •๊ตํ•œ ์ˆœ์„œ LR(0) < SLR < LALR(1) < LR(1) ํŒŒ์„œ ์ƒํƒœ์˜ ๊ฐœ์ˆ˜ SLR = LALR « LR(1) SDD, AST SDD (Syntax Directed Definition) SDD : semnatic action์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๋ช…์„ธ์„œ Semnatic Actions : ๊ทœ์น™์— ๋Œ€ํ•œ Action Yacc/Bison : $$, $1, $2, ... ์‚ฌ์šฉ ANTLR : $<name> ์‚ฌ์šฉ Type declaration Attribute ์ข…๋ฅ˜ synthesized attr. : children์— ์˜ํ•ด ๊ณ„์‚ฐ (terminal) inherited attr. : parent, sibling์— ์˜ํ•ด ๊ณ„์‚ฐ AST (Abstract Syntax Tree) ํŒŒ์ŠคํŠธ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ AST๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ํŒŒ์‹ฑ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค๊ธฐ : LL, LR ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งŒ๋“ค๊ธฐ : SDD ์‚ฌ์šฉ (Yacc etc.) evaluation : ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ž‘์—…ํ•˜๋Š” ํ–‰์œ„ On-the-fly evaluation S-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” SDD L-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ + ๊ฐ’์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ˜๋Ÿฌ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ IR (Intermediate Representation) IR์ด๋ž€? Tree๋‚˜ Instruction list ํ˜•ํƒœ instruction(node)๊ฐ€ ์ ์–ด์•ผ ์ตœ์ ํ™”/๋ฒˆ์—ญ์— ์ข‹์Œ High Level IR High์™€ Low๋Š” ์ƒ๋Œ€์ ์ธ ๊ฐœ๋… High level IR: ์—ฌ๊ธฐ์„œ๋Š” AST์˜ ๋ณ€ํ˜•๋งŒ ์ƒ๊ฐ ์ข…๋ฅ˜ : AST, TCOL Low Level IR ๋‹จ์ˆœํ•œ instruction์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€์ƒ๊ธฐ๊ณ„(์ฃผ๋กœ RISC)๋ฅผ emulate N-tuple ํ‘œ๊ธฐ๋ฒ• (3-address code) a = b OP c ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๊ณ„์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ํ”ผ์—ฐ์‚ฐ์ž ๊ฐœ์ˆ˜ <= 3 quadruple : (์—ฐ์‚ฐ์ž, ํ”ผ์—ฐ์‚ฐ์ž1, ํ”ผ์—ฐ์‚ฐ์ž2, ๊ฒฐ๊ณผ) Stack machine code Java byte code, U-code : AST๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ์ด ์šฉ์ด Tree ํ‘œํ˜„ ๊ธฐ๊ณ„์–ด ์ƒ์„ฑ ์šฉ์ด IR ์˜ˆ์‹œ GCC - GIMPLE (3-address code) GCC์˜ ์ค‘๊ฐ„์ฝ”๋“œ : GENERIC -> GIMPLE -> RTL 1D.1954 = x*10 // D.1954๋Š” ์ž„์‹œ๋ณ€์ˆ˜ 2gimple_assign <mult_exprt, D.1954, x, 10> LLVM - bit (3-address code) LLVM IR : ์–ธ์–ด์™€ ๋จธ์‹ ์— ๋…๋ฆฝ์  1@var = global i32 14 ; ์ „์—ญ๋ณ€์ˆ˜ var์— 14 ๋Œ€์ž… 2define i32 @main() nounwind { ; i32(int) ๋ฐ˜ํ™˜ํ˜• 3 entry: 4 %a = alloca i32, align 4 ; ์ง€์—ญ๋ณ€์ˆ˜ a ์„ ์–ธ, int ํ• ๋‹น 5 %1 = load i32 * @var ; %1 ์ž„์‹œ๋ณ€์ˆ˜์— var๊ฐ’ ๋Œ€์ž… 6 ret i32 %1 ; ์ž„์‹œ๋ณ€์ˆ˜ ๊ฐ’ ๋ฐ˜ํ™˜ 7} JVM - byte code (stack machine code) ๊ฐ€์ƒ ๊ธฐ๊ณ„ ์ฝ”๋“œ (Bytecode, MSIL) ๊ฐ€์ƒ ๊ธฐ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•จ ์ด์‹์„ฑ, ํ˜ธํ™˜์„ฑ์ด ๋ชฉ์  : java bytecode๋Š” machine ํ˜ธํ™˜์„ฑ, c# msil์€ language ํ˜ธํ™˜์„ฑ 1public Employee(String strName, int num) 2{name = strName; idNumber = num; storeData(strName, num);} 3Method Employee(java.lang.String, int) 4 50 aload_0 ; 0๋ฒˆ์งธ ๋กœ์ปฌ๋ณ€์ˆ˜(this)๋ฅผ ์Šคํƒ์— push 61 invokespecial #3 <Method java.lang.Object()> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 7--- 84 aload_0 95 aload_1 ; strName์„ ์Šคํƒ์— push 106 putfield #5 <Field java.lang.String name> ; name์— strName ๋Œ€์ž… 11--- 129 aload_0 1310 iload_2 ; num์„ ์Šคํƒ์— push 1411 putfield #7 <Field int idNumber> ; idNumber์— num ๋Œ€์ž… 15--- 1614 aload_0 1715 aload_1 ; strName์„ ์Šคํƒ์— push 1816 iload_2 ; num์„ ์Šคํƒ์— push 1917 invokespecial #9 <Method void storeData(java.lang.String, int)> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 2020 return line number : ๋ช…๋ น์ด ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ฃผ์†Œ aload : ๊ฐ์ฒด๋ฅผ push, iload : ์ •์ˆ˜๋ฅผ push ์›๋ž˜๋Š” aload๊ฐ€ ๋ช…๋ น, ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น aload 0์„ ๋ฌถ์–ด์„œ bind -> aload_0 CIL (Common Intermediate Language) (stack machine code) C#, VB.NET, J# ๋“ฑ์—์„œ ์‚ฌ์šฉ MSIL์€ ์˜›๋‚  ์ด๋ฆ„ 1.assembly Hello {} ; .assembly: ์–ด์…ˆ๋ธ”๋ฆฌ ์„ ์–ธ 2.assembly extern mscorlib {} 3.method static void Main() { 4 .entrypoint 5 .maxstack 1 6 ldstr "Hello, world!" ; stack์— ์ €์žฅ 7 call void [mscorlib]System.Console::WriteLine(string) 8 ret 9} GCC RTL(Register Transfer Language) (Tree๊ตฌ์กฐ ์ฝ”๋“œ) Lisp S-expression ์‚ฌ์šฉ 1(set (reg:SI 140) 2 (plus:SI (reg:SI 138) 3 (reg:SI 139))) => reg140 = reg138+reg139 IR generation 3-address Translation ๊ทœ์น™ Binary operations: t = [[el OP e2]] Unary operations: t = [[OP el]] Array access: t = [[ v[e] ]] Structure access: t = [[ v.f ]] Short-circuit OR: t = [[ el SC-OR e2]] Statement sequence: [[s1; s2; ...; sN]] Variable assignment: [[ v = e ]] Array assignment: [[ v[e1] = e2 ]] If: [[ if(e) then s ]], [[ if(e) then s1 else s2]] While: [[ while (e) s ]] Switch: [[ switch (e) case v1:s1, ..., case vN:sN ]] Function Call: [[ call f(e1, e2, ..., eN) ]] Fucntion Return: [[ return e ]] Statement Expression Statement๋„ expression ์ฒ˜๋Ÿผ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ™•์žฅ t = [[ S ]]๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜์ž Nested Expressions t = [[ (a - b) * (c + d) ]] t = [[ if c then if d then a = b ]] ๊ฐ€์žฅ ํฐ ๋ฉ์–ด๋ฆฌ๋ถ€ํ„ฐ ๋ฐ”๊พผ๋‹ค Storage Management 2๊ฐ€์ง€ Storage Register : ๋น ๋ฅธ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€ Memory : ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ 2๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ All memory approach ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ memory์— ์ €์žฅ, ๊ฐ€๋Šฅํ•œ๊ฒƒ๋งŒ register Standard approach Global, Statics, Local(composite)๋Š” memory์— ์ €์žฅ Local(scalar)๋Š” memory ๋˜๋Š” virtual register์— ์ €์žฅ Memory์˜ 4๋Œ€ ์˜์—ญ Code space : ๋ช…๋ น์–ด๋ฅผ ์ €์žฅ read-only์ผ๋•Œ ๋น ๋ฆ„ Static data : ํ”„๋กœ๊ทธ๋žจ๊ณผ lifetime์„ ํ•จ๊ป˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ Stack : Local ๋ณ€์ˆ˜๋“ค Heap : ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ File Format Windows : PE (Portable Executable) Unix : ELF (Executable and Linkable Format) ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ environment : <๋ณ€์ˆ˜, storage location> ์ •๋ณด state: <๋ณ€์ˆ˜, ๊ฐ’> ์ •๋ณด ์–ด๋–ค ๋ณ€์ˆ˜ N์ด storage location S์— ์ง€์ •๋˜๋ฉด ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค Static Allocation ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” location์œผ๋กœ ๋ฐ”์ธ๋”ฉ Heap Allocation ์—ฐ์†์ ์ธ global ์˜์—ญ์˜ ์ผ๋ถ€๋ฅผ OS๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฒƒ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘ ์š”์ฒญ๊ณผ ๋ฐ˜ํ™˜ Stack Management Run-time stack : ํ•œ ํ•จ์ˆ˜ call๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ๋‘๋Š” frames Activation record : ํ•จ์ˆ˜ ์ˆ˜ํ–‰์„ ์œ„ํ•œ execution env(local var, parameter, return address, etc.) Top frame : ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ํ•จ์ˆ˜์˜ frame Stack pointers SP : Frame top FP : Frame base ๋‘ ๊ฐœ๋ฅผ ์“ฐ๋Š” ์ด์œ  ๊ฐ€๊นŒ์šด ๊ฑฐ ๊ธฐ์ค€์œผ๋กœ offset ๊ณ„์‚ฐ -> small offset ์œ ์ง€ ์ˆ˜ํ–‰ ์ค‘ top frame์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ Semantic Analysis - Symbol Tables Scope Identifier: ์‹๋ณ„์ž Lexical Scope: ํŠน์ • ๋ฒ”์œ„ ์‹๋ณ„์ž์˜ Scope: ๊ทธ ์‹๋ณ„์ž์˜ ์„ ์–ธ์ด ์ฐธ์กฐ๋˜๋Š” lexical scope Symbol Table Name Kind Type Attribute foo func int, int -> int extern m arg int tmp var char const ํ•˜๋‚˜์˜ lexical๋งˆ๋‹ค ํ•˜๋‚˜์˜ symbol table symbol table์€ ๊ณ„์ธต์ ์ด๋‹ค ํ˜„์žฌ scope์— ์—†์œผ๋ฉด ์ƒ์œ„ scope๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ฐพ๋Š”๋‹ค Symbol Table Implementation AST๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ๊ฐ€๋Šฅ Local Table์€ hash table ์‚ฌ์šฉ Global Table์€ N-array tree ๊ตฌ์กฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๋งŒ๋“ฌ (scope ์Šคํƒ์„ ์‚ฌ์šฉ) Type Checking Type Expressions Array types: T[], T[10] Structure types : {id1: T1, id2: T2 …} Pointer types: T* Function types: T1 X T2 X … X Tn -> T_return Type Judgement A โ”œ E : T A ์ƒํ™ฉ์—์„œ E๋Š” Tํƒ€์ž…์„ ๋งŒ์กฑํ•œ๋‹ค A โ”œ if(E) S1 else S2 : T ์œ„ ์กฐ๊ฑด์€ ๋ชจ๋“  E, S1, S2, A, T์— ๋Œ€ํ•œ ๊ฐ€์ •์ด ์„ฑ๋ฆฝํ•  ๋•Œ ๊ฒฐ๋ก  T๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค Proof Tree (ํƒ€์ž… ์œ ๋„ ํŠธ๋ฆฌ) ์—ญ์‚ผ๊ฐํ˜• ๋ชจ์–‘ ๋งŒ์กฑํ•˜๋Š” proof tree๊ฐ€ ์žˆ๋‹ค -> ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค ๊ทธ ์™ธ Semantic Analyses break, continue, goto ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ง€ ๋“ฑ ์ปดํŒŒ์ผ๋Ÿฌ ํ›„๋ฐ˜๋ถ€ (๋น ๋ฅด๊ณ , ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ) Instruction Selection Tree ๊ธฐ๋ฐ˜ Intermediate Representation MEM(e) : ์ฃผ์†Œ e๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•œ word์˜ ๋‚ด์šฉ TEMP(t) : ๋ ˆ์ง€์Šคํ„ฐ t SEQ(s1, s2): ๋ฌธ์žฅ s1 ์ˆ˜ํ–‰ ํ›„ s2 ์ˆ˜ํ–‰ ESEQ(s, e): ๋ฌธ์žฅ s ์ˆ˜ํ–‰ ํ›„ (๊ฒฐ๊ณผ ์—†์Œ) e๊ฐ€ ์ถ”๊ฐ€ ์ˆ˜ํ–‰ BINOP(o, e1, e2) : ์—ฐ์‚ฐ์ž o, ํ”ผ์—ฐ์‚ฐ์ž e1, e2, ๊ฒฐ๊ณผ ์ €์žฅ๋œ ์ฃผ์†Œ ๋ฐ˜ํ™˜ const(i): ์ •์ˆ˜ ์ƒ์ˆ˜ i Register Allocation ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ Register์— ์ €์žฅ Interference ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ definition์ด live range ์—์„œ ๊ณตํ†ต operation์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ Interference Graph : ์„œ๋กœ interfere ํ•˜๋ฉด ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„ Graph coloring : ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ์น ํ•˜๊ธฐ Instruction Scheduling instruction์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด stall ๊ฐœ์ˆ˜ ๋“ฑ์„ ์ค„์—ฌ์„œ ์ˆ˜ํ–‰์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ stall : ๋‹ค๋ฅธ ๋ช…๋ น์–ด ์ˆ˜ํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ CPU๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ ๋ชฉํ‘œ Wasting time์„ ์ค„์ธ๋‹ค ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค register spilling์„ ํ”ผํ•ด์•ผํ•œ๋‹ค Static scheduling ๋‹จ๊ณ„ Local basic scheduling, Loop scheduling, global scheduling Local basic scheduling List scheduling : greedy, heuristic, local technique ์‚ฌ์šฉ precedence graph๋ฅผ ๋งŒ๋“ ๋‹ค ๊ฐ ๋…ธ๋“œ์— priority function์„ ์ ์šฉํ•œ๋‹ค “ready-operation queue"๋ฅผ ์—์„œ ready operation์„ ํ•˜๋‚˜ ์„ ํƒ ํ›„ scheduling, ready operation queue๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Longest latency-weighted path๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค ๊ธฐํƒ€ Optimization ๋ฐฉ๋ฒ• addr r1 1 -> inc r1 ํŠน์ˆ˜ ์„ฑ์งˆ์˜ ๋ ˆ์ง€์Šคํ„ฐ ํ™œ์šฉ ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ช…๋ น์–ด ํ™œ์šฉ Register ๊ฐ„ mov ์ œ๊ฑฐ ์ค‘๋ณต๋œ load ์ œ๊ฑฐ Control Flow Optimizations(์ตœ์ ํ™”) ์ฃผ์–ด์ง„ ์ž…๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ข€ ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ„๋ฅ˜ ๋ฐฉ๋ฒ• ๋ถ„์„ : Control Flow Analysis vs Data Flow Analysis ์ตœ์ ํ™” Inner basic block(local) vs Inter basic block(global) Cyclic code opt vs Acyclic code opt Control Flow Analysis Control Flow ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋Šฅํ•œ ์ˆ˜ํ–‰์ˆœ์„œ (๋ถ„๊ธฐ) Branch Execution -> dynamic control flow : ์‹คํ–‰ ํ•ด๋ด์•ผ ํ™•์ธ ๊ฐ€๋Šฅ Compiler -> static control flow : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ„์„ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์Œ Analysis ์ •์  ์„ฑ์งˆ (static property): ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์—†์ด ๋„์ถœ ๋˜๋Š” ์„ฑ์งˆ CFA(Control Flow Analysis) : ์ฝ”๋“œ์˜ ๋ถ„๊ธฐ ๊ตฌ์กฐ๋ฅผ CFG ํ˜•ํƒœ๋กœ ํ‘œํ˜„ Basic Block ๋™์ผํ•œ execution condition์„ ์ ์šฉ๋ฐ›๋Š” instruction ๋ฌถ์Œ instruction ์™ธ์—๋Š” branch๊ฐ€ ์—†์Œ Maximal basic block ๊ตฌํ•˜๊ธฐ BB์˜ leader(์ฒซ๋ฒˆ์งธ instruction)๋ฅผ ์ฐพ๋Š”๋‹ค ๋‹ค์Œ leader ์ด์ „๊นŒ์ง€์˜ instruction์„ ๊ตฌํ•œ๋‹ค Weighted CFG Profiling: ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด์„œ ์‹คํ–‰ํšŸ์ˆ˜๋ฅผ ์–ป์Œ ์–ป์€ weight๋ฅผ edge์— ํ‘œ์‹œ Control Flow Optimization Acyclic Code Loop๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›€ ์ข…๋ฅ˜ Inner basic block opt. = Intra opt. = Local opt. Inter basic block opt. = Global opt. Inner Basic Block Optimization Commn subexpression elimination ๊ณตํ†ต๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Algebraic simplification ๋Œ€์ˆ˜๋ฒ•์น™์„ ์ด์šฉํ•˜์—ฌ ์‹์„ ๊ฐ„์†Œํ™” ex) x=1*y; -> x=y; Strength reduction ์—ฐ์‚ฐ์ž์˜ ๋น„์šฉ์ด ์ ์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ex) x=x*2; -> x=x+x; ex) y=a/4; -> y=a>>2; Constant folding / propagation folding: ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ƒ์ˆ˜์‹์„ ์ง์ ‘์‹œ๊ฐ„ propagation : ๊ณ ์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด Inter Basic Block Optimization Global application of inner basic block optimization Global common subexpression elimination basic block ๊ฐ„์˜ ๊ณตํ†ต ๋ถ€๋ถ„์‹์— ๋Œ€ํ•ด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Global constant folding / propagation basic block ๊ฐ„์˜ ์ƒ์ˆ˜๋ฅผ ์ธ์‹ํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Other transformation Branch to unconditional branch ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ ์ œ๊ฑฐ Unconditional branch to branch ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋ถ„๊ธฐ -> ๋ถ„๊ธฐ ํ•œ๋ฒˆ์œผ๋กœ ๋ณ€๊ฒฝ Branch to next basic block (next instr) ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋‹ค์Œ basic block์œผ๋กœ ๋ถ„๊ธฐ ์ œ๊ฑฐ Basic block merging ๋‘ basic block์„ ํ•ฉ์นจ Branch to same target ๊ฐ™์€ basic block์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ Branch target expansion ๋ถ„๊ธฐ ๋Œ€์ƒ์ด ๋˜๋Š” basic block์„ ํ•ฉ์นจ Unreachable code elimination Entry์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ‘unreachable’ block ์ œ๊ฑฐ Loop Optimization Loop๋Š” ํ•œ๋ฒˆ optimizeํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค Loop unrolling : ๋ฐ˜๋ณต๋ฌธ์„ ํ’€์–ด์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ž„ Loop invarient : ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฐ’์„ ๋‚ด๋Š” ๋ฌธ์žฅ์„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ–์œผ๋กœ ๋นผ๋ƒ„ Count up to zero : i๋ฅผ ๊ฐ์†Œํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ (i๋ฅผ 0๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด n๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„) Dataflow Analysis + Optimization Dataflow Analysis ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ๊ฐ data ๊ฐ’๋“ค์ด ์ƒ์„ฑ/์†Œ๋ฉธ๋˜๋Š” ์ •๋ณด๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ Reaching Definition Analysis definition : ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ assign๋˜๋Š” ๊ฒƒ reach : definition d๊ฐ€ ํŠน์ • ์œ„์น˜ p์— ๋„๋‹ฌํ•œ๋‹ค kill : definition d์˜ ๋‘๊ฐœ์˜ ํฌ์ธํŠธ์‚ฌ์ด์—์„œ ๋‹ค๋ฅธ definition์ด ์กด์žฌํ•œ๋‹ค GEN/KILL GEN: ๋ธ”๋ก ๋‚ด์—์„œ ์ƒ์„ฑ๋œ definition KILL: ๋ธ”๋ก ๋‚ด์—์„œ ์†Œ๋ฉธ๋œ definition IN/OUT IN : ์ด์ „ ๋ธ”๋ก์˜ OUT์˜ ํ•ฉ์ง‘ํ•ฉ OUT : IN์—์„œ GEN์„ ๋”ํ•˜๊ณ  KILL์„ ๋บ€ ๊ฒƒ
  • ««
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
  • »»
๐Ÿง  Algorithm (104) ๐ŸŒŠ C/CPP (2) โ˜• Java (8) ๐ŸŒ Javascript (9) ๐Ÿ Python (9) ๐Ÿƒ Spring (30) ๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ (2) ๐ŸŽธ ๊ธฐํƒ€ (7) ๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” (38) ๐Ÿค– ์ธ๊ณต์ง€๋Šฅ (2) ๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€ (28)
๐Ÿท๏ธ boj (53) ๐Ÿท๏ธ c (5) ๐Ÿท๏ธ c++ (4) ๐Ÿท๏ธ celery (2) ๐Ÿท๏ธ cs (18) ๐Ÿท๏ธ django (3) ๐Ÿท๏ธ docker (2) ๐Ÿท๏ธ docker compose (1) ๐Ÿท๏ธ elk (1) ๐Ÿท๏ธ fastapi (4) ๐Ÿท๏ธ git (2) ๐Ÿท๏ธ github actions (5) ๐Ÿท๏ธ hackerrank (3) ๐Ÿท๏ธ https (2) ๐Ÿท๏ธ java (37) ๐Ÿท๏ธ javascript (2) ๐Ÿท๏ธ jwt (1) ๐Ÿท๏ธ kubernetes (4) ๐Ÿท๏ธ nginx (2) ๐Ÿท๏ธ ocaml (1) ๐Ÿท๏ธ open source (2) ๐Ÿท๏ธ programmers (48) ๐Ÿท๏ธ pytest (1) ๐Ÿท๏ธ python (111) ๐Ÿท๏ธ rabbitmq (2) ๐Ÿท๏ธ rag (3) ๐Ÿท๏ธ react (6) ๐Ÿท๏ธ security (3) ๐Ÿท๏ธ software-engineering (3) ๐Ÿท๏ธ spring (31) ๐Ÿท๏ธ sql (5) ๐Ÿท๏ธ ssl (1) ๐Ÿท๏ธ testing (4) ๐Ÿท๏ธ typescript (1) ๐Ÿท๏ธ vercel (1) ๐Ÿท๏ธ websocket (1)