<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Step-by-Step</title>
    <link>https://smile-development.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 20:23:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>희주(KHJ)</managingEditor>
    <image>
      <title>Step-by-Step</title>
      <url>https://tistory1.daumcdn.net/tistory/4768241/attach/14c94040b09648b1a7a04c2b7f72db73</url>
      <link>https://smile-development.tistory.com</link>
    </image>
    <item>
      <title>[Memory] DRAM</title>
      <link>https://smile-development.tistory.com/205</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dynamic Random Access Memory&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 159px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 105px;&quot;&gt;
&lt;td style=&quot;width: 22.3256%; height: 105px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dynamic&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%; height: 105px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM은 데이터를 Capacity (전하를 저장하는 가장 작은 축적기) 에 저장한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 Capacity는 시간이 지나면 전하가 자연스럽게 방전되기 때문에, 저장된 정보가 금방 사라진다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기적으로 데이터를 다시 충전해주는 Refresh 동작이 필요한데,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉, Dynamic은&lt;b&gt; 저장 상태가 계속 유지되지 않고, 끊임없이 갱신해야 한다는 의미&lt;/b&gt;이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 22.3256%; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Random Access&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메모리에 저장된 데이터는 순차적으로 접근하는 것이 아니라, 원하는 주소로 바로 접근할 수 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.3256%; height: 16px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.6744%; height: 16px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM은 데이터를 저장하는 장치로, 휘발성 메모리에 속하여 전원이 꺼지면 데이터가 사라진다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주로 CPU와 보조 저장장치(SSD / HDD) 사이에서 중간 역할을 하며, 프로그램 실행 중 필요한 데이터를 일시적으로 저장한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 Refresh&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 Refresh 작업은 메모리 컨트롤러(MC)에서 자동으로 담당한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 Cell Capacitor가 일정 시간이 지나면 전하가 날아가기 때문에, 컨트롤러가 주기적으로 셀을 읽고 다시 써서 전하를 보충한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 수 밀리초(ms) 단위로 모든 셀을 한 번씩 refresh 한다. (보통 64ms ~ 128ms)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ Refresh 작업은 왜 ms 단위로 해야할까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Capacitor 의 크기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 셀 하나는 트랜지스터 1개 + 캐패시터 1개로 구성되는데, 이 캐패시터가 나노미터 크기로 매우 작다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저장할 수 있는 전하량이 극히 적어, 새어 나가면 0과 1의 경계가 모호해진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 누설 전류&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;반도체 내부는 완벽한 절연체가 없어서, 시간이 지나면 전하가 조금씩 빠져나가게 된다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;미세 공정일수록 누설 전류가 커지기 때문에 더 자주 refresh가 필요하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;3. 온도&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;온도가 높을수록 전자가 빨리 이동하므로, 고온에서는 refresh 주기를 더 짧게 잡아야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반도체 물질은 온도가 높아지면 전자들의 에너지가 커져서 쉽게 이동할 수 있고, 전자가 장벽을 넘어가는 확률이 높아져 전하가 더 빨리 새어나가게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 구조&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 최소 단위는 1bit Cell로, 트랜지스터와 커패시터로 구성되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 트랜지스터 (Transistor) : 스위치 역할로, 데이터 읽기 / 쓰기를 제어한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 커패시터 (Capacitor) ; 전하를 저장해서 데이터를 유지한다. (전하가 있으면 1, 없으면 0)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758270232002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Bit Cell]
   ┌──────┐
   │ C    │ &amp;larr; 커패시터 (데이터 저장)
   └──┬───┘
      │
      T &amp;larr; 트랜지스터 (액세스 제어)
      │
   Word Line &amp;rarr; 셀 선택&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DRAM의 배열 구조&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DRAM은 수많은 bit Cell을 행(Row) x 열(Column) 로 배열한 매트릭스 구조를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Word Line (행 선택선) : 특정 행을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bit Line (열 데이터선) : 선택된 셀의 데이터를 읽거나 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Row Decoder : 입력된 주소의 행 번호를 해석해서 Word Line을 활성화한다. (해당 Bit line 연결을 위한 활성화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Column Decoder : 선택된 행에서 읽고자 하는 열을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DRAM의 channel&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU (또는 메모리 컨트롤러)와 DRAM 모듈 사이의 데이터 통로를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Channel이 많으면 한 번에 더 많은 데이터를 동시에 전송할 수 있어서, 메모리 대역폭(bandwidth)이 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Memory 대역폭(Bandwidth)의 의미는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU(혹은 다른 Master)와 메모리 간 일정 시간 동안 &lt;b&gt;전송할 수 있는 데이터의 양&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단위 : 보통 GB/s&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 계산 방법 : 대역폭 = 메모리 클럭 속도 x 데이터 전송 수 x 버스 폭 x 채널 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Channel의 Interleaving&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 메모리 채널을 번갈아 사용하여 데이터 접근 병목을 줄이는 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단순히 한 채널만 사용하면 CPU가 메모리를 기다려야하는 시간이 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Interleaving을 사용하면 여러 채널이 병렬로 동작하면서 CPU가 대기하는 시간을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- channel이 담당하는 DRAM의 물리적인 주소 값은 고정이나, 연속적인 주소값은 아니다. (연속적인 주소들이 다른 채널로 번갈아 분산될 수 있다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/09DVi/btsQHeUoWZE/uKtL1KNKfyKMQfgqHqmwyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/09DVi/btsQHeUoWZE/uKtL1KNKfyKMQfgqHqmwyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/09DVi/btsQHeUoWZE/uKtL1KNKfyKMQfgqHqmwyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F09DVi%2FbtsQHeUoWZE%2FuKtL1KNKfyKMQfgqHqmwyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;333&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;68f780c4-f240-49c8-954f-0ad457f98d97&quot; data-message-author-role=&quot;user&quot;&gt;
&lt;div&gt;
&lt;div data-multiline=&quot;&quot;&gt;
&lt;div&gt;CPU가 DRAM에 16byte를 요청했어 (프로토콜 전송 폭 128bit) DRAM으로 가는 channel이 4개이고, 이게 interleaving 되어있어서. 16byte는 네개의 채널에서 번갈아 가져와야해. 그럼 각 데이터를 가져와서 조합해서 CPU한테 돌려줘?&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT의 말:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-mini&quot; data-message-id=&quot;fc530e71-0d38-485c-8615-df82a553ce83&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-end=&quot;50&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;네, 질문하신 상황을 정리하면 이렇게 이해할 수 있습니다. 하나씩 단계별로 풀어볼게요.&lt;/p&gt;
&lt;hr data-end=&quot;55&quot; data-start=&quot;52&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;66&quot; data-start=&quot;57&quot; data-ke-size=&quot;size23&quot;&gt;상황 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;180&quot; data-start=&quot;67&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;91&quot; data-start=&quot;67&quot;&gt;CPU가 &lt;b&gt;16바이트&lt;/b&gt;를 요청.&lt;/li&gt;
&lt;li data-end=&quot;131&quot; data-start=&quot;92&quot;&gt;DRAM 프로토콜 전송 폭이 &lt;b&gt;128비트(=16바이트)&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;180&quot; data-start=&quot;132&quot;&gt;DRAM 채널이 &lt;b&gt;4개&lt;/b&gt; 있고, &lt;b&gt;interleaving&lt;/b&gt; 되어 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;288&quot; data-start=&quot;182&quot; data-ke-size=&quot;size16&quot;&gt;즉, 16바이트를 한 번에 전송할 수 있는 폭은 128비트 &amp;rarr; 정확히 16바이트인데, 채널 4개에 interleaving 되어 있기 때문에 데이터를 &lt;b&gt;4개 채널에 분산&lt;/b&gt;해서 저장/전송함.&lt;/p&gt;
&lt;hr data-end=&quot;293&quot; data-start=&quot;290&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;314&quot; data-start=&quot;295&quot; data-ke-size=&quot;size23&quot;&gt;Interleaving 구조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;364&quot; data-start=&quot;315&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;364&quot; data-start=&quot;315&quot;&gt;예를 들어, 16바이트 데이터를 4바이트 단위로 나눠서 채널에 배분했다고 가정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;채널데이터
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;465&quot; data-start=&quot;366&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;465&quot; data-start=&quot;395&quot;&gt;
&lt;tr data-end=&quot;411&quot; data-start=&quot;395&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;402&quot; data-start=&quot;395&quot;&gt;CH0&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;411&quot; data-start=&quot;402&quot;&gt;D0~D3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;428&quot; data-start=&quot;412&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;419&quot; data-start=&quot;412&quot;&gt;CH1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;428&quot; data-start=&quot;419&quot;&gt;D4~D7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;446&quot; data-start=&quot;429&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;436&quot; data-start=&quot;429&quot;&gt;CH2&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;446&quot; data-start=&quot;436&quot;&gt;D8~D11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;465&quot; data-start=&quot;447&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;454&quot; data-start=&quot;447&quot;&gt;CH3&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;465&quot; data-start=&quot;454&quot;&gt;D12~D15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;577&quot; data-start=&quot;467&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;523&quot; data-start=&quot;467&quot;&gt;CPU가 16바이트를 요청하면 &lt;b&gt;각 채널에서 4바이트씩 동시에 읽음&lt;/b&gt; &amp;rarr; 총 16바이트 완성.&lt;/li&gt;
&lt;li data-end=&quot;577&quot; data-start=&quot;524&quot;&gt;즉, interleaving 덕분에 &lt;b&gt;병렬로 데이터 읽기 가능&lt;/b&gt; &amp;rarr; 메모리 대역폭 향상.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;582&quot; data-start=&quot;579&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;596&quot; data-start=&quot;584&quot; data-ke-size=&quot;size23&quot;&gt;최종 전달 과정&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;747&quot; data-start=&quot;597&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;637&quot; data-start=&quot;597&quot;&gt;CPU 요청 &amp;rarr; 메모리 컨트롤러가 16바이트 주소를 4채널로 분배.&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;638&quot;&gt;각 채널에서 **각각 데이터 일부(예: 4바이트)**를 DRAM에서 읽음.&lt;/li&gt;
&lt;li data-end=&quot;724&quot; data-start=&quot;683&quot;&gt;메모리 컨트롤러에서 &lt;b&gt;4채널 데이터를 조합&lt;/b&gt;하여 16바이트 완성.&lt;/li&gt;
&lt;li data-end=&quot;747&quot; data-start=&quot;725&quot;&gt;완성된 16바이트를 CPU로 전달.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;752&quot; data-start=&quot;749&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;763&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;✅ 정리하면:&lt;/p&gt;
&lt;blockquote data-end=&quot;880&quot; data-start=&quot;764&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;네, 각 채널에서 데이터를 가져와 &lt;b&gt;메모리 컨트롤러가 조합&lt;/b&gt;한 뒤 CPU에 전달합니다.&lt;br /&gt;Interleaving은 한 번에 여러 채널에서 병렬로 데이터를 읽어 전체 전송 시간을 줄이는 기술입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드/Memory</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/205</guid>
      <comments>https://smile-development.tistory.com/205#entry205comment</comments>
      <pubDate>Fri, 19 Sep 2025 17:52:20 +0900</pubDate>
    </item>
    <item>
      <title>InitCall에 대한 정리</title>
      <link>https://smile-development.tistory.com/204</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. initcall의 개념&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리눅스 커널에서 initcall은 커널이 부팅될 때 실행되는 초기화 함수들을 관리하는 메커니즘입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 메커니즘은 다양한 서브시스템과 드라이버가 특정 순서대로 초기화되도록 돕습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;290&quot; data-start=&quot;265&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. initcall의 실행 단계&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;291&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리눅스 커널의 initcall은 다음과 같은 우선순위 단계로 나뉩니다. (각각 include/linux/init.h에 정의됨)&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;291&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/torvalds/linux/blob/master/include/linux/init.h&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/torvalds/linux/blob/master/include/linux/init.h&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739898830572&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;linux/include/linux/init.h at master &amp;middot; torvalds/linux&quot; data-og-description=&quot;Linux kernel source tree. Contribute to torvalds/linux development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/torvalds/linux/blob/master/include/linux/init.h&quot; data-og-url=&quot;https://github.com/torvalds/linux/blob/master/include/linux/init.h&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxaIB4/hyYjwLOcbU/gOuZV9gfDy7V5N7JTG6fZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_144_1045_234,https://scrap.kakaocdn.net/dn/2fsyV/hyYfYJYXza/nc15u1QBb6LEVWCobKzrk1/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_144_1045_234&quot;&gt;&lt;a href=&quot;https://github.com/torvalds/linux/blob/master/include/linux/init.h&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/torvalds/linux/blob/master/include/linux/init.h&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxaIB4/hyYjwLOcbU/gOuZV9gfDy7V5N7JTG6fZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_144_1045_234,https://scrap.kakaocdn.net/dn/2fsyV/hyYfYJYXza/nc15u1QBb6LEVWCobKzrk1/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_144_1045_234');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;linux/include/linux/init.h at master &amp;middot; torvalds/linux&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Linux kernel source tree. Contribute to torvalds/linux development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;797&quot; data-start=&quot;371&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;456&quot; data-start=&quot;413&quot;&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pure_initcall&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 가장 먼저 실행되는 초기화 단계&lt;br /&gt;- 기본적인 시스템 설정 전에 실행되어야 하는 코드 등록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;495&quot; data-start=&quot;457&quot;&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;core_initcall, core_initcall_sync&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 코어 서브시스템 초기화&lt;br /&gt;- sync는 해당 단계에서 동기적으로 실행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;542&quot; data-start=&quot;496&quot;&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;postcore_initcall, postcore_initcall_sync&lt;/td&gt;
&lt;td&gt;- 아키텍처별 초기화 코드 진행&lt;br /&gt;- CPU, MMU, 특정 하드웨어 관련 설정을 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;subsys_initcall,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;subsys_initcall_sync&lt;/td&gt;
&lt;td&gt;- 시스템의 서브 시스템 (네트워크, 디바이스 드라이버 프레임워크 등) 초기화&lt;br /&gt;- 디바이스 드라이버가 올라가기 전에&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;588&quot; data-start=&quot;543&quot;&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;fs_initcall, fs_initcall_sync&lt;/td&gt;
&lt;td&gt;- 파일 시스템 관련 초기화&lt;br /&gt;- 파일 시스템 드라이버 및 기본적인 스토리지 인터페이스 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;626&quot; data-start=&quot;589&quot;&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;rootfs_initcall, rootfs_initcall_sync&lt;/td&gt;
&lt;td&gt;- 루트 파일시스템을 마운트 하기 위해 초기화&lt;br /&gt;- fs_initcall 이후에 실행됨&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;674&quot; data-start=&quot;627&quot;&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;device_initcall, device_initcall_sync&lt;/td&gt;
&lt;td&gt;- 개별 디바이스 드라이버 초기화&lt;br /&gt;- 하드웨어 관련 장치 및 장치 드라이버 로딩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;709&quot; data-start=&quot;675&quot;&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;late_initcall, late_initcall_sync&lt;/td&gt;
&lt;td&gt;- 가장 마지막에 실행되는 초기화 단계&lt;br /&gt;- 사용자 공간으로 전환하기 직전에 수행해야 하는 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;751&quot; data-start=&quot;710&quot;&gt;
&lt;td&gt;기타&lt;/td&gt;
&lt;td&gt;__initcall&lt;/td&gt;
&lt;td&gt;- device_initcall의 별칭 (디바이스 드라이버 초기화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;797&quot; data-start=&quot;752&quot;&gt;
&lt;td&gt;기타&lt;/td&gt;
&lt;td&gt;__exitcall&lt;/td&gt;
&lt;td&gt;- 종료시 실행할 함수를 등록하는 매크로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;841&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한 단계는 각 서브시스템이 올바른 순서대로 실행될 수 있도록 도와줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;841&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;부팅 과정에서 순차적으로 실행되며, 커널 초기화와 관련된 여러 작업을 단계적으로 실행할 수 있도록 설계되어 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;841&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;841&quot; data-start=&quot;799&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739898725522&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * A &quot;pure&quot; initcall has no dependencies on anything else, and purely
 * initializes variables that couldn't be statically initialized.
 *
 * This only exists for built-in code, not for modules.
 * Keep main.c:initcall_level_names[] in sync.
 */
#define pure_initcall(fn)		__define_initcall(fn, 0)

#define core_initcall(fn)		__define_initcall(fn, 1)
#define core_initcall_sync(fn)		__define_initcall(fn, 1s)
#define postcore_initcall(fn)		__define_initcall(fn, 2)
#define postcore_initcall_sync(fn)	__define_initcall(fn, 2s)
#define arch_initcall(fn)		__define_initcall(fn, 3)
#define arch_initcall_sync(fn)		__define_initcall(fn, 3s)
#define subsys_initcall(fn)		__define_initcall(fn, 4)
#define subsys_initcall_sync(fn)	__define_initcall(fn, 4s)
#define fs_initcall(fn)			__define_initcall(fn, 5)
#define fs_initcall_sync(fn)		__define_initcall(fn, 5s)
#define rootfs_initcall(fn)		__define_initcall(fn, rootfs)
#define device_initcall(fn)		__define_initcall(fn, 6)
#define device_initcall_sync(fn)	__define_initcall(fn, 6s)
#define late_initcall(fn)		__define_initcall(fn, 7)
#define late_initcall_sync(fn)		__define_initcall(fn, 7s)

#define __initcall(fn) device_initcall(fn)

#define __exitcall(fn)						\
	static exitcall_t __exitcall_##fn __exit_call = fn

#define console_initcall(fn)	___define_initcall(fn, con, .con_initcall)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>임베디드/Linux</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/204</guid>
      <comments>https://smile-development.tistory.com/204#entry204comment</comments>
      <pubDate>Wed, 19 Feb 2025 02:37:00 +0900</pubDate>
    </item>
    <item>
      <title>[Embedded] DMA</title>
      <link>https://smile-development.tistory.com/203</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UsRjh/btsJMjowW4j/bwQGgjhGRXetKwzMiz0EUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UsRjh/btsJMjowW4j/bwQGgjhGRXetKwzMiz0EUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UsRjh/btsJMjowW4j/bwQGgjhGRXetKwzMiz0EUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUsRjh%2FbtsJMjowW4j%2FbwQGgjhGRXetKwzMiz0EUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;225&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Direct Memory Access - 직접 메모리 접근&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU의 도움 없이 메모리와 외부 장치 간에 데이터를 직접 주고 받을 수 있게 해주는 기술&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 하드웨어 하위 시스템이 CPU와 독립적으로 메인 시스템 메모리에 접근할 수 있게 해주는 컴퓨터 시스템 기능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 컴퓨터에서 데이터를 주고받을 때, CPU가 모든 과정을 제어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ex) 컴퓨터에서 연결된 하드디스크에서 데이터를 메모리로 옮기려면, CPU가 그 과정을 하나하나 지시함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;rarr; CPU의 작업이 많이 늘어나서 느려질 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 부분에서 DMA는,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU 대신 데이터를 직접 메모리로 옮기는 기술 (외부메모리 접근, 내부 연산 동작 등 수행)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU는 지시만 하고, 실제 데이터 전송은 DMA 컨트롤러가 처리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU의 부담이 줄어들고, 전체 시스템 기능이 향상됨&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단, CPU 관점에서 DMA도 하나의 장치이므로, DMA도 CPU의 제어로 동작하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA의 동작&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DMA로 메모리간 이동을 하려면 &lt;b&gt;&lt;i&gt;SOURCE &amp;rarr; DMA&lt;/i&gt; &amp;rarr;&lt;i&gt; DESTINATION&lt;/i&gt;&lt;/b&gt; 과정이 진행된다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SOURCE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DESTINATION&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;soucre 시작 주소&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 번 전송할 크기 (UNIT)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이동 방식(Mem, Peri 간)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전송할 횟수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;destination 시작 주소&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한 번 전송할 크기 (UNIT)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단, 더 다양한 DMA 활용을 위해서는 다음 설정도 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SOURCE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DESTINATION&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주소모드 (증가/고정)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Trigger Source&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Circular Mode&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널 우선순위 (4레벨)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주소모드 (증가/고정)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA 주소모드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주소모드에는 &lt;i&gt;&lt;b&gt;증가(INC), 고정(FIX)&lt;/b&gt; &lt;/i&gt;모드 두 가지가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보통 이론적으로, 데이터를 전송할 때, 메모리 주소를 생각하면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xedlx/btsJNH9PxNB/4kzTKOvcBthMWUUB8Knod0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xedlx/btsJNH9PxNB/4kzTKOvcBthMWUUB8Knod0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xedlx/btsJNH9PxNB/4kzTKOvcBthMWUUB8Knod0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXedlx%2FbtsJNH9PxNB%2F4kzTKOvcBthMWUUB8Knod0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;241&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;둘 다 &lt;u&gt;&lt;b&gt;증가모드&lt;/b&gt;&lt;/u&gt;로 증가한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만, SOURCE나 DESTINATION 전송을 위해 잠시 저장하는 공간이라면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERyU5/btsJME0hdMv/YwjjIV1JzgCkfYi9KLxFa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERyU5/btsJME0hdMv/YwjjIV1JzgCkfYi9KLxFa1/img.png&quot; data-alt=&quot;SOURCE 고정 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERyU5/btsJME0hdMv/YwjjIV1JzgCkfYi9KLxFa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERyU5%2FbtsJME0hdMv%2FYwjjIV1JzgCkfYi9KLxFa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;232&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SOURCE 고정 모드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebFlVN/btsJN1mpd1R/usK9ockVMEveviGV8HojNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebFlVN/btsJN1mpd1R/usK9ockVMEveviGV8HojNk/img.png&quot; data-alt=&quot;DESTINATION 고정 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebFlVN/btsJN1mpd1R/usK9ockVMEveviGV8HojNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebFlVN%2FbtsJN1mpd1R%2FusK9ockVMEveviGV8HojNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;231&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DESTINATION 고정 모드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메모리의 주소값이 변경되지 않는 &lt;u&gt;&lt;b&gt;고정 모드&lt;/b&gt;&lt;/u&gt;로 진행하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DMA Trigger&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DMA 전송을 시작하는 신호나 조건&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 전송하기 위해 준비된 상태에서 &quot;언제 데이터를 전송할지&quot; 결정하는 트리거가 필요함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Trigger 주요 유형&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어 트리거 (Software Trigger)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소프트웨어에 직접적으로 DMA 전송을 시작하는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU가 특정 명령을 실행해 DMA 전송을 시작하라고 지시하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ex) CPU가 특정 메모리 블록을 다른 위치로 이동하도록 DMA에게 명령할 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어 트리거 (Hardware Trigger)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;외부 장치에서 발생한 하드웨어 이벤트가 DMA 전송을 시작하도록 만드는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ex) 장치에서 데이터 전송을 시작할 준비가 되었을 때, 해당 자잋가 신호를 보내 DMA 전송 시작&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;타이머 트리거 (Tiimer Trigger)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기적으로 발생하는 타이머에 의해 DMA 전송 시작&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기적인 데이터 전송이 필요한 경우 (센서 데이터 수집 등) 타이머가 트리거 역할을 할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Trigger 역할&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;효율적인 데이터 전송 : DMA 전송이 정확한 시점에 시작하여, 불필요한 대기를 줄이고 필요한 순간에만 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU 부담 경감 : HW 트리거를 이용하여 CPU가 전송 타이밍을 관리하지 않고 데이터를 전송하여, CPU가 다른 작업에 집중가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드/Embedded C</category>
      <category>DMA</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/203</guid>
      <comments>https://smile-development.tistory.com/203#entry203comment</comments>
      <pubDate>Thu, 26 Sep 2024 16:09:39 +0900</pubDate>
    </item>
    <item>
      <title>[Embedded] UART</title>
      <link>https://smile-development.tistory.com/202</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;UART&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Universal Asynchronous Receiver &amp;amp; Transmitter&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UART의 U는 범용, 즉 자료 형태나 전송 속도를 직접 구성할 수 있고 실제 전기 신호 수준과 방식이 일반적으로 UART 밖의 특정한 드라이버 회로를 통해 관리를 받음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비동기 통신으로, 동기 신호가 전달되지 않기 때문에 수신 쪽에서 동기 신호를 찾아내 데이터의 시작과 끝을 시간적으로 알아 처리할 수 있도록 약속되어 있음&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;USART&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Universal Synch, Asynchronous Receiver &amp;amp; Transmitter&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;UART 에서 USRT를 추가한 형태&lt;/li&gt;
&lt;li&gt;USRT(범용 동기화 송수신기) : 자체 클럭 신호를 추가로 사용하여 정해진 속도로 수신 데이터로부터 비트 구간을 구분하고 비트의 논리 상태를 결정하여 데이터 통신을 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 송수신 형태&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSBHHj/btsJKGpD8G5/E90Uvy9wARx8ie6xtyfnT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSBHHj/btsJKGpD8G5/E90Uvy9wARx8ie6xtyfnT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSBHHj/btsJKGpD8G5/E90Uvy9wARx8ie6xtyfnT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSBHHj%2FbtsJKGpD8G5%2FE90Uvy9wARx8ie6xtyfnT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;294&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 비트 : 통신의 시작으로, 한 비트의 시간 길이만큼 유지&lt;/li&gt;
&lt;li&gt;데이터 비트 : 5~8 비트의 데이터 전송을 진행. bit의 수는 해당 레지스터 설정에 따라 결정&lt;/li&gt;
&lt;li&gt;패리티 비트 : 오류를 검증하기 위한 parity 값을 생선하여 송신하고, 수신쪽에서 오류 판단 (짝수/홀수/사용안함 중 선택)&lt;/li&gt;
&lt;li&gt;종료 비트 : 통신 종료를 알림. 세 가지 정해진 비트 만큼 유지해야 한다. (1/1.5/2비트로 해당 레지스터 설정에 따라 결정)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;RS232&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UART를 이용한 가장 일반적인 비동기 통신 방식&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 86.628%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.1886%;&quot;&gt;RTS (Request to Send)&lt;/td&gt;
&lt;td style=&quot;width: 127.362%;&quot;&gt;송신 측에서 데이터를 보내기 전에 사용.&lt;br /&gt;송신 장치가 수신 장치에 데이터를 보내기 위해 준비가 되었음을 알리는 신호.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.1886%;&quot;&gt;CTS(Clear to Send)&lt;/td&gt;
&lt;td style=&quot;width: 127.362%;&quot;&gt;수신 측에서 RTS 신호에 응답하는 신호.&lt;br /&gt;송신 측에 데이터를 보낼 수 있음을 알림.&lt;br /&gt;데이터 전송을 시작하기 전에 충돌을 방지하는데 도움이 됨.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.1886%;&quot;&gt;DSR(Data Set Ready)&lt;/td&gt;
&lt;td style=&quot;width: 127.362%;&quot;&gt;수신 장치가 준비되었음을 송신 장치에게 알리는 신호.&lt;br /&gt;보통 모뎀과 같은 데이터 통신 장치에 사용됨.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.1886%;&quot;&gt;DTR(Data Terminal Ready)&lt;/td&gt;
&lt;td style=&quot;width: 127.362%;&quot;&gt;송신 장치가 데이터 통신을 시작할 준비가 되었음을 나타내는 신호.&lt;br /&gt;수신 장치가 DTR 신호를 감지하면, 데이터 전송을 시작할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 신호들은 주로 직렬 통신에서 데이터의 전송 상태를 제어하고, 충돌을 방지하기 위해 사용됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드/Embedded C</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/202</guid>
      <comments>https://smile-development.tistory.com/202#entry202comment</comments>
      <pubDate>Tue, 24 Sep 2024 17:06:39 +0900</pubDate>
    </item>
    <item>
      <title>[C] 매크로 #define</title>
      <link>https://smile-development.tistory.com/201</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;전처리기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 키워드는 컴파일러가 컴파일을 실행하기 전에 처리한다고 하여, 전처리기(Preprocessor) 또는 매크로(Macro)라고 한다. 예를 들어, 전처리기를 이용하여 다른 헤더 파일을 include 하면 ex) #include &amp;lt;stdio.h&amp;gt; 등 하위 코드에서 scanf나 printf와 같은 함수들을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;매크로&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매크로는 컴파일러에게 코드의 특성을 알려주는 키워드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 키워드를 코드로 치환하는 것 (상수 정의, 인라이닝, 문법 정의/변형 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정해진 순서에 따라 어떻게 특정한 입력 시퀀스가 출력 시퀀스로 매핑되어야 하는지 정의하는 규칙이나 패턴&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴파일 전에 해당 매크로에 #define에 정의된 함수, 값 등 형태가 대입되어짐&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;#define&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 숫자, 함수, 프로그램 블록을 다른 형태로 변환 지정한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 선언이 가능하며, 조건은 선언된 해당 줄에만 적용되고, 여러 줄을 연결하기 위해서는 '\'을 사용하여 한 줄처럼 코딩하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#define을 통해 매크로를 정의하고, #undef를 이용하여 매크로를 무효화 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#define 매크로 유형에는 대상 변환형이 있고, 유사 함수 변환형이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;대상 변환형&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1727140529159&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define PI 3.141592

...

int r = 5;

double area = r * r * PI;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유사 함수 변환형&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1727140667727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define ADD(X, Y) ((X)+(Y))

...

int sum = ADD(3,4);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문자열 대체 ##&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1727140759103&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t

DECLARE_STRUCT_TYPE(g_object); // 출력 결과는 typedef struct g_object_s g_object_t;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주의사항 - 텍스트 치환&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매크로, 특히 인자를 받는 함수 형태는 타입 검사나 연산작용을 적용하지 않고 바로 인자를 치환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를들어,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727142983860&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MUL(X) X*X

int mul = MUL(5);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 값은 5 * 5 = 25가 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 만약 2+3 이런식으로 집어넣게 된다면,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727143033283&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MUL(X) X*X

int mul = MUL(2+3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 값은 2+3*2+3 = 11 이 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 문제를 해결하기 위해서는, 혹시나 연산 값이 들어갈 상황을 방지하기 위해 괄호를 사용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727143090698&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define MUL(X) (X)*(X)
int mul = MUL(2+3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런식으로 사용하게 된다면, 값은 (2+3)*(2+3) = 25가 나오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드/Embedded C</category>
      <category>C언어</category>
      <category>define</category>
      <category>매크로</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/201</guid>
      <comments>https://smile-development.tistory.com/201#entry201comment</comments>
      <pubDate>Tue, 24 Sep 2024 10:20:17 +0900</pubDate>
    </item>
    <item>
      <title>ARM에 관한 정리 (수정필요)</title>
      <link>https://smile-development.tistory.com/200</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ARM&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt; A&lt;/b&gt;&lt;/span&gt;corn &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;R&lt;/b&gt;&lt;/span&gt;ISC &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;M&lt;/b&gt;&lt;/span&gt;achine &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ARM Holdings plc에서 설계하는 명령어의 집합&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영국의 컴퓨터 회사 Acorn Computer에서 개발한 RISC 기반 CPU 아키텍처&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ARM 특징&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 명령어 집합&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 전력 소모&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 성능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. big.LITTLE&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cortex의 도입&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ARM은 CPU 세대마다 성능과 기능을 향상시킨 후 &lt;u&gt;&lt;b&gt;동일 CPU 구조&lt;/b&gt;&lt;/u&gt;에 MMU/MPU 등 메모리 유닛을 차등조합하여 제품군을 나주었으나,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Cortex 이후부터 &lt;b&gt;용도에 따라&lt;/b&gt; 동시에 &lt;u&gt;&lt;b&gt;여러 CPU 구조를 개발&lt;/b&gt;&lt;/u&gt;하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cortex-A/R/M&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Cortext-A (Application Processors)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 용도 : 스마트폰, 태블릿, 컴퓨터 등 고성능 애플리케이션에서 사용&lt;/li&gt;
&lt;li&gt;ARMv7-A 및 ARMv8-A 아키텍처 기반으로 설계&lt;/li&gt;
&lt;li&gt;고성능 파이프라이닝과 메모리 관리 유닛 (MMU)&lt;/li&gt;
&lt;li&gt;고급 캐시 시스템&lt;/li&gt;
&lt;li&gt;다양한 멀티코어 구성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Cortex-R (Real-time Processors)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 용도 : 자동차 제어, 산업 자동화, 의료 기기, 하드 디스크 드라이버 컨트롤러 등 실시간 시스템에서 사용&lt;/li&gt;
&lt;li&gt;ARMv7-R 아키텍처를 기반으로 하며, 하드웨어 오류 복구 기능과 고속 인터럽트 처리&lt;/li&gt;
&lt;li&gt;실시간 처리와 신뢰성을 최우선으로 하는 프로세서&lt;/li&gt;
&lt;li&gt;저지연 인터럽트 처리&lt;/li&gt;
&lt;li&gt;예측 가능한 실행 시간&lt;/li&gt;
&lt;li&gt;실시간 운영체제(RTOS) 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Cortex-M (Microcontroller Processors)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 용도 : 마이크로컨트롤러, 임베디드 시스템에 사용&lt;/li&gt;
&lt;li&gt;ARMv7-M 및 ARMv8-M 아키텍처를 기반&lt;/li&gt;
&lt;li&gt;저전력 소비&lt;/li&gt;
&lt;li&gt;간단한 설계로 비용 절감 가능&lt;/li&gt;
&lt;li&gt;실시간 응답을 위한 저지연 인터럽트 시스템&lt;/li&gt;
&lt;li&gt;다양한 파워 관리 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cortex-M Processor&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 개의 칩에 CPU, 메모리, I/O, 타이머 및 카운터, ADC, 통신 모듈 등 포함한 소형 컴퓨터&lt;/li&gt;
&lt;li&gt;v7과 v6을 Slim화 하여 MCU 시장을 겨냥한 프로세서 제품군&amp;nbsp;&lt;/li&gt;
&lt;li&gt;크게 Cortex-M / System peripheral / 제조사 주변장치 로 나누게 된다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;1단계 Cortex M : vX-M Core&amp;nbsp; ex) v7-M, v6-M 등&lt;/li&gt;
&lt;li&gt;2단계 시스템 주변장치 : MPU, Cache, FPU, SysTick, NVIC, SCB 등&lt;/li&gt;
&lt;li&gt;3단계 제조사 주변장치 : Timer, RTC, GPIO, DMA, UART 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Cortex-M3 특징&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chf54r/btsJ3SQI9Ly/Hf6MqwJfEJuYxE7w63ZFU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chf54r/btsJ3SQI9Ly/Hf6MqwJfEJuYxE7w63ZFU1/img.png&quot; data-alt=&quot;출처 : https://developer.arm.com/Processors/Cortex-M3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chf54r/btsJ3SQI9Ly/Hf6MqwJfEJuYxE7w63ZFU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchf54r%2FbtsJ3SQI9Ly%2FHf6MqwJfEJuYxE7w63ZFU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://developer.arm.com/Processors/Cortex-M3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Thumb/Thumb-2 명령어 사용&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ARM 명령어 폐지 및 Thumb/Thumb-2 명령어 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;명령어 디코딩 회로 간략화 및 회로 Cost와 전력 소모가 동시에 감소&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Thumb 명령어 : &lt;a href=&quot;https://recipes.tistory.com/335&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://recipes.tistory.com/335&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. NVIC 인터럽트 구조&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NVIC : Nested Vectored Interrupt Controller (중첩벡터형인터럽트제어기)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NVIC 인터럽트 구조를 채택하고, Thumb-2 예외처리 성능 개선을 통해 인터럽트 레이턴시를 Cortex-M3 기준으로 24~42사이클에서 12사이클로 크게 줄임&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인터럽트 중복 발생시 context switching 시간 절감 기법들 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초 전력 WIC(Wakeup INterrupt Controller) &amp;rarr; 옵션&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제조사 무관하게 통일된 인터럽트 제어 환경 제공 가능&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. MPU&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고급 프로세서 MPU 기능을 옵션으로 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;시스템 신뢰성 증대, APP로부터 OS의 보호 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;8개의 메모리 영역을 독립적으로 관리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. System Timer&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS tick Time, 범용 Timer로 사용하기 위한 타이머&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cortex-M3 Memory Map&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beobZ6/btsJ28GPe88/ynf91CwOskZ0m0pMVdKvWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beobZ6/btsJ28GPe88/ynf91CwOskZ0m0pMVdKvWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beobZ6/btsJ28GPe88/ynf91CwOskZ0m0pMVdKvWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeobZ6%2FbtsJ28GPe88%2Fynf91CwOskZ0m0pMVdKvWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;526&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노란색 - ARM 사의 표준 주변장치 영역 (Systik Timer, NVIC, MPU, SCB 등)&lt;/li&gt;
&lt;li&gt;파란색 - SoC 제조사에서 만든 주변장치 영역&lt;/li&gt;
&lt;li&gt;초록색 - 내장 SRAM (휘발성)&lt;/li&gt;
&lt;li&gt;빨강색 - 내장된 ROM(Flash) 영역 (비휘발성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참조 : &lt;a href=&quot;https://namu.wiki/w/ARM(CPU)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://namu.wiki/w/ARM(CPU)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://documentation-service.arm.com/static/5e8e107f88295d1e18d34714?token=&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://documentation-service.arm.com/static/5e8e107f88295d1e18d34714?token=&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>임베디드</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/200</guid>
      <comments>https://smile-development.tistory.com/200#entry200comment</comments>
      <pubDate>Mon, 23 Sep 2024 11:17:59 +0900</pubDate>
    </item>
    <item>
      <title>[Embedded] 구조체 멤버 메모리 할당 #Pragma</title>
      <link>https://smile-development.tistory.com/199</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구조체 멤버 Pack&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구조체 멤버는 크기에 따라 1B / 2B / 4B / 8B 주소에만 만들어질 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴파일러는 구조체 멤버의 alignment 규정을 조정하는 옵션이 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU가 메모리에 접근할 때 (32bit CPU &amp;rarr; 4B 단위 // 64bit CPU&amp;nbsp;&amp;rarr; 8B 단위)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;32bit CPU &amp;rarr; 4B 단위, 64bit CPU&amp;nbsp;&lt;/span&gt;&amp;rarr; 8B 단위로 접근하는데 단위보다 작은 데이터에 접근하는 경우 시브트 연산으로 속도 효율이 저하됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;#pragma pack(N)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구조체 멤버가 차지하고 있는 메모리를 alignment 하는 옵션&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터의 크기를 정해진 단위로 정렬&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구조체의 크기를 1, 2, 4, 8, 16 Bytes 단위로 alignment 한다. (default : 8)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pack 사용시 구조체의 크기는 가장 큰 멤버가 N보다 크면 N의 배수로 제한됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 큰 멤버가 N보다 같거나 작으면 전체 크기는 가장 큰 멤버의 배수로 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.30233%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 18.721%;&quot;&gt;&lt;b&gt;N=1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;&lt;b&gt;N=2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.9652%;&quot;&gt;&lt;b&gt;N=4&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7092%;&quot;&gt;&lt;b&gt;N=8&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;1B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.721%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 22.9652%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.7092%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;2B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.721%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;2의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 22.9652%;&quot;&gt;2의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.7092%;&quot;&gt;2의 배수 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;4B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.721%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;2의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 22.9652%;&quot;&gt;4의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.7092%;&quot;&gt;4의 배수 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;8B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.721%;&quot;&gt;임의 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.3023%;&quot;&gt;2의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 22.9652%;&quot;&gt;4의 배수 주소&lt;/td&gt;
&lt;td style=&quot;width: 24.7092%;&quot;&gt;8의 배수 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;push pop&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pack이 사용되면 구조체 멤버가 unaligned 되어 엑세스 속도가 저하됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pack은 필요한 곳에서만 사용하고 반드시 원래의 pack으로 복원해야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725604432238&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#pragma pack(push, 1)	// 1바이트 정렬로 패킹 
struct PackStruct {
	char a;
    int b;
    short c;
};
#pragma pack(pop) // 이전 패킹 설정으로 복구


int main() {
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 정렬 및 성능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패킹을 사용하면 메모리 사용을 줄일 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구조체 멤버 내 정렬되지 않아 CPU의 메모리 접근 성능이 저하될 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 호환성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패킹된 구조체는 하드웨어나 파일 포맷과의 호환성을 맞추기 위해 필요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 안전성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패킹을 사용할 때 구조체의 크기와 정렬에 대한 이해가 필요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 플랫폼이나 컴파일러에서의 동작을 확인해야 함&lt;/span&gt;&lt;/p&gt;</description>
      <category>임베디드/Embedded C</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/199</guid>
      <comments>https://smile-development.tistory.com/199#entry199comment</comments>
      <pubDate>Fri, 6 Sep 2024 15:36:20 +0900</pubDate>
    </item>
    <item>
      <title>[OS] 운영체제 스케줄러</title>
      <link>https://smile-development.tistory.com/197</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;운영체제 스케줄러&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 프로그램을 동시에 실행되는 것처럼 보이게 하기 위해 규칙을 부여하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로세스 상태&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;New : 프로세스 생성&lt;/li&gt;
&lt;li&gt;Running : CPU에서 명령이 실행되는 중&lt;/li&gt;
&lt;li&gt;Waiting : 프로세스가 어떤 이벤트(입출력, Signal 등)가 발생하길 기다리는 중&lt;/li&gt;
&lt;li&gt;Ready : 프로세스가 CPU에 할당되어 실행되기를 기다리는 중&lt;/li&gt;
&lt;li&gt;Terminated : 프로세스 실행 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbTG4/btsAriYHsy0/zcJMHIGsLODYymr04iEQU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbTG4/btsAriYHsy0/zcJMHIGsLODYymr04iEQU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbTG4/btsAriYHsy0/zcJMHIGsLODYymr04iEQU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmbTG4%2FbtsAriYHsy0%2FzcJMHIGsLODYymr04iEQU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;346&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;운영체제 스케줄링 기법에 따라 단 1개만 Running 상태로 바뀔 수 있음&lt;/li&gt;
&lt;li&gt;Running 상태가 되면 실제 CPU로 프로세스 수행&lt;/li&gt;
&lt;li&gt;외부 입출력(I/O)이나 이벤트가 발생했을 때, Running 상태에 있는 프로세스가 Waiting으로 이동함&lt;/li&gt;
&lt;li&gt;Waiting에서 Ready로 이동한 것은 입출력이나 이벤트가 완료됨을 의미&lt;/li&gt;
&lt;li&gt;exit은 Running 상태에 있던 프로세스 종료&lt;/li&gt;
&lt;li&gt;Running &amp;lt;-&amp;gt; Ready : 운영체제는 멀티 태스킹, 멀티 프로세싱을 달성하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로세스 제어 블록(Process Control Block, PCB)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8V6y8/btsAnyO175e/FyRw3tA2LmY7eGkHEf1a3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8V6y8/btsAnyO175e/FyRw3tA2LmY7eGkHEf1a3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8V6y8/btsAnyO175e/FyRw3tA2LmY7eGkHEf1a3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8V6y8%2FbtsAnyO175e%2FFyRw3tA2LmY7eGkHEf1a3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;444&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스에 대한 모든 정보가 모여있는 곳&lt;/li&gt;
&lt;li&gt;Task Control Block(TCB) 라고도 함&lt;/li&gt;
&lt;li&gt;프로세스 상태, 프로세스 번호(PID), 프로그램 카운터(PC), register 값, MMU 정보, CPU 점유 시간 등 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/197</guid>
      <comments>https://smile-development.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 16 Nov 2023 17:43:55 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 운영체제</title>
      <link>https://smile-development.tistory.com/196</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;운영체제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어를 효율적으로 사용할 수 있게 관리하는 소프트웨어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴퓨터 사용자와 하드웨어 간 인터페이스로 동작하는 시스템 소프트웨어&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴퓨터 시스템의 자원들을 효율적으로 관리하여, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로그램&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴퓨터에서 어떤 작업을 실행할 수 있는 정적의 상태 파일 (exe 파일)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드디스크 등에 저장되어 있는 실행 코드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보조기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터 묶음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자가 원하는 일을 처리할 수 있도록 올바른 수행 절차를 표현해 놓은 명령어들의 집합&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행중인 프로그램&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;운영체제로부터 실행에 필요한 자원을 할당받은 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 작업(Job) 또는 태스크(Task)라고 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;메모리 구조&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgv0EL/btsAhdXOtLl/fJet5RhSBPpIYUPMT2fM90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgv0EL/btsAhdXOtLl/fJet5RhSBPpIYUPMT2fM90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgv0EL/btsAhdXOtLl/fJet5RhSBPpIYUPMT2fM90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgv0EL%2FbtsAhdXOtLl%2FfJet5RhSBPpIYUPMT2fM90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;485&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CODE 영역 : 컴파일 된 소스코드가 저장되는 영역 / 프로그램 실행 코드가 저장되는 영역&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DATA 영역 : 전역 변수 / 정적 변수 / 초기화된 데이터가 저장되는 영역&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HEAP 영역 : 동저긍로 생성되는 데이터가 저장되는 영역&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;STACK 영역 : 임시 데이터(함수, 지역변수 등)가 저장되는 영역&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스택 프레임&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;함수를 실행하면 함수 결과로, 리턴될 주소가 스택에 저장되고 함수의 지역 변수들이 차례로 스택에 쌓이게 됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;함수가 다 실행되고 나면 스택에 있던 데이터들이 차례대로 삭제되고, 스택에 저장되어 있던 리턴될 주소도 지워지면서 해당 주소로 이동한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스택을 이용하여 만든, 함수를 실행하기 위한 구조를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&quot;스택 프레임&quot;&lt;/b&gt;&lt;/span&gt;이라고 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로세스 구조&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buelGi/btsAbcykySt/0ErGCohLsWLrtwBNIbhf0k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buelGi/btsAbcykySt/0ErGCohLsWLrtwBNIbhf0k/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buelGi/btsAbcykySt/0ErGCohLsWLrtwBNIbhf0k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuelGi%2FbtsAbcykySt%2F0ErGCohLsWLrtwBNIbhf0k%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;272&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;각 프로세스는 독립된 영역 (Code Data Heap Stack)을 할당 받음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Code 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 명령을 포함하는 코드들이 들어가는 부분&lt;/li&gt;
&lt;li&gt;프로그램 시작할 때 컴파일한 프로그램(기계어)가 저장되어 있음&lt;/li&gt;
&lt;li&gt;읽기 전용 영역으로, 프로세스가 함부로 변경할 수 없고 변경 시 오류를 발생시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 실행될 때 프로그램이 종료되면 시스템에 반환됨&lt;/li&gt;
&lt;li&gt;전역변수, 정적변수, 배열, 구조체 등이 저장됨&lt;/li&gt;
&lt;li&gt;Data 영역은 다시 Data(GVAR) 영역과 BSS 영역으로 난무&lt;/li&gt;
&lt;li&gt;초기화된 데이터는 Data(GVAR) 영역에 저장되고, 초기화하지 않은 데이터는 BSS 영역에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Heap 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리를 동적으로 할당할 때 사용되는 메모리 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stack 영역&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 자동으로 사용하는 메모리 영역&lt;/li&gt;
&lt;li&gt;함수 호출과 관계되는 지역변수와 매개변수가 저장됨&lt;/li&gt;
&lt;li&gt;함수 호출시 생성되고 함수가 끝나면 반환됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스레드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thread는 어떤 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvqSt/btsAjvDs9z5/A63kVrkI6aqFF4S2LgPXOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvqSt/btsAjvDs9z5/A63kVrkI6aqFF4S2LgPXOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvqSt/btsAjvDs9z5/A63kVrkI6aqFF4S2LgPXOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvqSt%2FbtsAjvDs9z5%2FA63kVrkI6aqFF4S2LgPXOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;212&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 내에서 각 Stack만 따로 할당받고, Code Data Heap 영역은 공유함&lt;/li&gt;
&lt;li&gt;스레드는 프로세스 내 주소 공간이나 자원들(Heap 공간 등)을 같은 프로세스 내 스레드끼리 공유하며 실행&lt;/li&gt;
&lt;li&gt;같은 프로세스 내 여러 스레드들은 같은 Heap 공간을 공유&lt;/li&gt;
&lt;li&gt;프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;멀티 프로세스 vs 멀티 스레드&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1601&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1bpX/btsAa8W8tkp/2y63tm0oa80uDofBdYaQb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1bpX/btsAa8W8tkp/2y63tm0oa80uDofBdYaQb0/img.png&quot; data-alt=&quot;멀티프로세스 vs 멀티 스레드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1bpX/btsAa8W8tkp/2y63tm0oa80uDofBdYaQb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1bpX%2FbtsAa8W8tkp%2F2y63tm0oa80uDofBdYaQb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;437&quot; data-origin-width=&quot;1601&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멀티프로세스 vs 멀티 스레드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 11.124%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;멀티 프로세스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.4263%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;멀티 스레드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 11.124%; text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구조&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%; height: 20px;&quot;&gt;하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 구조&lt;/td&gt;
&lt;td style=&quot;width: 45.4263%; height: 20px;&quot;&gt;하나의 프로그램을 여러 개의 스레드로 구성하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.124%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%; height: 17px;&quot;&gt;여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 프로세스들이 있기 때문에 영향이 확산되지 않음&lt;/td&gt;
&lt;td style=&quot;width: 45.4263%; height: 17px;&quot;&gt;1. 멀티 스레드는 Stack을 제외한 자원들을 공유하기 때문에 Context Switching 시에 캐시 메모리를 비울 필요가 없고, 리소스를 아낄 수 있음&lt;br /&gt;&lt;br /&gt;2. Stack 이외에 메모리를 공유하기 때문에 통신의 부담이 적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.124%; text-align: center; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.4496%; height: 17px;&quot;&gt;1. Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등 &lt;u&gt;&lt;b&gt;오버헤드&lt;/b&gt;&lt;/u&gt;가 발생함&lt;br /&gt;&lt;br /&gt;2. 프로세스는 각 독립된 메모리 영역을 가지고 있기 때문에 프로세스 사이에서 공유하는 메모리는 없음&lt;br /&gt;&lt;br /&gt;3. Context Switching이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 함&lt;br /&gt;독립된 영역 때문에 프로세스 간 통신이 필요함&lt;/td&gt;
&lt;td style=&quot;width: 45.4263%; height: 17px;&quot;&gt;1. 내부의 메모리를 공유하고 있어서 한 프로세스의 스레드가 문제가 발생하면 해당 프로세스 안의 다른 스레드에도 문제가 발생&lt;br /&gt;&lt;br /&gt;2. 같은 데이터를 공유하기에 동기화에 신경써야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Context Switching&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로세스가 CPU를 사용중인 상태에서 인터럽트로 인해 다른 프로세스의 CPU 사용을 위해, 이전 프로세스 상태를 PCB에 보관하고 새로운 프로세스 상태를 적재하는 작업&lt;/li&gt;
&lt;li&gt;한 프로세스의 문맥(상태)는 프로세스 제어블록(PCB)에 기록되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS공부/기본기술</category>
      <category>운영체제</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/196</guid>
      <comments>https://smile-development.tistory.com/196#entry196comment</comments>
      <pubDate>Wed, 15 Nov 2023 22:45:13 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 메모리</title>
      <link>https://smile-development.tistory.com/195</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전자 회로에서 데이터나 상태, 명령어 등을 기록하는 장치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;메모리 계층&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1693&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CdGy9/btsAjv4rMWn/IweR5r4fGPkaecI8rToiT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CdGy9/btsAjv4rMWn/IweR5r4fGPkaecI8rToiT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CdGy9/btsAjv4rMWn/IweR5r4fGPkaecI8rToiT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdGy9%2FbtsAjv4rMWn%2FIweR5r4fGPkaecI8rToiT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;354&quot; data-origin-width=&quot;1693&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하위계층으로 갈수록 용량이 늘어나고, 가격이 저렴하지만, 속도가 느림&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상위계층으로 갈수록 용량은 적고, 가격이 높지만, 속도가 빠름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레지스터와 캐시는 CPU 내부에 존재 &amp;rarr; CPU에 빠르게 접근 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기억장치(=메모리)는 CPU 외부에 존재 &amp;rarr; 레지스터와 캐시보다 CPU에 늦게 접근&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보조기억장치(=하드디스크)는 CPU에 접근할 방법이 없음&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드디스크 데이터를 메모리로 이동시키고, 메모리에서 접근해서 가능 = &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&quot;느린 접근&quot;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000; background-color: #ffc9af;&quot;&gt;&lt;b&gt;1. 보조기억장치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물리적인 디스크가 연결되어있는 저장장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기억장치보다는 느림&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전원을 끄더라도 저장된 데이터가 사라지지 않은 비휘발성이며, 영구적으로 보관 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대표적으로 HDD와 SSD가 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;HDD(Hard Disk Driver)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkJXN2/btsAakjzl53/gcNqsomvSV0fI5KZsMymqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkJXN2/btsAakjzl53/gcNqsomvSV0fI5KZsMymqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkJXN2/btsAakjzl53/gcNqsomvSV0fI5KZsMymqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkJXN2%2FbtsAakjzl53%2FgcNqsomvSV0fI5KZsMymqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;306&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드디스크라 불리우는 보조장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물리적인 디스크를 고속으로 회전시켜 데이터를 저장하는 장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;충격에 약하며, 소음이 다소 발생&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 대중적인 보조기억장치였지만, 크기가 작고 처리속도가 향상된 SSD가 나오면서 많이 소명됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SSD(Solid State Driver)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzFdG/btsAjhFmrsb/RHroTjZ74p4gYTDMqHq7AK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzFdG/btsAjhFmrsb/RHroTjZ74p4gYTDMqHq7AK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzFdG/btsAjhFmrsb/RHroTjZ74p4gYTDMqHq7AK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzFdG%2FbtsAjhFmrsb%2FRHroTjZ74p4gYTDMqHq7AK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;800&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반도체 기반 정보를 저장하는 보조기억장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물리적으로 데이터를 저장하지 않고, 전기적으로 데이터를 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;HDD보다 속도가 월등히 빠르고, 소음도 발생하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전력 소모가 적고, 경량/소형화 할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;But HDD에 비해 가격이 높음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffc9af;&quot;&gt;&lt;b&gt;2. 주기억장치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;흔히 &quot;메모리&quot;라고 하는 영역&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴퓨터 내부에서 CPU가 처리하고 있는 내용을 저장하고 있는 기억장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU 명령에 의해 기억된 장소에 직접 접근하여 읽고 쓸 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대표적으로 RAM과 ROM이 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;RAM(Random Access Memory)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCqJB/btsAc5sghg5/3JqeIMRkir21ouFsxJEmn1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCqJB/btsAc5sghg5/3JqeIMRkir21ouFsxJEmn1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCqJB/btsAc5sghg5/3JqeIMRkir21ouFsxJEmn1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCqJB%2FbtsAc5sghg5%2F3JqeIMRkir21ouFsxJEmn1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;638&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;읽고 쓰기가 가능함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;응용프로그램, 운영체제 등을 불러와 CPU가 작업할 수 있도록 하는 기억장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 읽는 속도와 기록하는 속도가 같고 프로그램을 로딩하거나 데이터를 임시 저장할때 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전언이 끊어지면 데이터가 전부 지워지는 휘발성 메모리(Volatile Memory)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;ROM(Read Only Memory)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brw5W0/btsAjjXu65X/hVB9089DW3jI3nnfRnEmp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brw5W0/btsAjjXu65X/hVB9089DW3jI3nnfRnEmp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brw5W0/btsAjjXu65X/hVB9089DW3jI3nnfRnEmp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrw5W0%2FbtsAjjXu65X%2FhVB9089DW3jI3nnfRnEmp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;172&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전원이 끊어져도 기록된 데이터들이 소멸되지 않는 비휘발성 메모리(Non- Volatile Memeory)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오직 기억된 데이터를 읽기만 가능한 장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터를 저장한 후 반영구적으로 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffc9af;&quot;&gt;&lt;b&gt;3. 캐시 메모리&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK5Wt1/btsAjOiDKvT/LcPjOtrK8Pc2TRFTmStUG0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK5Wt1/btsAjOiDKvT/LcPjOtrK8Pc2TRFTmStUG0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK5Wt1/btsAjOiDKvT/LcPjOtrK8Pc2TRFTmStUG0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK5Wt1%2FbtsAjOiDKvT%2FLcPjOtrK8Pc2TRFTmStUG0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;1004&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU의 처리속도와 주기억장치의 접근 속도 차이를 줄이기 위해 사용되는 고속 Buffer Memory&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;캐시메모리 특징&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU가 주기억장치에서 저장된 데이터를 읽어올 때 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤, 다음 이용할때 캐시메모리에서 먼저 가져오면서 속도를 향상시킴&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메모리 계층 구조에서 가장 빠른 소자이며, 처리속도가 거의 CPU 속도와 비슷하다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주기억장치를 접근하는 횟수가 줄어들어, 컴퓨터 처리속도가 향상된다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;캐시메모리 작동 원리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시가 효율적으로 동작하려면, 캐시에 저장할 데이터가 지역성을 가져야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ 지역성 : 데이터 접근이 시간적, 혹은 공간적으로 가깝게 일어남&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;u&gt;&lt;b&gt;시간 지역성&lt;/b&gt;&lt;/u&gt; : 특정 데이터가 한번 접근되었을 경우, 가까운 미래에 또 한번 데이터에 접근할 가능성이 높음&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, For / while 반복문에 사용되는 데이터는 참조될 가능성이 높으므로 다시 저장함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;u&gt;&lt;b&gt;공간 지역성&lt;/b&gt;&lt;/u&gt; : 액세스된 기억장소와 인접한 기억장소가 액세스될 가능성이 높음.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, 배열에서 연속 접근시 참조된 데이터 근처에 있는 데이터가 참조 가능성이 높으므로 저장&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc9af; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4. 레지스터&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 다목적 공간&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로세스 내부에 있는 작은 공간으로 연산제어, 디버깅 등 목적으로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공간은 작고 가격은 비싸지만, CPU에 직접 연결되어 있어 연산 속도가 RAM, HDD, SSD보다 빠름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CPU는 자체적으로 데이터를 저장할 수 없으므로 레지스터를 이용하여 연산처리 및 번지지정을 도움&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레지스터와 캐시의 차이점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시 : CPU와 별도로 있는 공간, 메인 메모리와 CPU 간의 속도 차이를 극복하기 위함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레지스터 : CPU 안에서 연산을 처리하기 위해 데이터를 저장하는 공간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레지스터와 캐시의 공통점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어떤 명령어나 데이터를 저장해두는 저장 공간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS공부/기본기술</category>
      <author>희주(KHJ)</author>
      <guid isPermaLink="true">https://smile-development.tistory.com/195</guid>
      <comments>https://smile-development.tistory.com/195#entry195comment</comments>
      <pubDate>Mon, 13 Nov 2023 15:42:46 +0900</pubDate>
    </item>
  </channel>
</rss>