<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Little Jay</title>
    <link>https://littlejay.tistory.com/</link>
    <description>Developing My Self,  with Competence and Stability</description>
    <language>ko</language>
    <pubDate>Sun, 5 Jul 2026 09:34:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jay, Lee</managingEditor>
    <item>
      <title>두 도시 이야기 - 찰스 디킨스</title>
      <link>https://littlejay.tistory.com/325</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;최고의 시절이자 최악의 시절이요, 지혜의 시대이자 어리석음의 시대였다. 믿음의 세기이자 의심의 세기였으며, 희망의 봄이면서 절망의 겨울과 같은 계절이었다. 우리 앞에는 무엇이든 있었지만 한편으로는 아무 것도 없었다. 우리는 모두 천국을 향해 가고 있었지만, 우리는 다른 방향으로 걸어 나가고 있었다.&amp;nbsp;&amp;nbsp; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;찰스 디킨스의 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;두 도시 이야기&lt;/span&gt;&lt;span&gt;&amp;rsquo;, p. 3)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가난한 사람들의 삶은 슬픔 자체요&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;절망이었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;다수의 민중들은 소수의 귀족에게 억압받았다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;귀족들의 폭력적인 정치와 부당한 수탈은 계속되었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;복수를 품은 분노가 드리우던 사회에서&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;중세 시대의 모순을 뿌리뽑은 프랑스 혁명은 올바른 도시에서의 삶의 서막을 열었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그렇다면 사회적&lt;/span&gt;&lt;span&gt;&amp;middot;&lt;/span&gt;&lt;span&gt;경제적 지위에 따른 불평등이나 차별이 완전하게 사라졌다고 할 수 있을까&lt;/span&gt;&lt;span&gt;. &amp;lsquo;&lt;/span&gt;&lt;span&gt;두 도시 이야기&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;를 통해&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;우리는 오늘날을 아우르는 시대를 살아가는 우리 자신을 되돌아 볼 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;커다란 소용돌이&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;혹은 혁명 속 등장인물들의 운명과 삶은 우리의 또 다른 형태의 초상화로 볼 수 있을 것이다&lt;/span&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;&lt;span&gt;마네트 박사는 에브레몽드 후작의 만행에도 불구하고 이성과 지성을 저버리지 않았기에 &lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;년 간 감옥에 갇히는 기구한 운명을 겪게 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그 후 그는 귀족의 조카인 찰스를 사위로 받아들이는&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;용서하고 수용하는 삶을 선택한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;찰스는 그의 충실한 하인을 구하기 위해 그의 사회적 지위와 그가 누릴 수 있었던 특권을 포기하고 파리로 돌아간다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;마네트 박사의 딸인 루시를 사랑했던 영국 남자 시드니는 비록 그녀가 다른 이와 혼인하였음에도 그녀의 남편을 구하는 등 그녀의 행복을 위해 삶을 바친다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;소설에 등장하는 등장인물들은&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그들의 생명을 위협하는 폭력과 시련에 마주하고 있음에도&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;타인을 향한 따뜻한 인간애와 헌신을 실현하며 그들만의 삶을 만들어 나간다&lt;/span&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;&lt;span&gt;그러나&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;에브레몽드 후작은 같은 귀족 출신이자 그의 조카인 찰스와는 뚜렷하게 대비된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그는 세상 만물을 자신의 지위와 힘을 유지하고 그의 개인적 부를 확장하기 위한 수단으로 사용하려는 생각으로 가득 차 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그는 그의 소작농들을 착취하였으며 세금을 더 내려 하지 않는다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그럼에도 불구하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;에브레몽드 후작은 한 아이가 자신의 마차로 인해 죽임을 당했음에도 전혀 양심의 가책을 느끼지 않는다&lt;/span&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;&lt;span&gt;찰스와는 대조적인 삶을 사는 귀족인 에브레몽드 후작의 삶을 매개로&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;작가는 인간이 얼마나 끔찍하고 잔혹해 질 수 있는지를 또렷이 보여주면서 모두에게 물음을 던지고 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;무엇이 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;찰스형&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;인간과 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;에브레몽드 후작&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;형 인간을 만들어 낸 것일까&lt;/span&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;&lt;span&gt;뒤파르주 부인은 뜨개질을 하며 과거에 느꼈던 분함을 적어 내려가며 복수를 꿈꾼다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;혁명을 일으킨 사람들 중 다수는 죽음을 복수하는 방법은 또 다른 죽음뿐이라고 믿었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그들은 앙갚음을 통해 모든 것을 뒤엎고자 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;자신이 고통 받았던 방법대로 에브레몽드 가문을 몰락시키려는 뒤파르주 부인이나&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;혹은 폭동을 통해 귀족들의 머리를 베어내는 뒤파르주 씨와 그 무리를 생각해보자&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그들의 행동은&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자신으로 인한 아이의 죽음에도 눈 하나 깜짝하지 않는 에브레몽드 후작의 행동과는 다른 것일까&lt;/span&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;&lt;span&gt;책 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;두 도시 이야기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;에 고스란히 드러나는 복수를 위한 무분별함&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;또 다른 피와 폭력과 희생을 요구하는 피비린내 나고 폭력적인 행위&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;는 우리가 어떤 모습의 사회를 만들어 가야 하는가에 대한 의문의 연장선을 긋는다&lt;/span&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;&lt;span&gt;시리아 동부와 이라크의 북서부를 장악하였으며 전 세계를 위험에 빠뜨릴 일촉즉발의 상황으로 몰아 온 급진 이슬람 수니파 무장단체인 이슬람국가&lt;/span&gt;&lt;span&gt;(IS)&lt;/span&gt;&lt;span&gt;가 저지르는 극악무도한 살인과 테러 행위, &lt;/span&gt;&lt;span&gt;노동자들의 대우&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;급여&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;근무 조건에서의 평등을 실현하는 데 실패한 사회 모습을 고발하는 기사들, &lt;/span&gt;&lt;span&gt;날마다 일간신문이나 뉴스를 장식하는 사회적 갈등이나 쟁점들을 떠올려보자.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;비록 책 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;두 도시 이야기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;속 역사적인 장면들과는 꽤 다른 측면으로 보여지나&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;다른 형상을 한 채 오늘날까지도 끊임없이 반복되어 나타나고 있을 뿐이다&lt;/span&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;&lt;span&gt;다른 정치적&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;사회적&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;경제적 지위와 상황에 놓인 다양한 사람들이 공존하는 사회에서 충돌&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;사회적 불안과 갈등&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그리고 극단적인 개인주의는 불가피한 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그렇다면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이런 사회에서 꿈과 희망을 노래하고 행복을 추구하며 살아가는 사람들은 어떻게 설명할 수 있을까&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;그들의 마르지 않는 원천은 무엇이며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;어디에 있는 것일까&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;이 질문에 대한 답은 우리의 내면 안에 있다&lt;/span&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;&lt;span&gt;역사의 한 장 속 등장인물들의 삶은&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;같은 하늘 아래에서도 분명히 다르다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;포용적이며 인간적인 삶을 영위하는 마네트 박사&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;찰스&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시드니와 같은 사람이 있었는가 하면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;피도 눈물도 없이 잔인한 에브레몽드 후작과 같은 사람이 있으며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;뒤파르주 부부 혹은 복수의 칼날을 가는 혁명군과 같이 대갚음을 위해 수단과 방법을 가리지 않는 사람도 존재한다&lt;/span&gt;&lt;span&gt;. &amp;lsquo;&lt;/span&gt;&lt;span&gt;최고의 시절이자 최악의 시절이었던&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;시대에서 그들에게 주어졌던 것은&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;대부분이 극과 극이었던 선택지였다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;다시 말해&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;같은 하늘 아래에서 사는 사람들의 각기 다른 모습은 그들이 내린 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;선택&lt;/span&gt;&lt;span&gt;&amp;rsquo;&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;. &amp;lsquo;&lt;/span&gt;&lt;span&gt;두 도시 이야기&lt;/span&gt;&lt;span&gt;&amp;rsquo; &lt;/span&gt;&lt;span&gt;속 등장인물들은 주어진 역사적 상황에서 그들의 운명과 삶의 방식을 결정한 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 이 모든 것은 의지가 발현되어 나타난 결과이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;물론 숭고한 희생 혹은 풍족한 삶과 같은 선택을 절대적인 선과 악으로 판단할 수는 없다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러나 분명한 것은&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;공존하는 사회와 파멸하는 사회의 차이는 구성원들의 의지에 달려있다는 것이다&lt;/span&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;lsquo;결정적인&amp;rsquo; 존재로 만드는 것이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Book Review</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/325</guid>
      <comments>https://littlejay.tistory.com/325#entry325comment</comments>
      <pubDate>Sat, 3 Jun 2023 00:05:04 +0900</pubDate>
    </item>
    <item>
      <title>화씨451 - 레이 브레드버리</title>
      <link>https://littlejay.tistory.com/324</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;법을 잘 알고 있겠지? 도대체 정신이 있는거야, 없는 거야? 누가 이런 책들을 갖고 있으라 그랬나? 이런 골방에다가 책을 몇 년 동안이나 몰래 모아 놓고서 어쩔 셈이었지? 바벨탑이라도 쌓으려고 했나? (레이 브레드버리의 &amp;lsquo;화씨 451&amp;rsquo;, p.68)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;우리가 이 인용구에서 볼 수 있듯이&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;화씨 &lt;/span&gt;&lt;span&gt;451 &lt;/span&gt;&lt;span&gt;작품 안에서는 정부가 개인은 책을 읽을 수 없다는 법을 제정해놨기 때문에 어떠한 사람도 책을 읽을 수 없다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;왜 정부는 책을 읽는 것을 금지했을까&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;나는 아마도 책을 통해서 사람들이 어떠한 상황에 대해 상상하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그에 대한 해결책을 스스로 찾으려 할 수 있기 때문일 것이라고 생각한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;사회를 통제하기 위해서는&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시민을 단일화 하고 그들이 정부에 대항하지 못하도록 하는 것이 근본적이며 가장 중요하다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러므로 사고를 위한 수단과 매체를 약탈하는 것은 사회 통제에 있어서 가장 큰 핵심이다&lt;/span&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;&lt;span&gt;&amp;nbsp;과거에&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;사고를 위한 수단은 아마도 단지 책&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;신문&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;혹은 사람들 간의 대화였을 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러나 시간이 지남에 따라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;사고를 위한 수단은 점점 더 다양화되어갔다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;우리는 단순히 책과 신문과 대화를 통해서 상상하고 생각할 수 있을 뿐만아니라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;현대 가장 접하기 쉽고 널리 퍼져있는 텔레비전&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;라디오 심지어는 핸드폰과 &lt;/span&gt;&lt;span&gt;SNS&lt;/span&gt;&lt;span&gt;를 통해 사고할 수 있게되었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;오늘날, 수 많은&lt;/span&gt;&lt;span&gt; 사람들이&amp;nbsp;&lt;/span&gt;&lt;span&gt;SNS&lt;/span&gt;&lt;span&gt;를 사용하고 있으며 &lt;/span&gt;&lt;span&gt;SNS&lt;/span&gt;&lt;span&gt;를 통해서 사람들은 방대한 양의 정보를 접하고 세계 각지의 시사이슈를 다른 어떠한 것들보다 더 빠르게 접할 수 있게되었다&lt;/span&gt;&lt;span&gt;. SNS&lt;/span&gt;&lt;span&gt;사용자들은 단순히 정보와 시사이슈를 얻을 수 있을 뿐만아니라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그들은 세계각지의 사람들과 자신들의 일상&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;나라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;심지어는 정치와 경제에 대해서 의사소통할 수 있다&lt;/span&gt;&lt;span&gt;. SNS &lt;/span&gt;&lt;span&gt;덕분에 많은 사람들은 다양한 사람들과 다양한 정보와 다양한 사고와 함께 연대할 수 있게 되었다&lt;/span&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;&lt;span&gt;&amp;nbsp;그러나&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;몇몇 국가와 정부는 뉴스&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;라디오&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;텔레비전 프로그램&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;SNS&lt;/span&gt;&lt;span&gt;를 포함한 미디어를 통제하고 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이러한 국가에서&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;언론의 통제는 사람들의 생각을 표현하지 못하게&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;심지어는 사고자체를 금지하기 때문에&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이러한 언론 통제 국가의 시민들은 생각할 자유와 표현할 자유를 잃어버리게 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;CPJ (Citizens for Public Justice)&lt;/span&gt;&lt;span&gt;에 따르면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;대표적인 언론통제 국가는 쿠바&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;미얀마&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;중국&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이란&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;아제르바이잔&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;에티오피아&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;에리트레아&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;북한&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;사우디아라비아&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그리고 베트남이 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이러한 국가에서는 어떠한 사람도 그들의 생각을 자유롭게 표현할 수 없으며 그들은 점점 단일화 되어가며 &lt;/span&gt;&lt;span&gt;&amp;lsquo;&lt;/span&gt;&lt;span&gt;화씨 &lt;/span&gt;&lt;span&gt;451&amp;lsquo;&lt;/span&gt;&lt;span&gt;의 밀드레드처럼 사고의 중요성에 대해 점점 망각하게 된다&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt;달걀을 가로로 깨트리느니 차라리 죽음을 택한 사람들이 1만 하고도 1000명은 되는 것으로 추산된다. 밀드레느느 홀 건너 쪽에 앉아 있다. &amp;ldquo;그게 무슨 소리죠? 아무것도 아니잖아요! 서장 말이 맞다니까요!&amp;rdquo; (레이 브레드버리의 &amp;lsquo;화씨 451&amp;rsquo;, p.113)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;중국정부는 사고의 자유와 표현의 자유와&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시민의 알권리가 국가와 시민의 사생활 보호를 위할뿐만 아니라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;언론통제를 포함하고 있다고 주장하며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;심지어는 이 두가지 개념은 완전히 다른것이라고 주장한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;중국 정부는 편향된 사고와 표현의 자유는 시민들의 권리를 해칠 수 있으며 정부의 재판관할권을 위협할뿐만 아니라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;국가의 안전을 위협할 수도 있다고 주장한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;따라서 중국정부는 사고와 표현의 자유의 남용으로 인해 일어나는 피해를 막기 위해 언론통제가 필요하다고 역설한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그러나 중국정부는 합리적인 통제를 진행하는 것처럼 보이지 않고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그들은 단순히 그들의 국가와 시민을 더 쉽게 통제하기 위해 언론을 통제하는것처럼 보인다&lt;/span&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;&lt;span&gt;&amp;nbsp;중국의 언론통제의 대표적 사례로는 &lt;/span&gt;&lt;span&gt;2008&lt;/span&gt;&lt;span&gt;년 베이징 올림픽과 쓰촨성 대지진 발생 때의 사례가 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;인터넷과 미디어의 통제와 검열을 담당하는 중국의 선전부&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;홍보부&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;는 베이징 올림픽의 언론 보도를 신화통신과 &lt;/span&gt;&lt;span&gt;CCTV &lt;/span&gt;&lt;span&gt;방송사에 &lt;/span&gt;&lt;span&gt;90%&lt;/span&gt;&lt;span&gt;이상을 할당했으며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시민들의 시민의식 함양을 위하여 그들이 작성하는 기사와 보도하는 내용은 무조건적으로 올림픽 개최의 긍정적인 측면만을 다뤄야 함을 명령하였다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;또한 중국의 선전부는 테러리즘이나 식품안전 문제와 같은 예민하고 감각적인 문제를 포함한 기사나 보도는 일체 금지하였다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;만약&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;통신사가 이러한 명령을 어길 경우&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;통신사와 언론사는 벌금을 납부해야하였으며 사업정지등의 엄격한 처벌을 받아야만 하였다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;쓰촨성에서 대지진이 일어났을 때는&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;중국정부는 지진에 관한 정부의 언급의 부재에 관하여 보도를 하는 경우 벌금을 부과했고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;비판과 민감한 정치적 문제를 피하려고 하였다&lt;/span&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;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;우리는 과연 이러한 언론통제가 사회를 효율적으로 정당하게 통제하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시민을 보호하기 위한것이라고 말할 수 있겠는가&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;민주주의 국가의 사람으로&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;나는 이러한 통제는 시민을 위한 것이 아닌 오로지 국가와 특권계급을 위한 것이라고 말할 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;나는 언론통제는&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;미디어 통제의 법률과 정책의 부족으로부터 파생된 모순이라고 생각한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이러한 합당하지 않은 언론통제를 좀 더 효율적인 언론통제로 만들기 위해서&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자유와 규제의 균형을 맞추기 위해서는 중국정부 뿐만아니라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;세계의 모든 정부가 언론과 사고와 표현의 자유에 대한 법률을 제정해야 하며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;시민들 또한 규제와 억압의 비합리성에 대해서는 비판해야 하며&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;정부로부터 진정한 자유를 요구해야 한다고 생각한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그렇다면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;우리는 비로소 진정한 자유와 진정한 생각과 표현의 자유를 획득할 수 있을 것이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Book Review</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/324</guid>
      <comments>https://littlejay.tistory.com/324#entry324comment</comments>
      <pubDate>Sat, 22 Apr 2023 21:23:25 +0900</pubDate>
    </item>
    <item>
      <title>변신 - 프란츠 카프카</title>
      <link>https://littlejay.tistory.com/323</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;어느 아침, 그레고르 삼자가 불안한 꿈에서 깨어났을 때 그는 침대 속에서 한 마리의 흉측한 갑충으로 변해 있는 자신의 모습을 발견했다.(변신, 프란츠 카프카, p.6)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;프랑스의 유명한 비평가 롤랑 바르트는 &amp;ldquo;플로베르는 소설을 쓴 것이 아니다. 그는 단지 한 문장을 다른 하나와 연결시켰을 뿐이다. 문장과 문장 사이의 에로스가 플로베르 소설의 본질인 것이다.&amp;rdquo;라는 말을 한 것으로 알려져 있다. 제 2차 세계대전 당시의 사람으로 독일어를 사용하는 유태인. 즉 이중의 이방인이라 할 수 있는 프란츠 카프카는 이 에로스를 이용해 한 중산층 보험팔이 말단 직원의 모습을 효과적으로 풀어낸다. 이 책에 단점이 있다면 조금 느릴 수 있다는 점이다. 그러나 나는 느리다기 보다는 정교함과 묘사가 너무도 많아 그런 것이 아닐까라고 생각해 보았다. 가득하다고 보는 것이 더욱 적합하다. 카프카는 한 물건이나 인물, 그리고 설정을 놓아도 많은 생각과 사고 후에 놓은 티가 날 정도로 치밀하게 놓은 것이었다. 그리고 이렇게 만들어 진, 그레고르 삼자의 한탄과 가족들의 행동과 대사와 같은 정밀한 요소들은 실존주의를 이루고 인간의 모습을 이룬다.&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;color: #000000;&quot;&gt;&amp;nbsp;이 걸작은 니체와 도스토옙스키의 주장에 깊게 뿌리박고 있다. &amp;ldquo;실존주의자&amp;rdquo;라 불리는 그는 모든 신을 부정하고 그들이 가지고 있는 신성함도 부정하였디. 이 생각은 안톤 체호프와 어니스트 헤밍웨이와 같은 허무주의와 비슷한 맥을 따르나 그들은 인류에 희망을 걸고 있다는 점에서 차이를 보인다. 니체의 생각을 신봉하며, 그리고 신성한 존재로서의 신들의 빈칸을 채우기 위해 카프카는 그의 소설들에서 간단한 질문을 제시한다. 만일 모든 형태로의 신들이 죽고 신성하지 않다면 그들의 자리는 누가 채울 수 있을까? 그 어느 누군가가 그들의 부재를 채울 수 있는가?&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;그는 그의 동생이 마음에 지니고 있던 따뜻함으로 무엇을 하였는지 절대 예측할 수 없었을 것이다. 그녀는, 그의 입맛을 시험해보기 위하여, 오래된 신문 위에 선택할 수 있도록 여러 메뉴를 가지고 왔다. 그곳에는 반쯤 썩은 야채들과 지금은 거의 굳은 하얀 소스로 뒤덮인, 어제 저녁에서 남은 뼈와 함께 조금의 건포도와 아몬드, 그레고르가 이틀 전 먹지 못 할 것이라 단정지은 치즈, 마른 빵 한 조각, 버터를 바른 소금 처리된 빵 한 조각이 놓여 있었다. 이 모든 것들과 함께 그녀는 그릇 하나를 놓았고 (그 그릇은 아마 그레고르를 위하여만 쓰일 것이다) 그릇에 물을 부었다. 그녀는 빨리 방을 나갔고 심지어는 자물쇠의 열쇠를 돌리기까지 하였는데, 그것은 그레고르가 이제는 자신을 편안히 할 수 있다는 사실을 인식시키기 위해서였다.&amp;nbsp;(변신, 프란츠 카프카, p.46)&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;부모님&amp;rsquo;, 그레고르의 동생이 대화를 시작하는 방식으로 책상을 치며 말헀다. &amp;lsquo;이제는 이러한 방법으로는 살 수 없어요. 이해하실 수 없으실 수 있지만, 저는 이해합니다. 저는 이제는 저 괴물 앞에서 제 오빠의 이름을 부르지 않을 것이고, 이제는 저희가 저것을 치우려고 노력해야 합니다. 저희는 인간의 선에서 할 수 있어서 할 만큼 했습니다. 저희는 저것을 돌보고 침착하게 기다려줬습니다. 저희를 비판할 수 있는 사람은 없을 것이라고 확신합니다.(변신, 프란츠 카프카, p.97)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;세상에서 신성함을 소유하고 있는 유일한 존재는 인간밖에 없다. 신성함의 제일 기본적인 모습은 책임감과 의무감이다. 만일 신성한 사람이 있다면 그 사람은 평생 가질 감정을 완벽히 다스리는 사람일 것이다. 감정이라는 것은 방해 요소로 작용하기 때문이다. 그레고르의 가족은 그가 어떠한 계기로 그러한 식으로 변하게 되었는지 이해하지는 않은 채 이해하는 &amp;lsquo;척&amp;rsquo;을 한다. 원래부터 접촉이 없었던데다가 제일 많은 접촉을 가지고 있던 여동생마저 점차 그의 존재를 부정하게 되기 때문이다. 이 행동은 아마 부도덕하며 신성하지 않다고 느껴질 수도 있다. 신성한 존재는 이러한 일을 하지 않을 테니 말이다. 그러나 신성함을 책임감으로 본다면 그레고르의 가족들은 그들의 무관심에 책임을 완전히 지고 있기 때문에 신성하다고 당당히 말할 수 있다. 이것이 아마 신성함의 또 다른 얼굴이 아닐까. 신성함이 있으므로 우리는 우리 영혼의 절대적 지배자의 위치에서 우리를 권장하는 힘을 가지게 된다. 이 힘을 가지고 행동한다면 좋던 나쁘던 모두에게 영향을 끼치게 된다. 그러나 이 영향은 그들 주위의 인물들에게만 영향을 끼치게 된다. 유발자는 책임을 지고 행동을 한 것이기 때문에 아무런 피해를 입지 않는다. 모든 인간들은 자신의 행동에 책임을 지고 있기에 모든 행동은 신성한 것이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;그러나 이것은 사실이 아니다. 인간들은 실제 신성하지 않기 때문이다. 거의 대부분의 인간들은 모양에 상관없이 신을 믿는다는 것에 비추어보자. 만약 인간이 신성했다면 종교는 존재할 이유도 목적도 없었을 것이다. 그렇다면 왜 인간들은 신성하지 않은가?. 왜 인간을 추양하지 않는 것일까? 한 인간이 자신의 신성함에 실행한 한 행동은 다른 사람의 신성함을, 그들이 사는 방식과 같은 것들을 쓸모없게, 비활성화시킬 수 있기 때문이다. 즉, 한 영혼의 신 성함은 다른 존재의 신성함에 방해가 된다는 것이다. 모든 존재들은 연결이 되어있고, 주체적으로 행동하고 있다. 그러나 이러한 사실은 잘 알려지지 않기에 침해가 일어난다. 나는 이것이 인간들이 신성한 존재로 나아가지 못하는 이유라고 생각한다. 남의 신성함을 생각치 못하고 자신만을 생각하는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;결론적으로 우리 인간들이 우리의 영혼을 위해 수행하는 신성함을 띄는 행동들은 인간의 본성으로서 너무나도 자연스러운 욕구에 의해 가려지게 된다. 책 속에 있는 그레고르의 여동생이 그레고르가 다시 인간으로 변해 돈을 가져다 줄 것이라는 개인적인 바램과 욕심이 이루어지지 않자 바로 천대하는 모습에서 우리는 인간의 &amp;ldquo;인간다움&amp;rdquo;, 즉 &amp;ldquo;무신성&amp;rdquo;의 존재의 모습을 보게 된다. 그 존재의 행동이 그 존재 자신에게 갈등과 혼란을 가지고 왔다-도덕과 부도덕함, 신성함과 욕구의 전쟁 말이다. 사람들에게 완전히 신성함, 즉 순도 100%의 신성함으로 이루어지는 행동은 없다. 그러한 행동들은 반드시 욕구라는 성격과 맥락을 같이 한다. 예를 들면 이스라엘과 팔레스타인의 전쟁이 있다. 지금 양국은 벌써 한 달간 전쟁을 진행해 온 상태다. 하마스의 미사일 공격과 이스라엘의 방어 체계 &amp;ldquo;아이언 돔&amp;rdquo;간의 쫓고 쫓기는 술래잡기는 엄청난 양의 파괴로 이어졌다. 이 전쟁은 양국이 가지고 있는 종교적 갈등과 같은 것으로 한층 심화되었다. 가디언지에 이르면 이 의미 없는 술래잡기는 7월 7일 하마스가 2012년 이후 처음으로 이스라엘에게 미사일을 쏜 점을 시인하며 시작되 하마스의 게릴라 부대와 이스라엘의 미사일 보복으로 이어지고 있다. 이스라엘의공격 전술은 잔혹하였는데, 눈 주위 가려움증부터 인간 세포 조직 화상, 간, 심장, 그리고 콩팥 손상과 심지어는 죽음에도 이를 수 있는 백린탄을 사용했다. 이스라엘은 자신의 국가의 신성함, 자신의 국가를 보호하기 위해 행동했지만 그 결과는 팔레스타인에게도, 자신에게도 독이 되어 돌아왔다. 고통에 시달리며 죽은 팔레스타인 시민들은 셀 수 없을 정도이고, 반유대 시위는 전 세계를 휩쓸었다. &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;color: #000000;&quot;&gt;&amp;nbsp;인간들은 특이한 존재이다. 그들은 창조하며 소멸시키기도 한다. 바로 이 성격이 우리를 신성하게 만드는 것이다. 우리는 우리의 행동들에 대해 &amp;ldquo;불완전한 주인들&amp;rdquo;이다. 『변신』은 인간들을 엄청난 양의 묘사와 날렵한 분석으로 우리 현재의 모습 하나하나를 정확히 그려내었고 심지어는 우리가 발전할 방향까지도 제시한다. 등장인물의 모습 하나하나에서 우리는 이중적인 인간의 모습을 볼 수 있다. 한 쪽은 &amp;ldquo;완전&amp;rdquo;한, 신성하며 올바른 인간을 본다. 다른 한 쪽에서는 우리는 욕심과 욕구로 충전받아 혼란을 일으키는 인간의 모습이 보인다. 그리고 이러한 두 성격의 교차와 조화가 우리를 특별한 존재로 만들고 있는 것이다.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;</description>
      <category>Book Review</category>
      <category>변신</category>
      <category>프란츠 카프카</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/323</guid>
      <comments>https://littlejay.tistory.com/323#entry323comment</comments>
      <pubDate>Fri, 7 Apr 2023 19:17:50 +0900</pubDate>
    </item>
    <item>
      <title>[JS] IIFE를 올바르게 동작하는 방식에 대하여</title>
      <link>https://littlejay.tistory.com/322</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;IIFE(Immediate Invoked Function Expression)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 해석을 해보면 된다. 즉시 실행함수를 가리킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1678101993425&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function foo() {}();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위의 코드는 왜 실행이 안되는 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 Parser는 function foo() {} 이 부분은 함수의 선언부인 반면에 후자(괄호의 쌍)는 함수를 호출하려는 시도이지만 실제로 어떠한 이름도 지정이 된 것이 없기 때문에 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;Uncaught SyntaxError: Unexpected token ).&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 같은 에러 상황이 발생할 것이다.&amp;nbsp;&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;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 해결하기 위해서는 괄호를 추가하는 두 가지의 방법이 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678102727140&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(function foo(){ })()

(function foo(){ }())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function으로 시작하는 선언문은 함수 선언으로 간주된다. 이 함수를 () 안에 감싸버리면 뒤에 ()를 붙임으로서 실행할 수 있는 함수 표현식이 된다. 이러한 함수는 전역 범위에 노출되지 않으며 본문 내에서 자신을 참조할 필요가 없는 경우 이름을 생략할 수도 있다.&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;다른 한 방식이 또 있기는 하지만, 별로 추천하고 싶은 방식은 아니다. 이는 void operator를 추가하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678102874990&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void function foo(){ }();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 접근 방식에는 한 가지 문제가 있다. 주어진 식의 평가는 항상 'undefined'이기 떄문에 IIFE 함수가 어떤 것을 반환하더라도 이를 사용하지 못한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678102899832&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const foo = void (function bar() {
  return 'foo';
})();

console.log(foo); // undefined&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;Reference&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.frontendinterviewhandbook.com/javascript-questions#explain-why-the-following-doesnt-work-as-an-iife-function-foo--what-needs-to-be-changed-to-properly-make-it-an-iife&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.frontendinterviewhandbook.com/javascript-questions#explain-why-the-following-doesnt-work-as-an-iife-function-foo--what-needs-to-be-changed-to-properly-make-it-an-iife&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678102989672&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JavaScript trivia questions in front end interviews | Front End Interview Handbook&quot; data-og-description=&quot;Answers to Front-end Job Interview Questions - JS Questions. Pull requests for suggestions and corrections are welcome!&quot; data-og-host=&quot;www.frontendinterviewhandbook.com&quot; data-og-source-url=&quot;https://www.frontendinterviewhandbook.com/javascript-questions#explain-why-the-following-doesnt-work-as-an-iife-function-foo--what-needs-to-be-changed-to-properly-make-it-an-iife&quot; data-og-url=&quot;https://www.frontendinterviewhandbook.com/javascript-questions/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.frontendinterviewhandbook.com/javascript-questions#explain-why-the-following-doesnt-work-as-an-iife-function-foo--what-needs-to-be-changed-to-properly-make-it-an-iife&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.frontendinterviewhandbook.com/javascript-questions#explain-why-the-following-doesnt-work-as-an-iife-function-foo--what-needs-to-be-changed-to-properly-make-it-an-iife&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;JavaScript trivia questions in front end interviews | Front End Interview Handbook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Answers to Front-end Job Interview Questions - JS Questions. Pull requests for suggestions and corrections are welcome!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.frontendinterviewhandbook.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;</description>
      <category>FrontEnd/Front End Interview Handbook</category>
      <category>coding</category>
      <category>IIFE</category>
      <category>javascript</category>
      <category>면접</category>
      <category>면접대비</category>
      <category>자바스크립트</category>
      <category>즉시실행함수</category>
      <category>코딩</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/322</guid>
      <comments>https://littlejay.tistory.com/322#entry322comment</comments>
      <pubDate>Mon, 6 Mar 2023 20:43:41 +0900</pubDate>
    </item>
    <item>
      <title>[OS] Virtual Memory I (Intro)</title>
      <link>https://littlejay.tistory.com/320</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Virtual Memory&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;간단하게 정의를 해보자면, 각 Process에게 전용의 큰 메모리를 제공하는 기법이다. 실제로는 없는 메모리를 있게 보이게 하는 기법이라고 생각하면 편하다. 이전의 Paging과 Segmentation은 다음과 같은 특성을 지니고 있었다. 먼저 Process들을 조각내는 것이다. 조각냄으로서 메모리에 연속적으로 할당될 필요가 없이 단순하게 분산적재를 하기만 하면 된다. 이어지는 얘기로는 분산적재를 한 Process의 조각이 Memory공간 어디에 위치하고 있는지 알 수 있는 Mapping Table이 필요하다. 조각에 대한 정보가 있어야 어디에서 정확한 Memory의 주소를 알 수 있기 때문이다. Mapping Table의 특징은 Relocatable할 수 있어야 한다는 것이다. Address Translation이 Dynamic하게 일어나기 때문이다.&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;지금까지 다뤘던 방법은 Process가 전부 다 메모리에 올라갈 수 있다고 가정을 한 상태였다. 그러나 이제는 Virtual Memory로 인해서 모든 Process를 전부 다 올릴 필요가 없게 되었다. 예를 들어서 자주 수행되지 않는 에러코드에 대한 처리같은 경우는 Locality를 반영하면 Memory에 올라갈 필요가 크게 없다. 따라서 부분 적재(Partially-Loaded)가 필요하다. 이를 다시 정리해서 말하자면, 부분 적재가 가능한 이유는 결국 Locality가 반영이 되기 때문이다. 책에는 Kruth의 논문을 인용한 부분이 나온다. 이를 Kruth's Estimate라고 하는데, 10%의 코드가 90%의 time을 소비하는 경향이 있다고 분석한 글이다. 다시 말해서 핵심적으로만 동작하는 코드들이 존재한다 라는 말이다. 따라서 이런 아이디어들이 부분 적재의 개념과 너무 잘 맞아 떨어지는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Fetch Policy&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fetch Policy는 어느 시점에 메모리에 올릴 것인지에 대한 정책이다. 당연하게도 부분 적재를 위해 등장했다. Fetch Policy에는 크게 두 가지의 방법이 있다. 먼저 &lt;b&gt;Demand Paging&lt;/b&gt;이다. Page가 요청될 때 메모리에 적재하는 기법이다. 처음에는 Memory에 올라가지 않고, 시작 될 때 Page를 적재하고, 또 다른 Page가 요구되면 또 넣게 되는 방식이다. 이 방식은 초기에 Page Fault가 많이 발생하지만, 추후에 대부분의 Page들이 Kruth's Estimate의 로직을 따라 Optimize된다. 대부분의 OS가 이 방식을 채택하고 있다. 다른 방식 중 하나는 &lt;b&gt;Prepaging&lt;/b&gt;이라는 기법이다. 말 그대로 Page를 선반입 하는 전략이다. 미리 Page를 메모리에 올려놓아 다음 페이지까지 읽어오는 방식이다. 이 방식 역시 Locality에 따른 것이다. 예전에 언급했던 Spatial Locality를 생각하면 이 방식이 효율적으로 보일 수도 있다. 그러나 문제는 이 방식의 Miss Cost가 너무 크다는 것이다. Page Fault, 즉 Miss가 일어나게 된다면, Miss가 일어난 Page는 계속해서 내려가고 새로운 페이지가 Memory에 올라오고 이러한 악순환에 빠질 수 있게 된다. 따라서 이 방식을 많이 사용하지는 않는다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Replacement Policy(교체 전략)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이전 Paging 기법에 대해서 다룰 때 Placement Policy에 대해 다뤘던 적이 있다. Replacement Policy는 이와 정반대의 개념으로서 부분 적재가 되어 있는 메모리 중 어떤 Page Frame을 골라 Swap Out시킬 것인가에 대한 전략이다. 그렇기 때문에 교체를 당하는 Page는 안쓰이고, 안쓰일만한 Page여야 한다. Least Likely Referenced되는 Page를 찾기 위해서는 히스토리를 참고해서 어떤 페이지가 얼마나 Reference되었는지, 그리고 가까운 미래에 해당 페이지를 Reference할 계획이 있는지를 파악해야 한다. 따라서 대부분의 Policy들이 과거의 행동을 바탕으로 미래에 대한 예측을 하는 것은 필수적이다. Replacement Policy의 평가 척도 중 가장 중요하게 여겨지는 것은 Page Fault의 수 이다. 물론 Execution Time, Overhead등 여러가지 평가 척도들이 존재하지만, 교체 전략에서 중요하게 여겨지는 것은 Page Fault의 수 이며, Page Fault의 수가 적어질 수록 좋은 알고리즘이라고 평가를 받는다. 교체 전략에 대한 본격적인 설명은 다음 포스트에서 이루어지겠지만, 참고해야 할 부분이 2가지 정도가 있다. 첫 번째는 &lt;b&gt;Reference String&lt;/b&gt;이다. 이는 Page 번호의 Sequence, 즉 input으로 들어오는 친구들이다. 다음으로는 &lt;b&gt;Initial Page Fault&lt;/b&gt;인데, Demand Paging을 가정하고 있기 때문에 Initial Page Fault는 어쩔 수 없이 앉고 가야 할 부분이다. 따라서 Initial Page Fault는 세기 않을 예정이다. Replacement Algorithm에는 Optimal, FIFO, LRU, Clock, Enhanced Second Chance 등의 알고리즘 등이 있는데, 이에 대해서는 다음 포스팅에서 다루어보겠다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Univ/Operating System(OS)</category>
      <category>Computer science</category>
      <category>cs</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>virtual memory</category>
      <category>가상메모리</category>
      <category>오퍼레이팅시스템</category>
      <category>전공</category>
      <category>컴공</category>
      <category>코테</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/320</guid>
      <comments>https://littlejay.tistory.com/320#entry320comment</comments>
      <pubDate>Fri, 27 Jan 2023 17:06:46 +0900</pubDate>
    </item>
    <item>
      <title>[JS] Prototype 상속은 어떻게 이루어지는가</title>
      <link>https://littlejay.tistory.com/319</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자바스크립트 관련 단골 질문 중 하나입니다. 자바스크립트에서 모든 객체는 &lt;i&gt;&lt;b&gt;__proto__&amp;nbsp;&lt;/b&gt;&lt;/i&gt;속성을 가지고 있습니다. 단, 어떤 객체가 Object.create(null)을 사용해서 생성이 되었다면,&lt;b&gt;&lt;i&gt; __proto__&lt;/i&gt;&lt;/b&gt;는 만들어지지 않습니다. 이 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt; property는 다른 객체에 대한 참조이며, 이를 객체의 &quot;&lt;b&gt;prototype&lt;/b&gt;&quot;이라고 합니다. 만약 객체의 property에 접근하고, 해당 객체에서 property가 발견되지 않았을 때 자바스크립트 엔진(Javascript Engine)은 해당 객체의 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;를 살펴보기 시작합니다. 이때 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;만 참조하는 것이 아니라, &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;의 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;를 계속해서 찾아보는데, 이 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;중 하나에 property가 정의될 때 까지, 혹은 prototype의 Chain의 끝에 도달할 때까지 계속해서 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;의 &lt;i&gt;&lt;b&gt;__proto__&lt;/b&gt;&lt;/i&gt;를 확인합니다. 이러한 자바스크립트의 prototype의 동작은 클래식한 상속을 연상시키지만, 실제로는 위임에 조금 더 가깝다고 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이 부분에 대해서는 &lt;a href=&quot;https://davidwalsh.name/javascript-objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://davidwalsh.name/javascript-objects&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;코드를 한번 보시죠.&lt;/p&gt;
&lt;pre id=&quot;code_1674739752753&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Parent() {
  this.name = 'Parent';
}

Parent.prototype.greet = function () {
  console.log('Hello from ' + this.name);
};

const child = Object.create(Parent.prototype);

child.cry = function () {
  console.log('waaaaaahhhh!');
};

child.cry();
// waaaaaahhhh!

child.greet();
// hello from Parent

child.constructor;
// &amp;fnof; Parent() {
//   this.name = 'Parent';
// }

child.constructor.name;
// 'Parent'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.greet은 child에 define되지 않았습니다. 따라서 Javascript Engine은 해당 property가&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt; 하위 항목에 정의되어 있지 않으므로 프로토타입 체인을 위로 타고 올라가면서 상위 항목에서 상속된 .greet를 찾습니다. 그러나 출력결과는 &lt;i&gt;hello from parent&lt;/i&gt;가 나오게 됩니다. 따라서 제대로 &lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;프로토타입 메서드가 상속되려면 다음 방법 중 하나로 Object.create를 호출해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&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;background-color: #fdfdfd; color: #000000;&quot;&gt;Object.create(Parent.prototype)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;Object.create(new&amp;nbsp;Parent(null));&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;Object.create(objLiteral);&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;&amp;nbsp;그리고 주의할 점은 현재 child.constructor가 부모를 가리키고 있다는 것 역시 염두해 두어야합니다. 따라서 정확한 결과를 만들기 위해서는 다음과 같이 코드를 수정할 수 있겠습니다. 이 방법이 unique한 방법은 아닙니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674741030489&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Parent() {
  this.name = 'Parent';
}

Parent.prototype.greet = function () {
  console.log('Hello from ' + this.name);
};

function Child() {
  Parent.call(this);
  this.name = 'Child';
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

const child = new Child();

child.greet();
// hello from Child

child.constructor.name;
// 'Child'&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.frontendinterviewhandbook.com/javascript-questions#explain-how-prototypal-inheritance-works&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.frontendinterviewhandbook.com/javascript-questions#explain-how-prototypal-inheritance-works&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FrontEnd/Front End Interview Handbook</category>
      <category>inheritance</category>
      <category>javascript</category>
      <category>prototype</category>
      <category>상속</category>
      <category>자바스크립트</category>
      <category>프로토타입</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/319</guid>
      <comments>https://littlejay.tistory.com/319#entry319comment</comments>
      <pubDate>Thu, 26 Jan 2023 22:55:21 +0900</pubDate>
    </item>
    <item>
      <title>KMOOC X Coursera 수강권 이벤트</title>
      <link>https://littlejay.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.kmooc.kr/invitation-banner&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.kmooc.kr/invitation-banner&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673789289879&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;| K-MOOC&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.kmooc.kr&quot; data-og-source-url=&quot;http://www.kmooc.kr/invitation-banner&quot; data-og-url=&quot;http://www.kmooc.kr/invitation-banner&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gsoCh/hyRi8RRIzr/TKxl0OC5ai4bWYd5xKffEK/img.png?width=1100&amp;amp;height=2173&amp;amp;face=713_988_787_1069,https://scrap.kakaocdn.net/dn/QPARo/hyRhFRjjRK/O4XBxPObzZaJA74Shh1YW0/img.png?width=1100&amp;amp;height=1381&amp;amp;face=0_0_1100_1381&quot;&gt;&lt;a href=&quot;http://www.kmooc.kr/invitation-banner&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.kmooc.kr/invitation-banner&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gsoCh/hyRi8RRIzr/TKxl0OC5ai4bWYd5xKffEK/img.png?width=1100&amp;amp;height=2173&amp;amp;face=713_988_787_1069,https://scrap.kakaocdn.net/dn/QPARo/hyRhFRjjRK/O4XBxPObzZaJA74Shh1YW0/img.png?width=1100&amp;amp;height=1381&amp;amp;face=0_0_1100_1381');&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;| K-MOOC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kmooc.kr&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;이전에 올렸던 Udemy와 비슷하게 Kmooc에서 Coursera도 지원해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구독권이기 때문에 TO가 나야 받을 수 있고,&amp;nbsp;&lt;/p&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;</description>
      <category>Univ/Study</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/318</guid>
      <comments>https://littlejay.tistory.com/318#entry318comment</comments>
      <pubDate>Mon, 16 Jan 2023 05:30:24 +0900</pubDate>
    </item>
    <item>
      <title>[OS] Memory Management III (Paging, Segmentation)</title>
      <link>https://littlejay.tistory.com/317</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Paging&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;지금까지 앞에서 Continous Allocation 기법들에 대해서 살펴보았다. 이제는 본격적으로 현대에서 만이 사용하는 Non-Continous Allocation에 대해서 살펴볼 것이다. Paging과 Segmentation은 기본적으로 Process들을 조각내는 기법이다. Paging은 고정된 사이즈로 나눈 반면에 Segmentation은 가변 사이즈로 Process를 나눈다.&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;Paging에서의 그 조각이 page이다. 따라서 page는 Process의 chunk라고 할 수 있으며, 일반적으로는 4KB의 크기를 지니고 있다. Paging을 수행하기 위해서는 Main Memory역시 이 page들을 담을 수 있도록 Slot화 해야한다. Memory에서는 이를 page라는 단어를 사용하지 않고 Frame이라는 단어를 사용한다. 따라서 Frame은 Memory Space의 조각이라고 할 수 있는 것이다. 보통의 경우 Page와 Frame의 size는 일치해야한다. 이 크기가 서로 다르면 내부단편화가 매우 커질 수 있기 때문이다. 우리는 이러한 Paging기법을 통해 분산적으로 Process를 Memory상에 적재할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Page Table (Page Mapping Table)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Page Table은 page를 관리하기 위한 자료구조 있다. Process가 분산적재 되어 있기 떄문에 우리는 해당 Process의 조각들이 어디에 위치해 있는지 해당 location을 알아야 한다. 기존의 연속할당 방식에서는 relative address를 사용했기 때문에 시작점만 준다면 특정 위치를 targetting할 수 있었다. 그러나 이제는 Memory에 불연적속적으로 올라가 있기 때문에 Page가 어떤 Frame에 Mapping되어 있는지에 대한 정보(순서쌍)을 관리해줘야 하는 필요성이 대두되었다. 당연한 소리일 수도 있겠지만 Process마다 수행하는 작업이 대부분 다르기 때문에 Process마다 1개의 Page Table(이하 PT)가 필요하다.&amp;nbsp;Paging 기법의 장점은 Internal Fragmentation(내부단편화)가 마지막 page의 일부분에만 존재하며 External Fragementation은 존재하지 않다는 것이다.&amp;nbsp;&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-filename=&quot;01.JPG&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boP5Fn/btrWeHDZL6F/IepqkFDIhHY7XzGk9vPhlk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boP5Fn/btrWeHDZL6F/IepqkFDIhHY7XzGk9vPhlk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boP5Fn/btrWeHDZL6F/IepqkFDIhHY7XzGk9vPhlk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboP5Fn%2FbtrWeHDZL6F%2FIepqkFDIhHY7XzGk9vPhlk%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;574&quot; height=&quot;445&quot; data-filename=&quot;01.JPG&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위와 같은 그림이 있다고 해보자. 만약 Process A가 16KB, Process B가 8KB, Process C가 16KB, Process D가 20KB를 가지고 있다고 해보자. Process A, B, C가 수행되다가 B가 끝나게 되고, 이제 D가 올라올 차례이다. B는 8KB만 사용하고 있던 것이 나갔으므로 Process D는 빈 자리에 일부 8KB의 Page를 넣고 나머지는 이어 붙이면 된다. 이렇게 한 메모리 상에서 연속적이 아니라 분역속적으로 Memory가 나눠쟈있기 때문에 Process가 Memory에 어디 있는지 관리할 필요성이 생겨야 한다는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Address Translation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 메모리의 불연속적인 배치 방식으로 인해 전통적인 Base &amp;amp; Bound 방식의 address translation과 다른 방식의 translation 기법이 필요해졌다. 새로운 Memory Translation기법은 page와 frame의 크기가 2의 K승이라는 것에 바탕을 둔다. 이 상황에서 relative address와 logical address (페이지 번호와 offset)이 같아지며 논리주소(상대주소)에서 물리주소(절대주소)로 변환하는 Algorithm이 쉬워진다. 말이 좀 어렵긴 한데 이 논리구조는 아래와 같다. 우선 page의 사이즈를 계산의 편의를 위해서 1KB, 즉 1024 byte라고 두자. 만약 Process에서 2번 페이지의 300번째 offset을 찾아가고 싶다고 해보자. 이러면 page table에 가서 &amp;lt;1, 300&amp;gt; 이 있다. 이때 relative address는 1024 * 2 + 300 = 2348 이 될 것이다. 2번 페이지의 300번째 주소를 접근하는 것이기 때문이다. 그러나 page table을 까보았더니 &quot;어 근데 그거 1번 페이지에 있어&quot;라고 한다면 실제 주소는 1024 * 1 + 300 = 1502가 되어 이를 비교적 쉽게 찾아갈 수 있다. 이해를 위해 아래의 그림을 만들어 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02.JPG&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brlvDP/btrWeYyPaIF/7RZLokpuuAaMEuaP3VHVUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brlvDP/btrWeYyPaIF/7RZLokpuuAaMEuaP3VHVUk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brlvDP/btrWeYyPaIF/7RZLokpuuAaMEuaP3VHVUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrlvDP%2FbtrWeYyPaIF%2F7RZLokpuuAaMEuaP3VHVUk%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;629&quot; height=&quot;362&quot; data-filename=&quot;02.JPG&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;만약 page size가 1KB이면 2의 10승이기에 offset은 총 10bit이 필요하다. 그라나 우리는 이를 2^n에 맞춰야 하니까 n는 6이 되므로 2^6의 page #의 공간이 생긴다. 따라서 총 2^16이 되는 것이다. 주소를 translate시키는 과정을 정리하자면 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;n bit을 추출해서 page #을 추출한다.&lt;/li&gt;
&lt;li&gt;이를 index로 여겨 k를 찾는다. 이때 k는 k * 2^10이다. 우리가 방금 본 예시에서는 6 * 2^10, 즉 10번 shift되었다고 생각하면 편하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;그 다음에는 나머지 offset을 더한다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 과정을 HW적으로 빠르게 계산할 수가 있다. 물론 이러한 Paging에는 단점이 존재한다. 먼저 Page Table에 대한 overhead (공간적인 비용)가 발생한다. page table의 크기가 매우 크기도 하며, process당 이를 하나씩 가지고 있어야 하기 떄문이다. 또한 page table에 접근하는 overhead(시간적인 비용)이 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Segmentation&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Segmentation도 분산적재, 즉 Non-Continous Allocation 중 하나의 기법이다. Paging과의 차이점을 위해서 간단하게 언급했었지만 고정된 크기가 아닌, 논리적인 단위의 가변적인 크기로 Process를 나눈다. 이 논리적인 단위를 Segment라고 부른다. 논리적인 단위라고 하는 것은 code, data, stack, heap, symbol...... 등등 이렇게 비슷한 묶음끼리의 단위로 분리한 것이다. 논리의 단위이기 때문에 각각 고정된 크기는 없으며 항상 가변적이다. 따라라서 이 역시 Segment Table로 관리해아 한다. Paging과는 다르게 index로 관리가 되는 것이 아닌 Segment의 limit 정보가 필요하다. &amp;lt;limit, base&amp;gt; 이렇게 구성이 된다. limit은 말 그대로 Segment가 가질 수 있는 size의 상한이며, base는 Segment의 시작주소이다.&amp;nbsp;&amp;nbsp;Segmentation의 장점은 Dynamic Patitioning과 같이 내부단편화는 발생하지 않는다는 장점이 있다. 반면, Segment의 크기가 고정되지 않을에 따라 외부 단편화의 문제는 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Address Translation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Segmentation의 Address Translation은 어떻게 진행되는지 보자. 먼저 16 bit의 Logical Address에서 n = 4, m = 12라고 가정해보자. 물론 이 값은 OS에서 관리를 해준다. 사이즈는 가변적이기 때문에 항상 체크를 해줘야한다. 16bit에서 2^n은 segment의 번호가 된다. 이제 이 Segment 번호를 table에서 읽은 다음 base를 가져와서 base + offset을 통해서 실제 주소를 계산한다. 그러나 이 부분이 limit(length)와 비교해서 넘어가는지 확인하는 작업을 거친다. 이것이 넘어가면 segfault가 발생한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Univ/Operating System(OS)</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/317</guid>
      <comments>https://littlejay.tistory.com/317#entry317comment</comments>
      <pubDate>Sun, 15 Jan 2023 16:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[JS] Vanila JS로 querySelector 구현</title>
      <link>https://littlejay.tistory.com/316</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;설명&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;elementSeparotor는 attribute를 파싱하는 함수입니다. class는 &quot;.&quot;으로, id는 &quot;#&quot;으로, tag이름은 알파벳으로 시작하기 때문에 이에 따라서 return 값을 다르게 반환합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;getElems는 querySelectorAll을 모방한 것입니다. elementSeparator을 기반으로 받은 toFind와, attr을 받아 이를 바탕으로 element를 찾기 시작합니다. querySelectorAll은 element의 배열을 반환하기 때문에 최종적으로는 elementsArr을 반환합니다. 본격적인 logic은 다음과 같습니다. 시작점을 default arugment로 body 태그에서부터 찾기 시작했는데, 성능을 위해 시작점을 임의로 지정해줄 수 있습니다. bfs 알고리즘처럼 해당 start를 배열에 추가해서 해당 item을 찾습니다. 없다면 배열에 push합니다. element.childrend은 HTMLCollection을 반환하기 때문에 해당 element의 요소에서 getAttribute로 attr을 검색합니다. 해당 요소를 가지고 있다면 elementsArr에 push하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;getElem의 로직은 getElems와 비슷하지만, 해당 요소를 찾으면 바로 return을 한다는 차이점이 있습니다.&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;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;querySelector와는 다르게 tag 이름을 가지고 찾는 것은 할 수 없습니다. getAttribute는 class, id같이 tag 안에 있는 속성에 대해서 작동하기 때문에 tag을 찾을 수 없었습니다. 어차피 styling이 들어가면 모든 tag에 class 혹은 id가 들어가기 때문에 tag로서 찾는 부분은 넣지 않았습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673398480551&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const elementSeparator = (attr) =&amp;gt; {
  const firstChar = attr.charAt(0);
  const sliced = attr.slice(1);
  if (firstChar === &quot;.&quot;) return { toFind: &quot;class&quot;, attr: sliced };
  if (firstChar === &quot;#&quot;) return { toFind: &quot;id&quot;, attr: sliced };
  return { toFind: &quot;tagname&quot;, attr };
};

const getElems = (attributes, start = document.body) =&amp;gt; {
  const { toFind, attr } = elementSeparator(attributes);
  const elementsArr = [];
  const queue = [start];
  const visited = {};
  visited[start] = true;
  while (queue.length) {
    for (let i = 0; i &amp;lt; queue.length; i = i + 1) {
      const parent = queue.shift();
      for (const child of parent.children) {
        if (String(child.getAttribute(toFind)).includes(attr))
          elementsArr.push(child);
        else {
          visited[child] = true;
          queue.push(child);
        }
      }
    }
  }
  return elementsArr.length === 0 ? null : elementsArr;
};

const getElem = (attributes, start = document.body) =&amp;gt; {
  const { toFind, attr } = elementSeparator(attributes);
  const queue = [start];
  const visited = {};
  visited[start] = true;
  while (queue.length) {
    for (let i = 0; i &amp;lt; queue.length; i = i + 1) {
      const parent = queue.shift();
      for (const child of parent.children) {
        if (String(child.getAttribute(toFind)).includes(attr)) return child;
        else {
          visited[child] = true;
          queue.push(child);
        }
      }
    }
  }
  return &quot;not found&quot;;
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>FrontEnd</category>
      <category>API</category>
      <category>javascript</category>
      <category>js</category>
      <category>querySelector</category>
      <category>Vanila</category>
      <category>Vanila JavaScript</category>
      <category>Vanila Js</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/316</guid>
      <comments>https://littlejay.tistory.com/316#entry316comment</comments>
      <pubDate>Wed, 11 Jan 2023 10:13:01 +0900</pubDate>
    </item>
    <item>
      <title>[OS] Memory Management II (Contigous Allocation)</title>
      <link>https://littlejay.tistory.com/315</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Memory Allocation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;메모리를 할당하는 방법론에는 크게 두 가지가 있다. 하나는 Contigous Allocation(연속할당)이며, 다른 하나는 Non-Contigous Allocation(불연속할당)이다. 먼저 연속할당에는 어떤 방법론들이 있는지 살펴보자. 불연속 할당에 포함되는 Paging과 Segmentation은 다음 포스팅에서 다뤄볼 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Fixed Partitioning - 고정분할 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이름만 보면 알 수 있듯이 메모리를 분할하는 방식이다. 초기에는 같은 Size의 Partitioning으로 나뉘었다. 어떻게 보면 가장 간단하게 생각할 수 있는 방식이다. 분할된 메모리의 Size가 모두 같기 때문에 빈 Slot이 있다면 거기에다가 그냥 할당을 해버리면 된다. 이 방법을 균등 고정분할 방식이라고 부른다. 제일 처음 대두된 방법이기에 구현이 매우 쉬우며 Vanila한 방법론이라고 할 수 있다. 그러나 이 방식의 구현은 너무나 많은 Disadvantage를 앉고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01.JPG&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w28Bq/btrUP062NlQ/lU6CK6oG3jGUxSPPJItW2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w28Bq/btrUP062NlQ/lU6CK6oG3jGUxSPPJItW2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w28Bq/btrUP062NlQ/lU6CK6oG3jGUxSPPJItW2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw28Bq%2FbtrUP062NlQ%2FlU6CK6oG3jGUxSPPJItW2k%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;991&quot; height=&quot;584&quot; data-filename=&quot;01.JPG&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;균등 고정분할 방식의 가장 큰 문제점은 고정된 Partition의 수이다. 이는 Active한 Process의 수의 제약을 의미한다. 다시 말해서 Process의 Maximum 개수가 Partition의 Maximum 개수로 경정이 되어버린다. 결과적으로 이는 Multiprogramming의 정도의 제약으로 귀결된다. 다음 문제점들은 그림을 보면 알 수 있는데, Partition된 메모리의 크기의 제한으로 인해 분할된 메모리의 크기보다 더 큰 크기의 Program이 올라오려고 하면 이는 올라오지 못한다. 물론 IBM에서는 이를 Overlay하는 방식으로 해결하였지만 중요한 것은 한 번에 이 프로그램을 올리지 못하며, Overlay기법을 사용하지 않는 이상 해당 Program을 Memory에 올리지 못한다는 것이다. 또한 Partition된 부분 안에서의 사용할 수 없는 영역에 대한 문제가 발생한다. Partition으로 인해 Memory에서 10MB를 온전히 사용하지 못하는 것은 명백한 자원에 대한 낭비이다. 이러한 문제점을 Internal Fragment(내부단편화)라고 부른다. 따라서 내부단편화가 발생할 수록 Memory의 Utilization은 감소하게 된다. 이상적으로 모든 Program들이 10MB를 사용하면 좋겠지만 현실적으로 그러한 Case는 잘 발생하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Fixed Partitioning with Unequal Size Partition&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02.JPG&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UA2x3/btrUVkiXfM7/zV0p6iaz8LCNSTk7Jp3Xo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UA2x3/btrUVkiXfM7/zV0p6iaz8LCNSTk7Jp3Xo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UA2x3/btrUVkiXfM7/zV0p6iaz8LCNSTk7Jp3Xo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUA2x3%2FbtrUVkiXfM7%2FzV0p6iaz8LCNSTk7Jp3Xo1%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;547&quot; height=&quot;403&quot; data-filename=&quot;02.JPG&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;앞에서는 모든 Partition의 Size가 동일하였기에 Unequal하게 Size를 나눈 비균등 고정분할 방식이 대두되었다. 이렇게 보면 앞선 균등 고정분할 방식에 대한 Solution처럼 보이기는 하지만 여전히 근본적인 문제를 해결하지는 못했다. 이 경우에는 만약 5개의 Process가 모두 10MB를 사용한다고 가정하면 오히려 균등 고정분할 방식이 더 효율적일 수 있다. 모두 10MB일때는 들어갈 수 있는 Slot이 두 곳 밖에 없기 때문에 그 Process들이 끝나야 다른 10MB의 Program에게 TO가 생긴다. 따라서 이는 General한 버전에서의 Trace를 고려하지 못한 방식이라고 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;또한 이 방식은 구현 Level에서 고려해야 할 것이 있는데 바로 Process를 배치할 때 어떤 방식으로 넣을 것인가에 대한 고민이 있다. 여기에는 두 가지 방법이 있는데 Multiple Queue를 활용하는 방식과 Single Queue를 이용한 방식이 있다. 먼저 Single Queue는 단순히 Process의 크기와 Memory에 가용한 Partition이 있다면 바로 집어넣는다. 이러한 방식은 Internal Fragmentation가 많이 발생하게 된다. 반면 Multiple Queue는 크기가 비슷한 Process들끼리 묶어서 Partition에 넣는 방식이다. 위 그림에서 예들 들어보자면 3MB 공간에는 3MB이하의 Process, 10MB 공간에는 10MB이하의 Process를 넣는 방식이다. 그렇기 때문에 공간적으로는 Queue를 많이 배치해야하지만 Memory의 Utilization의 측면에서 본다면 납득할만한 방식이다. 그러나 이 방식에는 딜레마가 존재하는데, 예를 들어서 10MB 이하의 Process들만 오게 된다면 12MB공간의 Queue는 빈 상태로 남아있어야 하고, 비슷한 크기의 Process들이 왔을때 다른 크기의 Partition에서 해당 Process를 품을 수 있다면 이때는 어떻게 해야하는가에 대한 고려를 Programmer Level에서 생각해봐야 한다는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dynamic Partitioning - 동적분할 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fixed Partitioning의 문제를 해결하기 위해 Run Time에 Dynamic하게 분할할 수 있는 동적분할 방식이 제시되었다. Dynamic한 시점에 Memory의 크기를 결정할 수 있기 때문에 Process가 Require하는 만큼 Memory를 분할하여 Allocate시킬 수 있다. 즉 이는 Internal Fragementation을 없앨 수 있는 하나의 방법이다. 문제는, 내부 단편화는 해결되었지만 반대로 외부 단편화(External Fragementation)이 발생하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMPR57/btrUYQBm3X0/k9BvAMcpV9FvAzM7iP7GkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMPR57/btrUYQBm3X0/k9BvAMcpV9FvAzM7iP7GkK/img.png&quot; data-alt=&quot;이미지 출처:&amp;amp;nbsp;https://www.geeksforgeeks.org/difference-between-internal-and-external-fragmentation/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMPR57/btrUYQBm3X0/k9BvAMcpV9FvAzM7iP7GkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMPR57%2FbtrUYQBm3X0%2Fk9BvAMcpV9FvAzM7iP7GkK%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;391&quot; height=&quot;316&quot; data-filename=&quot;03.png&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처:&amp;nbsp;https://www.geeksforgeeks.org/difference-between-internal-and-external-fragmentation/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 그림을 보자. 어떤 Process는 끝나면 해당 메모리 공간을 반환하고 다른 Process가 Memory 공간을 요구한다. 그러나 Swap out된 메모리의 크기가 들어오려는 Process의 크기보다 작을 때 메모리에는 작은 빈 공간이 생긴다. 예를 들어 Memory의 상단부에 10MB짜리 Process가 나가고 8MB의 Process가 들어온다면 2MB의 공간은 2MB 이하의 Process가 들어오지 않는 이상 놀고 있는 공간으로 남는다는 것이다. 이것 역시 Fragment이며 이 Fragment를 External Fragmentation이라고 한다. Programmer들은 항상 최악의 상황을 고려해야기 때문에 이 Fragment는 시간이 지나면 지날수록 많아지게 될 것이다. 따라서 Memory 안에 있는 Process를 옮겨야 하는 상황이 발생할 수 있는데 이를 Memory Compactation이라고 한다. Memory Compactation은 Memory의 Utilization을 높이기 위해 주기적으로 수행되지만 이는 CPU를 사용해서 옮겨야 하는 것이기 때문에 추가적인 Resource의 사용이 수반된다고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;따라서 애초에 메모리를 배치할 때 잘 배치하자라는 의미에서 Placement(Allocation) Algorithm이 개발되었다. 책에서는 3가지가 있는데 원래는 worst-fit을 포함한 4가지 알고리즘이 있다고 한다. 그러나 강의 및 책에서는 3개만 다루었기 때문에 이 글에서도 3가지만 다룰 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;First Fit: Memory의 시작점부터 출발해서 Memory를 스캔한다. 스캔할 때 Require하는 Memory의 크기가 들어갈 수 있는 공간이라면 거기에 할당한다.&lt;/li&gt;
&lt;li&gt;Next Fit: 가장 최근에 할당된 곳부터 출발해서 Memory를 스캔한다. 스캔중 가용영역이 있다면 그곳에 배치한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Best Fit: 요구되는 Memory의 크기와 가장 비슷한 곳에 할당하는 방법이다. 즉 빈 공간 중 요구되는 크기와 빈 공간의 차이가 가장 작은 곳에 할당하는 것이다. 그러나 이 방식은 과연 Best라는 이름이 최선일까라는 것이다. 차이가 가장 작은 곳을 찾으려면 결국 Memory에 대한 선형 탐색이 진행되야 한다. Memory의 크기가 크면 클수록 이 방법은 O(n)의 시간이 매번 수행되야 하는데, CPU의 Cycle이 낮다면 수십초가 걸릴 수 있는 방법이다. 따라서 Best Fit은 이론적인 알고리즘이며 실제로는 First Fit과 Next Fit이 많이 사용된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;정리하자면 동적분할 방식은 내부단편화가 없으며 Memory Utilization을 높일 수 있다는 장점이 있지만, 반대로 외부단편화의 발생 및 외부단편화의 해결을 위한 Compaction의 CPU time의 할애라는 단점을 지니고 있다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Buddy Memory Allocation System&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Buddy Allocation은 메모리에 대한 Request가 들어온다면 Kernel이 Free Space를 Split한다. Memory는 2진수를 활용하고 있으며 2의 지수승의 크기를 지니고 있다. 요구된 Size를 체크하는데 Size 역시 2의 지수승이므로, 2^(i-1) &amp;lt; s &amp;lt;= 2^i 사이즈에 맞게 재귀적으로 Split한다. 아래의 그림을 보면 이해가 쉽게 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;04.png&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xuCrY/btrUSvL9E74/8hIHxwnrfhc2a8K9PLC8iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xuCrY/btrUSvL9E74/8hIHxwnrfhc2a8K9PLC8iK/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp;https://www.geeksforgeeks.org/buddy-memory-allocation-program-set-1-allocation/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xuCrY/btrUSvL9E74/8hIHxwnrfhc2a8K9PLC8iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxuCrY%2FbtrUSvL9E74%2F8hIHxwnrfhc2a8K9PLC8iK%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;1071&quot; height=&quot;479&quot; data-filename=&quot;04.png&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp;https://www.geeksforgeeks.org/buddy-memory-allocation-program-set-1-allocation/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;128 byte라고 했을 때 처음 32B의 request가 온다면 64두개, 32두 개로 나오고 32에 할당할 수 있으므로 할당한다. 다음 7B에서는 32를 16으로 16을 8로 쪼개고, 이제 7B를 할당할 수 있으므로 할당한다. 이러한 방식으로 메모리를 나누면서 할당을 한다. 흡사 Dynamic Partitioning과 유사해 보인다. (fit 하는 과정이) 만약 해당 Allocate된 Process가 끝나게 되면 Memory는 Release되어 Release된 부분과 같은 Size의 부분이 Merge되며 더이상 진행할 수 없을 때 까지 진행된다. Merge Sort의 Merge하는 부분과 유사하다. 같은 부분(Buddy)끼지 Coalesces되기에 이를 Buddy System이라고 하며 이는 병렬 시스템을 사용하는 곳에서 효율이 높다. 그러나 Request 4처럼 Partition된 부분이 가용하지 않다면 Release 될때까지 기다려야 한다는 단점이 존재하기도 한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Univ/Operating System(OS)</category>
      <category>Computer science</category>
      <category>cs</category>
      <category>memory</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>메모리</category>
      <category>오퍼레이팅시스템</category>
      <category>전공</category>
      <category>컴공</category>
      <category>컴퓨터공학과</category>
      <author>Jay, Lee</author>
      <guid isPermaLink="true">https://littlejay.tistory.com/315</guid>
      <comments>https://littlejay.tistory.com/315#entry315comment</comments>
      <pubDate>Fri, 30 Dec 2022 13:43:01 +0900</pubDate>
    </item>
  </channel>
</rss>