<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_crystal.log</title>
        <link>https://velog.io/</link>
        <description>개발자</description>
        <lastBuildDate>Mon, 31 Jan 2022 11:42:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_crystal.log</title>
            <url>https://images.velog.io/images/dev_crystal/profile/628866eb-0d88-4944-8fb7-44906286f830/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_crystal.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_crystal" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[thread(스레드)]]></title>
            <link>https://velog.io/@dev_crystal/thread%EC%8A%A4%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@dev_crystal/thread%EC%8A%A4%EB%A0%88%EB%93%9C</guid>
            <pubDate>Mon, 31 Jan 2022 11:42:04 GMT</pubDate>
            <description><![CDATA[<h1 id="스레드란">스레드란?</h1>
<p>Light Weight Process라고도 하며 <strong>프로세스 내에서 실제로 작업을 수행하는 주체</strong>를 뜻합니다. 두 개 이상의 스레드를 가지면 멀티스레드 프로세스가 됩니다. 프로세스 간에는 각 프로세스의 데이터 접근이 불가능하여 IPC 등을 사용하지만, <strong>하나의 프로세스 안에 여러 개의 스레드는 동시에 실행이 가능하며 프로세스의 데이터에 모두 접근이 가능합니다.</strong></p>
<p>또한, 프로세스 안의 stack은 스레드 별로 공간이 나뉘어져 있습니다.</p>
<h2 id="스레드의-장점">스레드의 장점</h2>
<ul>
<li>사용자에 대한 응답성 향상 (하나는 다른 작업, 하나는 커뮤니케이션 하면 되니까)</li>
<li>자원 공유 효율(프로세스 안에서 프로세스 데이터 접근이 모두 가능하여 IPC보다 효율적)</li>
<li>작업이 분리되어 코드가 간결</li>
</ul>
<h2 id="스레드의-단점">스레드의 단점</h2>
<ul>
<li>스레드 중 한 스레드만 문제가 있어도 해당 프로세스의 모든 스레드 멈춤</li>
<li>스레드를 많이 생성하면 context switching이 많이 일어나 성능 저하</li>
<li>동기화 이슈</li>
</ul>
<blockquote>
<p><strong>동기화 이슈</strong>
여러 스레드가 동일한 자원에 접근 시 동기화 이슈가 발생할 수 있습니다.
ex) 동일 자원을 여러 스레드가 동시에 수정할 경우, 각 스레드 결과에 영향을 줌.</p>
</blockquote>
<h2 id="프로세스와-스레드">프로세스와 스레드</h2>
<ul>
<li>프로세스는 독립적, 스레드는 프로세스의 서브셋</li>
<li>프로세스는 각각 독립적인 자원을 가짐, 스레드는 프로세스 자원 공유</li>
<li>프로세스는 자신만의 주소영역을 가짐, 스레드는 주소영역 공유</li>
<li>프로세스 간에는 IPC 기법으로 통신. 스레드는 필요 없음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스케줄링과 프로세스]]></title>
            <link>https://velog.io/@dev_crystal/%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</link>
            <guid>https://velog.io/@dev_crystal/%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</guid>
            <pubDate>Fri, 07 Jan 2022 09:24:29 GMT</pubDate>
            <description><![CDATA[<h1 id="스케줄링이란">스케줄링이란?</h1>
<p>운영체제가 CPU를 최대한 활용하고 프로그램들을 빨리 실행시키기 위해서 고안한 실행 스케줄 로직을 뜻합니다.</p>
<h2 id="배치-처리-시스템">배치 처리 시스템</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/242f2ce1-0acb-4050-af49-a4f44bbe5d04/image.png" alt="">
배치 처리 시스템은 <strong>여러 프로그램을 순차적으로 실행</strong>시키는 것입니다. <strong>프로그램이 끝날 때마다 다른 프로그램을 연결해주어야 하는 수고로움을 덜 수 있는 점</strong>은 좋았지만, 앞선 프로그램 실행시간이 너무 길다면 뒤에 간단한 프로그램도 앞에 프로그램이 다 끝날 때까지 기다려야하는 단점도 있습니다. 즉, <strong>동시에 여러 프로그램을 실행할 수 없는 점, 다중 사용자가 사용하기에 너무 불편한 점</strong> 등이 문제가 되어 새로운 스케줄링 방법들이 나왔습니다.</p>
<h2 id="시분할-시스템">시분할 시스템</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/65277d3f-3d00-472c-ac51-7354e93c73dd/image.png" alt="">
<strong>다중 사용자 지원을 위해 컴퓨터 응답시간을 최소화</strong>하는 시스템입니다. 응용 프로그램이 <strong>CPU를 점유하는 시간을 잘게 쪼개어서 동작</strong>하는 시스템입니다.</p>
<h2 id="멀티-프로그래밍">멀티 프로그래밍</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/922f56bd-09ad-4627-bbd0-82731040677a/image.png" alt="">
<strong>최대한 cpu를 많이 활용하도록 고안한 시스템</strong>입니다. 응용프로그램이 CPU사용 외에 I/O사용 등을 위해 시간이 쓰여야 한다면 그 때 놀고 있는 CPU를 사용하기 위해서 프로세스(app)를 바꿔 동작하는 것입니다.</p>
<h3 id="멀티-태스킹">멀티 태스킹</h3>
<p>하나의 운영체제에서 여러 개의 프로세스를 실행하는 방식. 실제로는 동시에 실행된 것이 아니지만 인간의 인지속도보다 빠르게 동작하여 동시에 실행된 것 처럼 보입니다.</p>
<h3 id="멀티-프로세싱">멀티 프로세싱</h3>
<p><img src="https://images.velog.io/images/dev_crystal/post/fc977cc4-407c-4a82-9666-e17c4770a5ca/image.png" alt="">
여러 cpu가 응용 프로그램을 병렬로 실행하는 시스템.</p>
<h1 id="프로세스란">프로세스란?</h1>
<p><span style="color: orange">실행 중인 프로그램</span>을 <span style="color: orange">프로세스</span>라고 합니다. 실행 중이라는 뜻은 운영체제가 메모리에 해당 프로그램을 올려주어서 실행되는 것을 말합니다. 그렇다면 <span style="color: green">응용 프로그램</span>은 <span style="color: green">실행 중이지 않은 프로그램</span>이죠. 즉, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 의미합니다. 둘은 상태 측면에서 반대 개념입니다.</p>
<p>또, 하나의 응용 프로그램이 꼭 하나의 프로세스로 이루어져 있진 않습니다. 뒤에 나올 IPC 기법 등으로 인해 프로세스 간에 통신을 하면서 프로그램을 작성할 수도 있어서 여러 개의 프로세스가 상호작용 하면서 실행될 수도 있습니다.</p>
<h1 id="스케줄링-알고리즘">스케줄링 알고리즘</h1>
<p>스케줄러가 프로세스를 실행하는 규칙을 스케줄링 알고리즘이라고 합니다. 어떤 규칙에 의해서 프로세스를 선택하여 진행하는지를 알아봅시다.</p>
<h2 id="fifo-스케줄러">FIFO 스케줄러</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/20141f10-2021-4e53-8f36-796a95650d00/image.png" alt="">
먼저 들어온 것을 먼저 실행하는 자료구조 방식으로 진행. 배치 처리 시스템에서 사용하고 가장 간단한 스케줄러임. FCFS(First Come First Srved)스케줄러라고도 불림.</p>
<h2 id="sjfshortest-job-first-스케줄러">SJF(Shortest Job First) 스케줄러</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/ca28f01e-9d02-4ed9-9fb1-08448afad91f/image.png" alt="">
최단 작업 우선 스케줄러로 가장 프로세스 실행시간이 짧은 프로세스부터 실행시키는 알고리즘. 응답시간을 더 단축시킬 수 있는 방법이지만 실행시간을 미리 다 알긴 어렵습니다. RTOS에서 유용한 방식.</p>
<blockquote>
<p>RTOS(RealTime OS): 응용 프로그램의 시작 완료 시간을 보장하는 OS
GPOS(Genral Purpose OS): 프로세스 실행시간에 민감하지 않고 일반적인 목적으로 사용되는 OS</p>
</blockquote>
<h2 id="priority-based-스케줄러">Priority-Based 스케줄러</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/21b8e6a4-269f-4392-988c-215f9fd4cb2b/image.png" alt="">
우선순위 기반 스케줄러. 정적 우선순위(프로세스마다 우선순위를 미리 지정)와 동적 우선순위(스케줄러가 상황에 따라 우선순위를 동적으로 변경)가 있습니다.</p>
<h2 id="round-robin-스케줄러">Round Robin 스케줄러</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/0bd50355-c3c1-4955-8bf4-0ff88019ab3f/image.png" alt="">
시분할 시스템 기반으로 일정시간마다 프로세스를 계속 바꿔주는 스케줄러.</p>
<h2 id="상태-기반-스케줄링">상태 기반 스케줄링</h2>
<p>cpu 활용도를 극대화하는 스케줄링 알고리즘입니다. 이를 이해하기 위해 프로세스 상태를 먼저 살펴봅니다.</p>
<h3 id="프로세스-상태">프로세스 상태</h3>
<table>
<thead>
<tr>
<th>프로세스 상태</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>new</td>
<td>프로세스 생성</td>
</tr>
<tr>
<td>ready</td>
<td>프로세스 실행가능(대기)상태</td>
</tr>
<tr>
<td>blocked</td>
<td>특정 이벤트 대기 상태</td>
</tr>
<tr>
<td>running</td>
<td>현재 cpu 실행 상태</td>
</tr>
<tr>
<td>exit</td>
<td>프로세스 종료</td>
</tr>
</tbody></table>
<p>상태 기반 스케줄링은 프로세스가 blocked 상태일 때 스케줄러가 다른 프로세스로 실행을 교체하는데 이 때 ready state queue에 있는 것 순으로 교체.</p>
<p><img src="https://images.velog.io/images/dev_crystal/post/b4324388-956a-4a0c-b565-7202e16723f1/image.png" alt="">
(wait상태로 cpu가 있다는 것은 cpu가 아무 것도 하고 있지 않은 상태로 idle 상태라고도 합니다.)</p>
<h2 id="선점형과-비선점형-스케줄러">선점형과 비선점형 스케줄러</h2>
<ul>
<li>선점형 스케줄러: 하나의 프로세스가 다른 프로세스 대신에 프로세서(cpu)를 차지할 수 있음
즉, 프로세스가 running 중이어도 스케줄러가 이를 중단시키고 다른 프로세스로 교체 가능
ex) RoundRobin</li>
<li>비선점형 스케줄러: 하나의 프로세스가 끝나지 않으면 다른 프로세스는 cpu를 사용할 수 없음
즉, 프로세스가 자발적으로 blocking상태로 들어가거나 실행이 끝났을 때만 다른 프로세스로 교체 가능
ex) FIFO, SJF, Priority-based</li>
</ul>
<h1 id="인터럽트">인터럽트</h1>
<p>cpu에 예외상황이 발생했음을 알리는 기술. cpu가 프로그램을 실행하고 있을 때 다른 상황이 발생해서 프로세스를 바꾸거나 다른 처리를 해야함을 알려주어서 재정비를 할 수 있게 합니다. 인터럽트가 발생하면 진행중인 프로세스가 중단되고 커널모드로 진입이 됩니다.</p>
<p><strong>예외상황의 예</strong></p>
<ol>
<li>선점형 스케줄러일 경우, running을 중단시키고 다른 프로세스로 교체할 타이밍을 알려줌</li>
<li>IO devices와의 커뮤니케이션이 끝나고 다시 cpu 프로세스를 진행해야 할 때 알려줌.</li>
<li>오류가 났을 때 알려주어 해당 프로세스를 중지하거나 에러 표시를 할 수 있게 함.</li>
<li>시스템콜을 만났을 때 cpu의 사용자 모드를 커널 모드로 바꿔줌</li>
</ol>
<h2 id="인터럽트의-종류">인터럽트의 종류</h2>
<h3 id="내부-인터럽트">내부 인터럽트</h3>
<ul>
<li>주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용시 발생</li>
<li>사용자 모드에서 허용되지 않은 명령 또는 공간 접근</li>
<li>계산 결과가 overflow/underflow날 때</li>
<li>0으로 나눴을 때</li>
</ul>
<h3 id="외부-인터럽트">외부 인터럽트</h3>
<ul>
<li>하드웨어 오류</li>
<li>타이머 이벤트</li>
</ul>
<h3 id="시스템콜-인터럽트">시스템콜 인터럽트</h3>
<p>시스템콜을 실행하려면 강제로 코드에 인터럽트 명령을 넣어 cpu에게 실행시켜야 합니다.</p>
<ol>
<li>시스템콜 인터럽트 명령을 호출하면서 xxx값을 넘김</li>
<li>cpu는 사용자모드를 커널모드로 바꿈</li>
<li>IDT(Interrupt Descriptor Table)에서 xxx에 해당하는 주소(함수)를 찾아서 실행</li>
<li>해당 시스템콜 함수 실행 후, 다시 커널모드에서 사용자 모드로 변경하고 다시 해당 프로세스 다음 코드 진행</li>
</ol>
<h2 id="idt">IDT</h2>
<p>인터럽트의 종류를 정의하고 번호와 실행 코드를 가리키는 주소가 매핑된 표.
리눅스의 경우,
0<del>31: 예외상황 인터럽트
32</del>47: 하드웨어 인터럽트
128: 시스템콜</p>
<h1 id="프로세스와-컨텍스트-스위칭">프로세스와 컨텍스트 스위칭</h1>
<p>프로그램: 컴퓨터 저장매체에 저장되어 있는 코드 덩어리
프로세스: 실행 중인 프로그램</p>
<h2 id="프로세스의-구성">프로세스의 구성</h2>
<p>프로세스는 운영체제에 따라 조금 다를 순 있지만 일반적으로 4개의 영역으로 구성되어 있습니다.
위에서부터 stack, heap, data, code</p>
<ul>
<li>stack: 임시 데이터(함수 호출, 로컬 변수). 아래로 데이터를 쌓아감.</li>
<li>heap: 코드에서 동적으로 만들어지는 데이터. 위로 데이터를 쌓아 감.</li>
<li>data: 변수, 초기화된 데이터<ul>
<li>bss: 초기화되지 않은 전역변수</li>
<li>data: 초기값이 있는 전역변수</li>
</ul>
</li>
<li>text(code): 프로그램 코드.</li>
</ul>
<h2 id="컨텍스트-스위칭">컨텍스트 스위칭</h2>
<p>스케줄러가 cpu에 실행할 프로세스를 교체하는 기술. a process를 running상태로 바꾸는 것. 이는 빠르게 이루어져야 하므로 어셈블리어로 진행함.</p>
<blockquote>
<p><strong>Process Control Block</strong>
프로세스를 교체할 때, 이전 정보를 기억하고 있어야 하므로 프로세스 b로 넘어가기 전 a 프로세스의 program counter, stack pointer 값을 pcb라는 공간에 저장함.</p>
</blockquote>
<ol>
<li>Process ID</li>
<li>Register value(PC, SP)</li>
<li>scheduling info(process state)</li>
<li>memory info(momory size limit)
ex) linux
<img src="https://images.velog.io/images/dev_crystal/post/0ab0962b-36d6-4f4e-a4cb-3eb6b2ece869/image.png" alt=""></li>
</ol>
<p><strong>디스패치 순서</strong>
디스패치란 ready상태의 프로세스를 running 상태로 바꾸는 것.</p>
<ol>
<li>실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트 해서 메인 메모리에 저장</li>
<li>다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보(PC, SP)를 CPU의 레지스터에 넣고 실행</li>
</ol>
<h1 id="ipcinterprocess-communication">IPC(InterProcess Communication)</h1>
<p>ipc란 프로세스간 커뮤니케이션을 의미합니다. 기본적으로 프로세스 간에는 다른 프로세스의 공간에 접근할 수 없습니다. 그러나 성능을 높이기 위해 여러 프로세스를 만들어서 동시에 실행하는 등의 처리를 하기 위해 프로세스 간 통신할 수 있는 방법을 따로 제공합니다.</p>
<h2 id="파일을-사용한-커뮤니케이션">파일을 사용한 커뮤니케이션</h2>
<p>공유해야 하는 내용을 공용 파일에 쓰고 읽는 방식이 있습니다. 그러나 이 방식은 실시간으로 직접 원하는 프로세스에 데이터 전달은 어려울 수 있습니다. 실시간으로 계속 이 파일만 바라볼 수는 없기 때문입니다.</p>
<h2 id="커널-공간을-활용한-커뮤니케이션">커널 공간을 활용한 커뮤니케이션</h2>
<p>커널 공간은 여러 개일 필요가 없으므로 공용 공간으로 빼놓고 그 부분을 통해 통신합니다.
이 방식을 사용하는 방법으로는 Message Queue, Shared Memory, Pipe, Signal, Semaphore, Socket방식이 있습니다.</p>
<h3 id="pipe">Pipe</h3>
<p>기본적으로 파이프는 단방향 통신입니다.
fork()로 자식 프로세스를 만들면 부모와 자식간의 통신이 이루어집니다. 리액트의 props같네요.</p>
<h3 id="message-queue">message queue</h3>
<p>메세지 큐는 파이프와 다르게 부모에서 자식으로만 데이터가 연결되는 것이 아니라 어느 프로세스 간에라도 데이터 송수신이 가능합니다. 하지만 큐 자료형식이기 때문에 먼저 넣은 데이터 순서대로 읽혀집니다.</p>
<h3 id="shared-memory">Shared Memory</h3>
<p>커널 공간에 메모리 공간을 만들어두고 해당 공간을 변수처럼 사용하는 방식입니다. 해당 메모리 주소를 변수처럼 접근이 가능합니다. 공유메모리 key를 가지고 여러 프로세스가 접근도 가능합니다.</p>
<h2 id="ipc외의-방법">ipc외의 방법</h2>
<h3 id="signal">signal</h3>
<p>유닉스에서 30년 이상 사용된 전통적인 기법으로 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법입니다. 프로세스 관련 코드에 관련 시그널 핸들러를 등록하면 pcb에서 해당 프로세스가 블록 또는 처리해야하는 시그널 관련 정보를 관리합니다. 블록을 푸는 순간 프로세스에 해당 시그널을 전달하여 핸들러로 특정 동작을 수행하고, 등록된 시그널 핸들러가 없다면 커널에서 기본 동작을 수행합니다. 이건 이벤트 사용이랑 비슷한 거 같네요. </p>
<blockquote>
<p>주요 시그널 기본 동작</p>
</blockquote>
<ul>
<li>SIGKILL: 프로세스를 죽임</li>
<li>SIGALARM: 알람 발생</li>
<li>SIGSTP: 프로세스 멈춤</li>
<li>SIGCONT: 멈춘 프로세스 실행</li>
<li>SIGINT: 프로세스에 인터럽트를 보내 프로세스 죽임</li>
<li>SIGSEGV: 프로세스가 다른 메모리 영역을 침범</li>
</ul>
<h3 id="socket">socket</h3>
<p>소켓은 네트워크 통신을 위한 기술입니다. 즉, 기본적으로 두 개의 다른 컴퓨터 간의 네트워크 기반 통신을 위한 기술인데 이를 하나의 컴퓨터 안에서 두 개의 프로세스 간에 통신 기법으로 사용하는 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript 개발환경]]></title>
            <link>https://velog.io/@dev_crystal/javascript-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD</link>
            <guid>https://velog.io/@dev_crystal/javascript-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD</guid>
            <pubDate>Thu, 06 Jan 2022 04:11:25 GMT</pubDate>
            <description><![CDATA[<h1 id="os-관리">OS 관리</h1>
<p>Homebrew를 대중적으로 많이 사용. 그러나 멀티유저 지원은 자동으로 되지 않아서 아쉬움.
장점: 개발관련 프로그램 설치 삭제 관리가 용이함</p>
<ol>
<li><a href="https://brew.sh/index_ko">사이트접속</a></li>
<li>터미널에 설치 명령어 입력</li>
</ol>
<h1 id="javascript-환경-설치">javascript 환경 설치</h1>
<p>brew로 n.js도 설치하여 node 설치. 이렇게 하는 이유는 n.js로 node.js 버전을 관리하기 위함.
n을 이용하여 lts버전으로 설치.</p>
<pre><code class="language-shell">brew install n
sudo n lts</code></pre>
<h1 id="터미널-관리">터미널 관리</h1>
<p>iterm2는 맥의 기본 터미널 기능을 확장하여 커스텀 단축키, 스크립트, 화면 나누기, 테마 설정 등을 할 수 있습니다.
zsh는 본쉘의 확장판으로 경로 자동 추론, 타이핑 교정 등의 기능을 추가해 줍니다. 다양한 플러그인들과 사용할 수도 있구요.</p>
<pre><code class="language-shell">brew install iterm2
brew install zsh

# theme
brew install romkatv/powerlevel10k/powerlevel10k
echo &#39;source /usr/local/opt/powerlevel10k/powerlevel10k.zsh-theme&#39; &gt;&gt;! ~/.zshrc</code></pre>
<h1 id="visual-studio-code-관리">visual Studio code 관리</h1>
<p>터미널에서 해당 파일 위치에서 <code>code .</code>을 작성하면 해당 파을 경로로 vscode가 실행되도록 설정</p>
<ol>
<li>visual studio code 열기</li>
<li>cmd + shift + p로 vscode 콘솔 열기</li>
<li>code 검색하여 아래 내용 선택
<img src="https://images.velog.io/images/dev_crystal/post/a6efec00-18f3-46b2-ab62-4de75f7e4dda/image.png" alt=""></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[커널모드 kernel mode]]></title>
            <link>https://velog.io/@dev_crystal/%EC%BB%A4%EB%84%90%EB%AA%A8%EB%93%9C-kernel-mode</link>
            <guid>https://velog.io/@dev_crystal/%EC%BB%A4%EB%84%90%EB%AA%A8%EB%93%9C-kernel-mode</guid>
            <pubDate>Thu, 06 Jan 2022 03:19:25 GMT</pubDate>
            <description><![CDATA[<h1 id="cpu-protection-rings">CPU Protection Rings</h1>
<p>CPU는 총 4개의 모드로 되어 있습니다. 이는 권한을 의미하는데요. 일반적인 user가 사용할 수 있는 권한은 level3, OS 서비스는 level 1&amp;2, OS는 Level 0인 커널 모드를 사용합니다.
<img src="https://images.velog.io/images/dev_crystal/post/af65da79-b4a6-440a-9da5-16fe48a5ba7f/image.png" alt=""></p>
<h2 id="kernel-mode">kernel mode</h2>
<p>OS 핵심 기능을 사용하기 위한 권한입니다. OS 핵심 기능은 컴퓨터 시스템 전반에 큰 영향을 끼치므로 잘 모르는 유저가 함부로 해치지 못하도록 권한을 따로 두었습니다. shell이 운영체제 기능과 서비스를 조작할 수 있는 인터페이스라고 했는데 달리 말하면 이 커널에 진입하기 위한 툴입니다. </p>
<p><img src="https://images.velog.io/images/dev_crystal/post/025fb67a-2163-4f86-b053-bf3a2c304331/image.png" alt="https://images.velog.io/images/dev_crystal/post/025fb67a-2163-4f86-b053-bf3a2c304331/image.png">
위 구조에서 커널 영역은 시스템 호출 인터페이스, 시스템콜 부터입니다. 커널모드를 실행하려면 반드시 시스템 콜을 거쳐야 합니다.</p>
<h2 id="커널-모드의-실행과정">커널 모드의 실행과정</h2>
<p>시스템콜 위에 있는 API는 프로그래밍 언어별로 운영체제의 기능을 사용하기 위해 시스템콜을 기반으로 만든 API 입니다. 따라서 프로그래밍 언어로 API를 호출하면 그 API의 내부 코드가 시스템콜을 호출합니다.</p>
<ol>
<li>프로그래밍 언어로 a라는 API 호출</li>
<li>a API내부에서 해당하는 시스템콜을 호출</li>
<li>유저모드에서 커널 모드로 권한이 변경됨</li>
<li>OS 내부에서 해당 명령이 실행되고 다시 유저모드로 바뀜</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[시스템 콜]]></title>
            <link>https://velog.io/@dev_crystal/%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%BD%9C</link>
            <guid>https://velog.io/@dev_crystal/%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%BD%9C</guid>
            <pubDate>Wed, 05 Jan 2022 05:29:04 GMT</pubDate>
            <description><![CDATA[<h1 id="운영체제가-하는-일">운영체제가 하는 일</h1>
<p>운영체제는 어플리케이션과 하드웨어 사이에 위치하여 컴퓨터 하으뒈어와 응용 프로그램을 관리합니다.
<img src="https://images.velog.io/images/dev_crystal/post/4a25832f-b47d-4905-963c-bafd90d185b0/image.png" alt=""></p>
<ul>
<li>앱의 메모리 허가, 분배</li>
<li>앱의 CPU 사용 시간 제공</li>
<li>입출력 기기 사용 허가/제어</li>
</ul>
<h1 id="interface">Interface</h1>
<p>운영체제에 접근할 수 있도록 열어둔 환경들은 여러 가지가 있습니다.</p>
<h2 id="shell">Shell</h2>
<p><strong>사용자</strong>가 운영체제 기능과 서비스를 직접 조작할 수 있는 인터페이스를 제공하는 프로그램입니다. CLI, GUI 둘 다있습니다.</p>
<h2 id="api-library">API, Library</h2>
<p>응용 프로그램이 운영체제의 기능과 서비스를 조작할 수 있도록 인터페이스를 제공합니다.</p>
<h2 id="시스템-콜">시스템 콜</h2>
<p>시스템 콜 혹은 시스템 호출 인터페이스라고 하는데 운영체제가 운영체제의 기능을 사용할 수 있도록 시스템 콜이라는 명령 또는 함수를 제공합니다. 이를 직접 가져다 쓰기보다는 보통 API의 내부 형태로 시스템 콜이 들어가 있습니다.</p>
<p><img src="https://images.velog.io/images/dev_crystal/post/025fb67a-2163-4f86-b053-bf3a2c304331/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 역사]]></title>
            <link>https://velog.io/@dev_crystal/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%AD%EC%82%AC</link>
            <guid>https://velog.io/@dev_crystal/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%AD%EC%82%AC</guid>
            <pubDate>Tue, 04 Jan 2022 06:55:32 GMT</pubDate>
            <description><![CDATA[<h1 id="1950">1950</h1>
<ul>
<li>ENIAC : 운영체제 없이 응용 프로그램이 시스템 자원을 직접 제어</li>
</ul>
<h1 id="1960년대-초기">1960년대 초기</h1>
<p>프로그램의 종류, 사용자도 늘어나다보니 여러 개의 프로그램을 돌릴 수 없는 컴퓨터의 한계가 큰 단점으로 부각되었습니다. 이는 누군가는 자신의 프로그램을 실행하기 위해 계속 기다리거나 다른 일을 할 수 없도록 만들었습니다. 이를 해결하기 위해 여러 응용 프로그램을 등록시켜 놓으면 순차적으로 실행하는 <strong>배치 처리 시스템</strong>이 생겨났습니다.</p>
<h1 id="1960년대-후반">1960년대 후반</h1>
<p>배치처리 시스템으로 순차적으로 앱을 실행할 수 있어 누군가가 다음 프로그램을 실행시키기 위해 지켜봐야 하는 수고로움은 덜었습니다. 그러나, 단순히 순차적으로 실행하기 때문에 선행된 어플리케이션의 시간이 길다면 뒤에 어플리케이션은 간단한 것임에도 한참을 기다려야 했습니다. 또, cpu도 한 번에 하나의 어플리케이션만 실행하므로 cpu의 유휴시간이 늘어나 비생산적이었습니다.</p>
<p>따라서 이때에는 <strong>시분할 시스템과 멀티태스킹 개념이 제안</strong>되었지만 운영체제에 반영되지는 못했습니다.</p>
<ul>
<li>시분할 시스템(Time Sharing System): 다중 사용자를 지원하기 위해 <strong>컴퓨터 응답시간을 최소화</strong> 하려는 것으로 하나의 어플리케이션이 끝나는 걸 기준으로 프로세스를 바꾸는 것이 아니라 일정 시간동안만 해당하는 어플리케이션을 실행하는 것으로 기준을 바꿈.</li>
<li>멀티프로그래밍(Multi Programing): 시간대비 cpu사용률을 높이기 위함. app1에서 cpu사용 이외의 일을 처리할 때 app2의 일을 가져와서 cpu를 계속 사용하게 함. 단일 cpu에서 여러 응용 프로그램의 병렬 실행을 가능하게 하는 시스템으로 <strong>응용프로그램 실행시간이 최소화</strong> 됨</li>
<li>멀티태스킹(Multi Tasking): 사용자 입장에서 여러 응용프로그램이 동시에 실행되는 것처럼 보이게 함.</li>
</ul>
<h1 id="1970년대">1970년대</h1>
<p>1970년대 이전에는 어셈블리어로 소프트웨어를 개발하다보니 컴퓨터 제조사마다 다른 명령어로 개발을 해야했고 본 목적을 하기 위해 제어해야 할 것이 너무 많아 프로그래밍 복잡도가 높았습니다. 그러다 1970년대에 C언어가 개발되어 컴퓨터 출신 의존도가 없어지고 프로그래밍 복잡도가 낮아졌습니다. 이에 힘입어 <strong>UNIX OS</strong>가 탄생하였습니다.</p>
<p>UNIX OS</p>
<ul>
<li>미국 AT&amp;T사의 벨 연구소에서 켄톰슨, 데니스 리치가 만듦</li>
<li>현대 운영체제의 기본 기술(멀티태스킹, 시분할시스템, 멀티프로그래밍, 다중사용자 지원)을 모두 포함한 최초의 운영체제</li>
</ul>
<h1 id="1980년대">1980년대</h1>
<ul>
<li>PC의 시대</li>
<li>CLI -&gt; GUI</li>
</ul>
<blockquote>
<p>사용자와 컴퓨터를 연결하는 인터페이스의 종류
CLI(Command Line Interface) : 터미널 환경
GUI(Graphical User Interface) : GUI 환경</p>
</blockquote>
<h1 id="1990년대">1990년대</h1>
<ul>
<li>GUI환경, pc보급이 되면서 응용프로그램의 시대가 열림. Window OS 대중화</li>
<li>네트워크 기술의 발전 -&gt; 인터넷의 대중화</li>
<li>오픈소스 운동 활성화 시작: UNIX, LINUX</li>
</ul>
<h1 id="2000년대">2000년대</h1>
<ul>
<li>오픈소스 활성화: Apache, MySQL...</li>
<li>가상머신, 대용량 병렬처리 활성화</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[MIPS 컴퓨터 동작방식]]></title>
            <link>https://velog.io/@dev_crystal/MIPS-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@dev_crystal/MIPS-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Mon, 27 Dec 2021 03:10:28 GMT</pubDate>
            <description><![CDATA[<h1 id="프로시저">프로시저</h1>
<ul>
<li>고급언어의 함수 같은 기능.</li>
<li>제공되는 인수에 따라서 특정 작업을 수행하는 서브루틴</li>
</ul>
<h2 id="실행단계">실행단계</h2>
<ol>
<li>프로시저가 접근할 수 있는 곳에 인수를 가지고 있는 레지스터($a0~$a3)의 값을 넣는다.</li>
<li>프로시저에로 제어권을 넘긴다. 수행중인 명령어의 주소는 PC(program counter)레지스터에 그 때 그 때 저장됨.</li>
<li>계산 결과를 반환값을 저장하는 레지스터에 넣음($v0~$v1)</li>
<li>복귀 주소를 저장하는 레지스터($ra)에 복귀 주소를 저장(jal: jump-and-link instruction)하고 할당된 주소로 복귀(jr: jump register): 호출한 프로그램으로 제어권을 반환
 ex) jal procedure address, jr $ra</li>
</ol>
<h1 id="스택">스택</h1>
<ul>
<li>레지스터가 부족한 경우에 사용</li>
<li>선입후출로 이루어진 자료구조</li>
<li>스택포인터(sp)의 값은 가장 최근에 들어온 데이터의 위치를 가지고 있음</li>
<li>정적변수 선언을 했을 때 값이 저장되는 공간</li>
<li>레지스터보다 훨씬 큰 공간이므로 배열 등을 저장할 수 있음.</li>
</ul>
<h2 id="스택-프레임">스택 프레임</h2>
<ul>
<li>각 프로시저는 독립된 스택프레임을 가지고 있음</li>
<li>프로시저에 저장된 레지스터와 지역변수를 가지고 있는 스택영역</li>
<li>프레임포인터(fp)가 프로시저의 첫 번째 워드를 가리킴</li>
<li>스택포인터(sp)는 스택의 최하단을 가리킴</li>
<li>프로시저의 복귀 주소를 저장하는 곳</li>
</ul>
<h1 id="주소지정방식">주소지정방식</h1>
<h2 id="1-수치-주소지정-피연산자는-명령어-내에-있는-상수">1. 수치 주소지정: 피연산자는 명령어 내에 있는 상수</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/88880728-c24d-4705-a661-5b39d3bf0e7f/image.png" alt=""></p>
<ul>
<li>명령어의 주소 필드에 데이터가 들어 있으며 상수의 정의나 변수 값의 초기화에 편리</li>
<li>데이터를 얻기 위한 기억장치 접근이 필요 없음</li>
<li>사용할 수 있는 수의 크기가 주소 필드의 크기로 제한됨</li>
</ul>
<h2 id="2-레지스터-주소지정-피연산자는-레지스터">2. 레지스터 주소지정: 피연산자는 레지스터</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/4f340417-424b-4ad2-b601-6ef0e32513d2/image.png" alt=""></p>
<ul>
<li>cpu내의 레지스터에 데이터가 저장되어 있는 방식</li>
<li>주소 필드가 레지스터 번호를 나타내므로 적은 비트수가 필요함</li>
<li>데이터 저장공간이 cpu 내부 레지스터로 제한</li>
</ul>
<h2 id="3-베이스-레지스터-주소지정-메모리-주소는-베이스-레지스터의-값과-주소-필드의-변위-값을-더함">3. 베이스 레지스터 주소지정: 메모리 주소는 베이스 레지스터의 값과 주소 필드의 변위 값을 더함</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/84483bd6-f7b1-4340-b847-d40787099607/image.png" alt=""></p>
<ul>
<li>베이스 레지스터의 값과 주소 필드의 변위 값을 더해서 주소를 구함</li>
<li>피연산자가 메모리에 존재</li>
<li>메모리 자원을 사용하므로 저장형식이 유연</li>
</ul>
<h2 id="4-pc-상대-주소지정-pc값과-명령어-내-상수의-합을-더해서-주소를-구함">4. pc 상대 주소지정: pc값과 명령어 내 상수의 합을 더해서 주소를 구함</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/1493b0ce-f763-4a91-b1ab-d7375bde48c5/image.png" alt=""></p>
<ul>
<li>pc(program counter)값에 명령어의 주소 필드 값을 더해서 유효주소를 구함</li>
<li>적은 비트를 사용하는 것으로 32비트 분기 주소를 만드는 것이 가능</li>
<li>조건부 분기명령에 사용</li>
</ul>
<h2 id="5-의사직접-주소지정-명령어-내의-26비트를-pc의-상위-비트들과-연접하여-점프-주소를-구함">5. 의사직접 주소지정: 명령어 내의 26비트를 pc의 상위 비트들과 연접하여 점프 주소를 구함</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/e581e318-e772-459e-b5ec-c0f95bfbdaa9/image.png" alt=""></p>
<ul>
<li>명령어 내의 26비트를 pc의 상위 비트들과 연접하여 점프 주소를 구함</li>
<li>무조건 분기문에서 주로 사용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[연결리스트(Linked List)]]></title>
            <link>https://velog.io/@dev_crystal/%EC%97%B0%EA%B2%B0%EB%A6%AC%EC%8A%A4%ED%8A%B8Linked-List</link>
            <guid>https://velog.io/@dev_crystal/%EC%97%B0%EA%B2%B0%EB%A6%AC%EC%8A%A4%ED%8A%B8Linked-List</guid>
            <pubDate>Mon, 06 Dec 2021 04:26:59 GMT</pubDate>
            <description><![CDATA[<h1 id="연결-리스트">연결 리스트</h1>
<ul>
<li>동적인 자료 구조: 필요할 때마다 원소를 추가/삭제할 수 있고 크기가 계속 변함</li>
<li>원소를 차례대로 저장하긴 하지만, 원소들이 메모리상에 연속적으로 위치하지는 않음.</li>
<li>원소는 배열과 달리 원소를 추가 삭제할 때 다른 원소를 이동(비싼 연산)시킬 필요는 없지만 원소를 찾을 때까지 처음부터 루프를 반복해야 함.</li>
</ul>
<h1 id="구현">구현</h1>
<pre><code class="language-javascript">function LinkedList() {

  // helper class. 연결 리스트에 추가되는 원소.
  const Node = function(element) {
      this.element = element; // 원소
    this.next = null; // 다음 노드를 가리키는 포인터
  };

  let length = 0; // 연결 리스트의 개수. 내부 프로퍼티
  let head = null; // 연결이 시작되는 지점을 참조

  // 리스트의 맨 끝에 원소 추가
  this.append = function(element) {
    const node = new Node(element);
    let current;

    if (head === null) { // 리스트가 비어있다면
      head = node;
    } else {
      current = head;

      while (current.next) { // 마지막 원소를 발견할 때까지 반복문 실행
          current = current.next;
      }

      curent.next = node;
    }

    length++;
  };

  // 해당 위치에 원소 삽입
  this.insert = function(position, element) {
    if (position &lt; 0 || position &gt; length) return false;

    let node = new Node(element),
        current = head,
        previous,
        index = 0;

    if (position === 0) {
      node.next = current;
      head = node;
    } else {
      while (index++ &lt; position) {
          previous = current;
        current = current.next;
      }

      node.next = current;
      previous.next = node;
    }

    length++;

    return true;
  };

  // 해당 위치의 원소 삭제
  this.removeAt = function(position) {
    if (position &lt; -1 || position &gt; length) return null;

    let current = head,
        previous,
        index = 0;

    if (position === 0) { // 첫 번째 원소 삭제
      head = current.next;
    } else {
      while(index++ &lt; position) {
          previous = current;
        current = current.next;
      }

      previous.next = current.next;
    }

    length--;

    return current.element;
  };

  // 원소 삭제
  this.remove = function(element) {
    const index = this.indexOf(element);
    return this.removeAt(index);
  };

  // 해당 원소의 인덱스 반환. 존재하지 않을 경우 -1 return
  this.indexOf = function(element) {
    let current = head,
        index = -1;

    while (current) {
      if (element === current.element) {
          return index;
      }
      index++;
      current = current.next;
    }

    return -1;
  };

  // 링크드 리스트가 비어있는지 여부
  this.isEmpty = function() {
    return length === 0;
  };

  // 원소의 개수 반환
  this.size = function() {
    return length;
  };

  // 원소의 값 string으로 반환
  this.toString = function() {
    let current = head,
        string = &#39;&#39;;

    while (current) {
      string += current.element;
      current = current.next;
    }

    return string;
  };

  // head 값 얻기
  this.getHead = function() {
    return head;
  };
}</code></pre>
<h1 id="이중-연결-리스트doubly-linked-list">이중 연결 리스트(Doubly Linked List)</h1>
<p>이중 연결 리스트는 다음 노드와 이전 노드, 2개의 연결 정보를 이중으로 갖고 있는 리스트.</p>
<ul>
<li>양방향으로 리스트 순회가 가능(처음-&gt;끝, 끝-&gt;처음)</li>
</ul>
<h1 id="환형-연결-리스트circular-linked-list">환형 연결 리스트(Circular Linked List)</h1>
<ul>
<li>단방향(연결 리스트) 또는 양방향(이중 연결 리스트)의 참조 정보를 갖음</li>
<li>마지막 원소의 next가 head(첫 번째 원소)를 가리킴</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CPU]]></title>
            <link>https://velog.io/@dev_crystal/CPU</link>
            <guid>https://velog.io/@dev_crystal/CPU</guid>
            <pubDate>Wed, 01 Dec 2021 12:34:58 GMT</pubDate>
            <description><![CDATA[<h1 id="성능">성능</h1>
<p>성능은 시간과 리소스에 대응되어 컴퓨터 시스템이 수행하는 작업의 양.
성능을 측정하는 척도는 의도에 따라 다양합니다. 개인 사용자는 응답 시간으로 성능을 느끼고 데이터센터 관리자는 처리량으로 성능을 느낍니다.</p>
<ul>
<li><p>응답시간
응답시간은 작업 시작부터 종료까지 걸린 시간을 의미합니다.
디스크 접근, 메모리 접근, 입출력 작업, 운영체제 오버헤드, cpu 연산 시간을 포함합니다.</p>
</li>
<li><p>처리량
단위 시간당 처리할 수 있는 일의 양을 의미합니다.
응답시간과 다른 척도로 시스템 성능을 평가할 때 사용합니다.</p>
</li>
</ul>
<h2 id="상대-성능">상대 성능</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/2de82cd0-bd06-4b5a-9ea2-64161d05653b/image.png" alt=""></p>
<p>[Q1] 같은 프로그램이 컴퓨터 A에서 10초 B에서는 15초 걸린다면 A는 B보다 얼마나 빠른가?
A: 1.5배</p>
<h2 id="cpu-성능-측정">CPU 성능 측정</h2>
<p>프로그램의 성능을 실행시간으로만 판단하기에는 OS 오버헤드, 메모리 접근, 입출력 작업등이 포함된 경과 시간이고, 상황에 따라 이 시간들은 변칙적이기 때문에 정확하지 않습니다.
따라서 CPU 성능은 특정 작업을 하기 위해 CPU가 소비한 실제 시간만을 측정합니다.</p>
<p>프로그램의 cpu 실행시간 
= 프로그램의 cpu 클럭 사이클 수 * 클럭 사이클 시간
= 프로그램의 cpu 클럭 사이클 수 / 클럭 속도
= 명령어 수 x CPI / 클럭 속도</p>
<blockquote>
<p><strong>Clock</strong></p>
</blockquote>
<ul>
<li>논리상태 0과 1이 주기적으로 나타나는 방형파 신호</li>
<li>클럭 사이클: 클럭의 시간 간격</li>
<li>클럭 속도: 클럭 사이클의 역수. 숫자가 클 수록 빠른 처리 능력.</li>
<li>CPI = Clock cycle Per Instruction = 명령어 하나의 실행에 필요한 평균 클럭 사이클 수</li>
</ul>
<p>[Q2] 2GHz 클럭의 컴퓨터 A에서 10초에 수행되는 프로그램이 있다. 이 프로그램을 6초 동안에 실행할 컴퓨터 B를 설계하고자 한다. 이 때, A보다 1.2배 많은 클럭 사이클이 필요하게 된다고 할 때, 컴퓨터 B의 클럭 속도는 얼마로 결정해야 하는가?
A: 4GHz</p>
<h1 id="전력">전력</h1>
<p>전력이란 컴퓨터가 동작하는데 소비되는 전기의 힘입니다. 트랜지스터가 0에서 1로 혹은 그 반대로 스위칭할 때 전력이 사용됩니다. 따라서 전력은 트랜지스터가 스위칭할 때 소모되는 에너지와 시간당 논리값이 바뀌는 빈도수의 곱입니다.</p>
<p>전력과 클럭 속도는 밀접한 관계가 있고,
cpu 온도가 낮아지면 전력소모가 줄어듭니다.
파워서플라이를 통해 전력을 공급받습니다.</p>
<p>전압을 낮추면 트랜지스터 누설 전류가 커지고, 전압이 너무 높아지면 온도가 올라가서 냉각 비용이 발생합니다.</p>
<p><img src="https://images.velog.io/images/dev_crystal/post/cad5c16d-d55a-429a-a00a-7464da1ca386/image.png" alt="">
전력이 높아질수록 클럭속도도 비례 관계에 있는데 팬티엄4 cpu 이후에는 전력은 줄이고 클록속도는 유지하는 모양새네요.</p>
<h1 id="cpu-발전">CPU 발전</h1>
<h2 id="발전-방향">발전 방향</h2>
<p>단일 프로세서 -&gt; 멀티코어 프로세서(여러 개의 코어를 집적한 프로세서)
파이프라인 구조를 채택하여 병렬성을 높이고 처리량을 최대화 함</p>
<h2 id="발전-과정">발전 과정</h2>
<h3 id="intel8086">Intel8086</h3>
<p><img src="https://images.velog.io/images/dev_crystal/post/f8fa9606-b2f0-4b5d-a78c-c5983e6fcbd9/image.png" alt=""></p>
<ul>
<li>최초의 16bit 프로세서</li>
<li>PC가 많이 보급되지 않아 성공에는 실패함</li>
<li>가성비가 떨어져서 아케이드판, 콘솔쪽에서도 채용되지 못함</li>
</ul>
<h3 id="80386-cpu">80386 CPU</h3>
<p><img src="https://images.velog.io/images/dev_crystal/post/0b1d502c-07bd-4e9a-86c4-43997a0202b4/image.png" alt=""></p>
<ul>
<li>386이라는 이름으로 유명한 CPU</li>
<li>32bit 아키텍쳐로 이루어진 최초의 CPU</li>
<li>PC의 보급화로 전세계적으로 널리 사용됨</li>
</ul>
<blockquote>
<p>32bit
386CPU에서 1 클럭 당 처리할 수 있는 최대 크기는 32bit 데이터입니다.
32bit는 byte로 표현하면 4byte(1byte = 8bit)이므로 4byte 주소체계를 가지고 있다고 할 수 있습니다.
4byte는 00000000~FFFFFFFF까지 표현할 수 있는 수이고, 이는 10진수로 표현하면 4294967295.
이는 4GB를 십진수로 표현한 값과 같습니다. 
4GB = 4 * 1024 * 1024 * 1024 (kb, mb, gb) = 4294967296</p>
</blockquote>
<h3 id="펜티엄">펜티엄</h3>
<p><img src="https://images.velog.io/images/dev_crystal/post/b7b93a1a-8321-435b-9203-e8f58a9ca06a/image.png" alt=""></p>
<ul>
<li>숫자 대신 최초로 이름을 갖게된 cpu</li>
<li>클럭속도: 60MHz ~ 300MHz</li>
<li>슈퍼스칼라 아키텍쳐 채용</li>
</ul>
<h3 id="코어2">코어2</h3>
<ul>
<li>멀티코어 프로세서</li>
<li>클럭속도: 1GHz~3.33GHz</li>
<li>코어개수: 1, 2, 4</li>
</ul>
<blockquote>
<p><strong>암달의 법칙</strong></p>
</blockquote>
<ul>
<li>트랜지스터의 증가로 인한 성능 향상에 한계점 도달</li>
<li>코어 개수를 늘리는 방향으로 cpu의 진화</li>
<li>멀티코어 -&gt; 성능 2배 X</li>
<li>병렬화 문제에서 기인하여 프로세서 개수 만으로는 성능 향상에 한계점이 생김</li>
</ul>
<h3 id="i3i5i7">i3/i5/i7</h3>
<ul>
<li>i3: 2코어 4스레드</li>
<li>i5: 4코어 4스레드</li>
<li>i7: 4코어 8스레드</li>
<li>하이퍼 스래딩</li>
<li>오버클럭(4790K, 7800K)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터란?]]></title>
            <link>https://velog.io/@dev_crystal/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%9E%80-dedc3zen</link>
            <guid>https://velog.io/@dev_crystal/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%9E%80-dedc3zen</guid>
            <pubDate>Wed, 01 Dec 2021 00:42:19 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터란">컴퓨터란?</h1>
<ul>
<li>전자회로를 이용하여 데이터를 처리하는 장치</li>
<li>입력, 제어, 기억, 연산, 출력 기능을 갖추고 있음</li>
</ul>
<h2 id="컴퓨터가-하는-일">컴퓨터가 하는 일</h2>
<ul>
<li>복잡한 계산</li>
<li>초정밀 그래픽 구현</li>
<li>네트워크 통신</li>
</ul>
<h1 id="컴퓨터-분야의-아이디어-8가지">컴퓨터 분야의 아이디어 8가지</h1>
<h2 id="1-무어의-법칙을-고려한-설계">1. 무어의 법칙을 고려한 설계</h2>
<p>인텔 창립자 무어가 &#39;18개월~24개월마다 칩에 직접되는 트랜지스터(소자)의 수가 2배가 된다.&#39; 라고 주장.
컴퓨터 설계자는 무어의법칙을 예상하여 설계를 하게 됨.</p>
<h2 id="2-설계를-단순화한-추상화">2. 설계를 단순화한 추상화</h2>
<p>무어의 법칙에 따라 자원의 수가 급격히 증가하여 설계시간이 길어져 생산성이 낮아짐.
생산성을 높이기 위해 추상화 개념을 도입함.
하위 수준의 상세 내용을 안보이게 가려서 상위 수준의 모델을 단순화.
ex) 고급언어</p>
<h2 id="3-common-case-fast">3. common case fast</h2>
<p>자주 발생하는 일을 빠르게 처리하여 최적화하면 드물게 발생하는 일을 최적화하는 것보다 성능 개선에 큰 도움을 줌.</p>
<h2 id="4-병렬성을-이용한-성능-개선">4. 병렬성을 이용한 성능 개선</h2>
<p>큰 문제를 여러 개의 작은 문제로 나누어서 해결함. 문제를 동시에 처리하여 성능을 높임.
ex) 쓰레드</p>
<h2 id="5-파이프라이닝을-통한-성능-개선">5. 파이프라이닝을 통한 성능 개선</h2>
<p>병렬성의 특별한 형태.
처음 단계 출력이 다음 단계 입력으로 이어지는 구조.</p>
<h2 id="6-예측을-통한-성능-개선">6. 예측을 통한 성능 개선</h2>
<p>수요가 예상되는 부분을 예측, 복구 비용을 낮추고 성공 확률을 높일 경우 효과적
정확한 예측을 위한 지표가 필요함</p>
<h2 id="7-메모리-계층-구조">7. 메모리 계층 구조</h2>
<p>메모리 가격이 컴퓨터 가격에 주요한 요소였을 시점 고안한 방식. 
최상위 - 비싸고 제일 빠른 메모리
최하위 - 느리고 값이 싼 메모리
캐시 메모리는 최상의 계층만큼 빠르고 최하위 계층만큼 크면서 저렴한 메인메모리가 있는 것처럼 보임</p>
<h2 id="8-여유분을-이용한-신용도-개선">8. 여유분을 이용한 신용도 개선</h2>
<p>컴퓨터는 신뢰할 수 있어야 함. 기계는 언제든지 고장날 수 있으므로 여유분 준비.
ex) 장애 대처를 위한 여유분 준비, 데이터 손실을 막기 위한 백업과 같은 이치</p>
<h1 id="컴퓨터의-구성요소">컴퓨터의 구성요소</h1>
<ol>
<li>프로세서(Processor)
1-1. 데이터 패스(Data path): 데이터가 이동하는 통로. 회로.
1-2. 제어 유닛(Control unit): 프로그램 명령에 따라서 데이터 패스, 입/출력의 동작을 결정함</li>
<li>메모리(Memory)</li>
<li>입력(Input)</li>
<li>출력(Output)</li>
</ol>
<h2 id="processor">Processor</h2>
<ul>
<li>제어 유닛이 메모리로부터 명령과 데이터를 얻어 산술/논리 연산을 하고서 연산 과정에서 나오는 일시적인 데이터들은 레지스터(Register)에 저장하고, 명령에 따라 주변 장치들의 동작도 제어 함.</li>
</ul>
<blockquote>
<p><strong>Register</strong>
성능이 월등하게 좋지만 용량이 너무 작아서 연산할 때만 사용하는 메모리</p>
</blockquote>
<h3 id="cpu">CPU</h3>
<ul>
<li>메모리로부터 명령어를 받아와 제어 신호를 생성</li>
<li>컴퓨터 명령어(기계어)를 해석하고 연산함</li>
<li>컴퓨터 기술을 이끄는 원동력</li>
<li>인간의 두뇌와 같은 역할</li>
</ul>
<h3 id="gpu">GPU</h3>
<ul>
<li>픽셀로 이루어진 영상을 처리하는 용도로 탄생</li>
<li>싱글코어는 CPU보다 저성능이지만 병렬적인 수천개의 코어가 연결되어 있음</li>
<li>인공지능 기술 발전의 선도주자</li>
</ul>
<h2 id="memory">Memory</h2>
<ul>
<li>실질적으로 명령어(프로세스) 및 데이터를 저장해 두었다가 필요할 때 읽어들이는 저장소</li>
<li>레지스터의 용량이 너무 작아서 출시됨.</li>
<li>EX) RAM, ROM, 캐시</li>
</ul>
<h2 id="input">Input</h2>
<ul>
<li>데이터를 메모리에 입력하기 위한 컴퓨터의 외부 장치</li>
<li>ex) 키보드, 마우스, 스캐너..</li>
</ul>
<h2 id="output">Output</h2>
<ul>
<li>메모리로부터 데이터를 읽어 컴퓨터에 처리된 결과를 출력해주는 컴퓨터의 외부 장치</li>
<li>ex) 모니터, 프린터, 스피커..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[사용하는 어플 설치]]></title>
            <link>https://velog.io/@dev_crystal/%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%96%B4%ED%94%8C-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev_crystal/%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%96%B4%ED%94%8C-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Tue, 30 Nov 2021 00:55:55 GMT</pubDate>
            <description><![CDATA[<h1 id="chrome">chrome</h1>
<p>웹개발에 필요한 필수 브라우저.
chrome 홈페이지에서 다운로드</p>
<h1 id="카카오톡">카카오톡</h1>
<p>메신저</p>
<h1 id="베어">베어</h1>
<p>마크업으로 편리하게 작성 가능한 노트</p>
<h1 id="메뉴바에서-달력-바로보기">메뉴바에서 달력 바로보기</h1>
<p><a href="https://www.mowglii.com/itsycal/">다운로드</a>
기본 메뉴바 날짜/시간 설정은 설정-&gt;날짜및시간-&gt;시계</p>
<h1 id="화면-단축키로-분할">화면 단축키로 분할</h1>
<p><a href="https://www.spectacleapp.com">spectacle</a></p>
<h1 id="압축프로그램-윈도우-호환">압축프로그램 (윈도우 호환)</h1>
<p><a href="https://www.keka.io/ko/">keka</a></p>
<h1 id="앱-클리너">앱 클리너</h1>
<p>찌꺼기 파일들까지 삭제해주는 앱 삭제 프로그램
<a href="https://freemacsoft.net/appcleaner/">AppCleaner</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[맥 setting 초기설정]]></title>
            <link>https://velog.io/@dev_crystal/%EB%A7%A5-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dev_crystal/%EB%A7%A5-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sun, 28 Nov 2021 03:44:00 GMT</pubDate>
            <description><![CDATA[<p>처음 맥을 받을 때 내가 원래 사용하던 방식으로 게속 사용하기 위해 해야할 초기 설정들.</p>
<h1 id="트랙패드-및-마우스-관련-설정">트랙패드 및 마우스 관련 설정</h1>
<h2 id="탭하여-클릭하기-활성화">탭하여 클릭하기 활성화</h2>
<p>꼭 깊게 누르지 않아도 선택이 되므로 매우 편리합니다.</p>
<p>설정-&gt;트랙패드-&gt;포인트 및 클릭-&gt;탭하여 클릭하기 체크
<img src="https://images.velog.io/images/dev_crystal/post/1ca11041-1806-4432-974a-f1de99948e81/image.png" alt=""></p>
<h2 id="세손가락으로-드래그">세손가락으로 드래그</h2>
<p>누르지 않고도 드래그가 가능하여 편리합니다.</p>
<p>설정-&gt;손쉬운사용-&gt;포인터제어기-&gt;트랙패드 옵션-&gt;드래그 활성화 체크-&gt;세손가락으로 드래그하기 옵션 선택
<img src="https://images.velog.io/images/dev_crystal/post/5a852fef-cca6-45d3-bf1e-91119a5fb146/image.png" alt=""></p>
<h1 id="계정-관련-설정">계정 관련 설정</h1>
<h2 id="아이클라우드-동기화-끄기">아이클라우드 동기화 끄기</h2>
<p>동일한 계정으로 여러 애플 제품을 쓰고 있다면 아이클라우드로 데이터를 공유할 수 있습니다.
5기가가 무료로 제공되는데 모든 것을 다 공유한다면 금방 차겠지요?
이를 방지하기 위해 시스템 환경설정 -&gt; Appple Id -&gt; iCloud -&gt; iCloud Drive 옵션 -&gt; 데스크탑 및 문서 폴더 체크항목을 해제해 주세요.
<img src="https://images.velog.io/images/susu1991/post/3f88d4a7-b2da-411a-9d47-595399f4a91c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-07-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.02.13.png" alt=""></p>
<h1 id="메뉴바-설정">메뉴바 설정</h1>
<h2 id="배터리-잔량-수치로-보기">배터리 잔량 수치로 보기</h2>
<p>환경설정 -&gt; Dock 및 메뉴 막대 -&gt; 배터리 -&gt; 퍼센트 보기 체크</p>
<h1 id="finder">finder</h1>
<h2 id="파일-경로-보기">파일 경로 보기</h2>
<p>파일의 구조가 한 눈에 보여 파악하기 쉽고 경로를 더블 클릭하면 해당 경로로 바로 이동합니다. 마우스 오른쪽 버튼 눌러서 복사하면 터미널에서 경로 바로 이동도 가능합니다.</p>
<p>메뉴바-&gt;보기-&gt;경로 막대 보기 체크
메뉴바-&gt;보기-&gt;상태 막대 보기 체크</p>
<h2 id="finder-환경설정-고급">finder 환경설정: 고급</h2>
<ul>
<li>모든 파일 확장자보기 체크</li>
<li>폴더 우선 정렬 윈도우에서 체크</li>
</ul>
<h2 id="finder-환경설정-사이드바">finder 환경설정: 사이드바</h2>
<ul>
<li>즐겨찾기 항목에서 홈 디렉터리 체크</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[스택(stack)]]></title>
            <link>https://velog.io/@dev_crystal/%EC%8A%A4%ED%83%9Dstack</link>
            <guid>https://velog.io/@dev_crystal/%EC%8A%A4%ED%83%9Dstack</guid>
            <pubDate>Fri, 12 Nov 2021 11:08:31 GMT</pubDate>
            <description><![CDATA[<h1 id="스택이란">스택이란?</h1>
<p>Last In First Out 원리에 따라 정렬된 컬렉션입니다. 즉, 항상 마지막에 들어온 원자가 가장 먼저 나가는 구조로 정의된 자료구조이지요.</p>
<h1 id="사용-예">사용 예</h1>
<p>프로그래밍 언어의 컴파일러, 변수나 메소드 호출을 컴퓨터 메모리에 저장할 때</p>
<h1 id="스택-만들기">스택 만들기</h1>
<pre><code class="language-javascript">function Stack() {
  let items = [];

  this.push = function(element) {
      items.push(element);
  }
  this.pop = function(element) {
      items.pop(element);
  }
  // 맨 마지막 원소가 뭔지 알려줌
  this.peek = function(element) {
      return items[items.length - 1];
  }
  this.isEmpty = function() {
      return items.length === 0;
  }
  this.size = function(element) {
      return items.length;
  }
  this.clear = function(element) {
      items = [];
  }
  this.print = function(element) {
    console.log(items.toString());
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터의 역사]]></title>
            <link>https://velog.io/@dev_crystal/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%9E%80</link>
            <guid>https://velog.io/@dev_crystal/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%9E%80</guid>
            <pubDate>Thu, 11 Nov 2021 22:22:05 GMT</pubDate>
            <description><![CDATA[<h1 id="고대">고대</h1>
<ul>
<li>주판 (연산도구): B.C 3000 ~ 17C
<img src="https://images.velog.io/images/dev_crystal/post/59edd1c1-ed7d-4185-a0e0-6a3a2bb1accd/image.png" alt=""></li>
</ul>
<h1 id="중세">중세</h1>
<h2 id="1642년-파스칼린pascaline-발명">1642년 파스칼린(Pascaline) 발명</h2>
<ul>
<li>블레즈 파스칼(Blaise Pascal)이 톱니바퀴의 원리를 이용한 최초의 기계식 수동계산기</li>
<li>덧셈, 뺄셈 가능.</li>
<li>오늘날 컴퓨터 발명의 표본이 되는 기술.</li>
<li>계산기 발달의 원칙 3가지를 세우게 됨. &#39;자리 올림은 자동으로 수행해야 한다.&#39;, &#39;뺄셈은 다이얼을 역으로 회전시킴으로 가능하다.&#39;, &#39;곱셈은 덧셈의 반복적인 수행으로 가능하다.&#39;
  <img src="https://images.velog.io/images/dev_crystal/post/cf2c7f04-1ed0-4acb-a4af-61b2b890da47/image.png" alt=""></li>
</ul>
<h2 id="1671년-고트프리트-빌헬름-라이프니츠gottfried-wilhelm-leibniz-계산기">1671년 고트프리트 빌헬름 라이프니츠(Gottfried Wilhelm Leibniz) 계산기</h2>
<ul>
<li>파스칼 계산기처럼 톱니바퀴 방식</li>
<li>덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근 가능</li>
<li><strong>2진법</strong>을 적용. (기계식에게는 2진법이 10진법보다 더 효율적이라고 판단)
  <img src="https://images.velog.io/images/dev_crystal/post/ece0e688-94ba-43e8-9384-71535d57019d/image.png" alt=""></li>
</ul>
<h1 id="근대">근대</h1>
<h2 id="19c-중반-찰스-배비지charles-babbage의-차분기관과-해석기관-발명">19C 중반 찰스 배비지(Charles babbage)의 차분기관과 해석기관 발명</h2>
<p><img src="https://images.velog.io/images/dev_crystal/post/0e8a523c-6c89-4d53-9c17-c1f8bcfffb77/image.png" alt="">
<strong>차분기관</strong>
    - 손으로 핸들을 돌려 동력을 얻음
    - 다항식을 계산하여 로그 값을 계산하는 용도
    - 톱니바퀴를 이용하여 10진법 사용. 오늘날 CPU의 파이프라인의 원조(이전의 결과가 다음의 시작이 되는)
    - 영국 정부의 지원이 끊겨 차분 기관 발명에 문제가 생겨 생산은 못함.</p>
<p><strong>해석기관</strong>
    - 증기기관으로 동력을 얻음(톱니바퀴가 너무 많아 사람의 힘으로 안됨)
    - 제어, 연산, 기억, 입출력 장치를 포함하고 있어 모든 범용 계산이 가능. 디지털 컴퓨터의 토대가 됨(오늘날 컴퓨터의 아버지)
    - 디지털 데이터(이진수)를 천공카드에 기록하여 입력 기능을 함(현대 컴퓨터 개념이 처음 제시)
    - 그 당시 공학의 수준과 재정 문제 등으로 이 기관도 완성하지 못하고 죽음.</p>
<h2 id="1930년대">1930년대</h2>
<ul>
<li>데이비드 힐버트는 1900년대 초에 <strong>결정문제</strong>(기계적인 방식으로 모든 수학적인 증명이 가능한가?)를 20세기에 풀어야 할 문제로 제시.</li>
<li>수학자 괴델은 불완전성 정리 논문으로 불가능함을 주장했지만 수학적인 명확한 증명은 부족했다.</li>
<li>앨런 튜링은 <strong>정지문제</strong>(주어진 프로그램이 해결하고자 하는 문제를 해결하는지 말해줄 수 있는 일반화된 알고리즘이 존재하는가? -&gt; 기계가 판정 불가능한 문제를 제시하여 기계가 모든 문제를 해결할 수 없음을 증명)와 <strong>튜링 머신</strong>을 고안하여 괴델의 주장을 증명</li>
<li>알론조 처치는 <strong>람다 게산법</strong>이라는 형식 시스템으로 괴델의 주장을 증명</li>
</ul>
<blockquote>
<p><strong>튜링머신</strong>
힐버트가 주장한 형식시스템(수학을 표현하기 위한 필수 불가결한 요소들)의 개념을 다시 정리한 것입니다.
수학적 표현을 위해서는 공리(구체적인 대상), 추론규칙, 정리가 있어야 한다고 했는데 튜링은 이를 입력, 프로그램, 출력으로 대응했다. 
테이프를 일정한 크기의 셀로 나누어서 셀 안에는 기호를 기록해 놓습니다.(입력) 헤드로 테이프를 읽고, 행동표(추론규칙)를 참고하여 기계가 상태를 기록(정리)합니다.
이는 가상의 기계이지만 컴퓨터의 설계가 담겨있고, 하나의 컴퓨터가 모든 일을 할 수 있음이 처음 증명되었다. 따라서 튜링을 <strong>컴퓨터의 아버지</strong>라고 부르게 만든 이론입니다.</p>
</blockquote>
<h2 id="1940년대">1940년대</h2>
<ul>
<li>콘라트 추제 z3: 전자기계식 전자동 디지털 22비트 부동소수점 컴퓨터. 최초의 보편 튜링 머신.</li>
<li>폰 노이만이 stored-program architecture 제안<blockquote>
<p><strong>폰 노이만 구조(stored-program architecture)</strong>
임의 접근이 가능한 저장매체에 저장해 둔 프로그램을 실행할 때마다 메모리로 불러들여서 작업을 진행하는 방식
이는, 기존 컴퓨터가 프로그래밍을 하기 위해서 스위치를 설치하고 전선을 연결하여 대이터를 전송하고 신호를 처리하는 방식을 바꾸었다. 이는 컴퓨터가 다른 작업을 할 때 굳이 하드웨어를 재배치할 필요가 없으므로 범용성이 크게 향상된다.</p>
</blockquote>
</li>
<li>ENIAC 탄생<blockquote>
<p><strong>ENIAC</strong>
에커트와 모클리의 공동설계로 1946년 2월 14일에 만들어진 30톤짜리 컴퓨터.
컴퓨터의 시초.
<img src="https://images.velog.io/images/dev_crystal/post/9bc8000a-19a2-4a09-afc4-f7468318e5f7/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="1960년대">1960년대</h2>
<p><strong>IBM시스템/360</strong></p>
<ul>
<li>최초의 현대적인 메인프레임</li>
<li>동시에 여러 명이 접속하여 작업 가능</li>
<li>시스템 주변기기와 완전화 호환성 제공 - 비즈니스 컴퓨터 요건을 갖춤</li>
<li>최초로 가상 스토리지 기술 적용</li>
<li>80년대 pc의 보급 및 인터넷 성장의 촉매로 작용</li>
</ul>
<h2 id="1970년대">1970년대</h2>
<ul>
<li>Thompson과 Ritchie가 C언어와 Unix 개발<blockquote>
<p>C언어라는 고급언어가 탄생하여 프로그래밍의 효율성이 엄청 증가하였습니다.
이를 기반으로 Unix운영체제가 탄생합니다. Unix OS는 어느 제조사에서 만든 컴퓨터든 상관없이 유저가 똑같이 컴퓨터를 제어할 수 있게 만들어 주었습니다.</p>
</blockquote>
</li>
<li>intel8008 마이크로 프로세서 개발: cpu의 시대</li>
</ul>
<h1 id="현대">현대</h1>
<h2 id="1980년대">1980년대</h2>
<ul>
<li>GUI와 마우스를 사용하는 애플 매킨토시 등장: pc시장 대성공</li>
<li>Intel 프로세서와 MS-DOS 운영체제를 공식으로 사용하는 IBM PC가 등장하여 pc시장이 열림</li>
</ul>
<h2 id="1990년대">1990년대</h2>
<ul>
<li>리누스토발즈가 리눅스를 개발<blockquote>
<p><strong>리눅스</strong>
데스크톱/랩톱 용도 뿐만아니라 웹 서버, 클라우드, 안드로이드 및 포터블 게이밍 콘솔등의 모바일 기기, 각종 임베디드 기기 (가전용, 상업용, 산업용, 차량용 기기)등을 구동하는 운영 체제다. </p>
</blockquote>
</li>
<li>Microsoft의 윈도우 OS 등장</li>
<li>인터넷 포털(야후, 구글)의 등장</li>
</ul>
<h2 id="2000년대">2000년대</h2>
<ul>
<li>컴퓨터를 활용하여 인간 DNA 30억 염기서열을 밝히는 게놈 프로젝트</li>
<li>아이폰을 필두로 스마트폰이 쏟아져 나옴</li>
<li>빅데이터, 인공지능의 시대</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제란?]]></title>
            <link>https://velog.io/@dev_crystal/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80</link>
            <guid>https://velog.io/@dev_crystal/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80</guid>
            <pubDate>Thu, 11 Nov 2021 22:11:46 GMT</pubDate>
            <description><![CDATA[<h1 id="운영체제operating-system란">운영체제(Operating System)란?</h1>
<p>컴퓨터 하드웨어만 있다면 이들을 이용해서 메모리를 얼만큼 사용할 것인지, CPU는 어떻게 관리할 것인지 등이 자동으로 돌아가지는 않습니다. 운영체제는 컴퓨터의 소프트웨어 중의 하나로 저장매체(SSD/HDD)에 설치되어 있다가 컴퓨터가 켜지면 메모리에 올라가 실행되어(폰노이만 구조) <strong>컴퓨터의 하드웨어(System Resource)를 관리</strong>하고 <strong>사용자와 컴퓨터를 연결</strong>해주며 <strong>응용 프로그램을 제어</strong>합니다.</p>
<blockquote>
<p><strong>System Resources = computer hardware</strong>
cpu, memory, I/O Devices(monitor, mouse, keyboard, Network), SSD, HDD</p>
</blockquote>
<blockquote>
<p>프로그램 = 소프트웨어 = OS(운영체제) + Application(응용 프로그램)
OS는 응용 프로그램을 관리합니다. 실행하고 권한을 관리하고 응용프로그램 유저도 관리합니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/dev_crystal/post/c353aa5d-72da-4d4f-b2f8-a3d45f3ee2d4/image.png" alt=""></p>
<h1 id="운영체제의-종류">운영체제의 종류</h1>
<ul>
<li>Windows OS</li>
<li>Mac OS</li>
<li>UNIX OS<ul>
<li>Linux OS: 웹서버에서 많이 사용</li>
</ul>
</li>
</ul>
<h1 id="운영체제의-목표">운영체제의 목표</h1>
<ul>
<li>응용프로그램이 요청하는 system resource를 효율적으로 분배하고 지원</li>
<li>application이 효율적으로 동작하도록 지원</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Array]]></title>
            <link>https://velog.io/@dev_crystal/Array</link>
            <guid>https://velog.io/@dev_crystal/Array</guid>
            <pubDate>Tue, 09 Nov 2021 01:48:24 GMT</pubDate>
            <description><![CDATA[<h2 id="배열-생성">배열 생성</h2>
<pre><code class="language-javascript">let daysOfWeek = new Array(&#39;일요일&#39;, &#39;월요일&#39;, &#39;화요일&#39;, &#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;);
let daysOfWeek2 = [&#39;일요일&#39;, &#39;월요일&#39;, &#39;화요일&#39;, &#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;]; // better</code></pre>
<h2 id="배열-합치기">배열 합치기</h2>
<pre><code class="language-javascript">let daysOfWeek1 = [&#39;일요일&#39;, &#39;월요일&#39;];
let daysOfWeek2 = [&#39;화요일&#39;];
let daysOfWeek3 = [&#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;];
daysOfWeek1.concat(daysOfWeek2, daysOfWeek3);</code></pre>
<h2 id="원소-추가삭제">원소 추가/삭제</h2>
<blockquote>
<p><strong>배열 끝 추가/삭제</strong>
push(element) / pop()
<strong>배열 앞 추가/삭제</strong>
unshift(element) / shift()
<strong>n번째 요소 추가/삭제</strong>
splice(startIndex, 0, addElement1, addElement2...) / splice(startIndex, deleteElementsLength)</p>
</blockquote>
<pre><code class="language-javascript">// 배열 끝에 새 원소 추가
numbers[numbers.length] = 10;
numbers.push(11);

// 배열 앞에 새 원소 추가
for (var i=numbers.length; i&gt;=0; i--){
    numbers[i] = numbers[i-1];
}
numbers[0] = -1;

numbers.unshift(-2);

// 배열 끝의 원소 삭제
numbers.pop();

// 배열 앞의 원소 삭제
numbers.shift();

// n번째 원소 추가, 삭제
numbers.splice(5, 3);
numbers.splice(5, 0, 4, 5, 6);</code></pre>
<h2 id="다차원-배열">다차원 배열</h2>
<p>테이블처럼 배열을 만듭니다. x축과 y축의 의미를 담아 볼 수 있겠네요!</p>
<pre><code class="language-javascript">let averageTemp = [];

averageTemp[0] = [72,75,79,79,81,81];
averageTemp[1] = [81,79,75,75,73,72];

// 다차원 배열 확인하기
function printMatrix(myMatrix) {
    for (var i=0; i&lt;myMatrix.length; i++){
        for (var j=0; j&lt;myMatrix[i].length; j++){
            console.log(myMatrix[i][j]);
        }
    }
}</code></pre>
<h2 id="반복-메서드">반복 메서드</h2>
<h3 id="every">every</h3>
<ul>
<li>함수의 결과 값이 false가 될때까지 배열의 모든 원소를 반복.</li>
<li>모두 true여야만 true를 반환함<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.every((number) =&gt; number % 2 === 0);</code></pre>
</li>
</ul>
<h3 id="some">some</h3>
<ul>
<li>함수의 결과 값이 true가 나올 때까지 배열의 모든 원소를 반복</li>
<li>하나라도 true가 나오면 true를 반환함<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.some((number) =&gt; number % 2 === 0);</code></pre>
</li>
</ul>
<h3 id="foreach">foreach</h3>
<ul>
<li>조건에 상관없이 배열의 모든 원소를 반복<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.foreach((number) =&gt; console.log(number));</code></pre>
</li>
</ul>
<h3 id="map">map</h3>
<ul>
<li>콜백함수를 실행한 결과를 새 배열로 반환<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.map((number) =&gt; console.log(number));</code></pre>
</li>
</ul>
<h3 id="filter">filter</h3>
<ul>
<li>콜백함수의 조건을 만족하는 결과들만 모아 새 배열로 반환<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.filter((number) =&gt; number % 2 === 0);</code></pre>
</li>
</ul>
<h3 id="reduce">reduce</h3>
<ul>
<li>각 원소를 순회하면서 콜백함수를 실행한 계산값을 누적하여 최종 결과값을 반환<blockquote>
<p>reduce(reducer, initialValue);
reducer = (prevValue, currentValue, currentIndex, array) =&gt; { return value }</p>
<ul>
<li>currentIndex: 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작합니다.</li>
<li>array: reduce()를 호출한 배열.</li>
</ul>
</blockquote>
</li>
</ul>
<pre><code class="language-javascript">numbers = [0,1,2,3,4,5,6];
numbers.reduce((pre, cur) =&gt; pre + cur, 0);</code></pre>
<h2 id="정렬">정렬</h2>
<h3 id="reverse">reverse</h3>
<ul>
<li>정렬을 거꾸로 바꿈<pre><code class="language-javascript">let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14];
numbers.reverse();</code></pre>
</li>
</ul>
<h3 id="sort">sort</h3>
<ul>
<li>모든 원소를 문자열로 취급하여 사전적으로 정렬함<pre><code class="language-javascript">// 숫자형 오름차순 정렬: 음수 값이 나오면 앞으로, 0이면 동등, 양수면 뒤로 정렬함.
let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14];
numbers.sort((a, b) =&gt; a - b);
</code></pre>
</li>
</ul>
<p>// 알파벳 정렬: 대소문자 구별 없이 비교
let names =[&#39;Ana&#39;, &#39;ana&#39;, &#39;john&#39;, &#39;John&#39;];
names.sort((a, b) =&gt; a.toLowerCase() - b.toLowerCase());</p>
<p>// 악센트 문자라면
let names2 = [&#39;Ma챔ve&#39;, &#39;Maeve&#39;];
console.log(names2.sort(function(a, b){
    return a.localeCompare(b);
}));</p>
<pre><code>
## 검색
### indexOf
- 해당하는 원소가 없으면 -1을 반환
- 해당하는 원소가 있으면 맞는 첫번째 원소의 인덱스를 반환
```javascript
let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 10, 15];
numbers.indexOf(10); // 5</code></pre><h3 id="lastindexof">lastIndexOf</h3>
<ul>
<li>해당하는 원소가 없으면 -1을 반환</li>
<li>해당하는 원소가 있으면 맞는 마지막 원소의 인덱스를 반환 <pre><code class="language-javascript">let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 10, 15];
numbers.indexOf(10); // 10</code></pre>
</li>
</ul>
<h2 id="문자열-변환">문자열 변환</h2>
<h3 id="tostring">toString</h3>
<ul>
<li>배열의 모든 원소를 하나의 문자열로 바꿈. ,가 자동으로 붙음<pre><code class="language-javascript">let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 10, 15];
numbers.toString();</code></pre>
</li>
</ul>
<h3 id="join">join</h3>
<ul>
<li>배열의 모든 원소를 문자열로 바꿈. 매개변수로 원하는 구분자를 넣을 수 있고 빈문자열을 넣으면 아무런 구분자없이 만들 수 있음<pre><code class="language-javascript">let numbers = [1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 10, 15];
numbers.join(&quot;&quot;);
numbers.join(&quot;-&quot;);</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generic]]></title>
            <link>https://velog.io/@dev_crystal/Generic</link>
            <guid>https://velog.io/@dev_crystal/Generic</guid>
            <pubDate>Fri, 15 Oct 2021 21:01:16 GMT</pubDate>
            <description><![CDATA[<h1 id="generic이란">Generic이란?</h1>
<p>어떤 타입이 올 지 미리 알 수 없는 상황에서 해당 타입부분을 실행할 때 타입을 받도록 여지를 남겨두는 것입니다.</p>
<h2 id="function">function</h2>
<pre><code class="language-typescript">function checkNotNull&lt;T&gt;(arg: T | null): T {
  if (arg == null) {
    throw new Error(&#39;not valid number!&#39;);
  }
  return arg;
}</code></pre>
<h2 id="class">class</h2>
<pre><code class="language-typescript">class SimpleEither&lt;L, R&gt; implements Either&lt;L, R&gt; {
  constructor(private leftValue: L, private rightValue: R) {}
  left(): L {
    return this.leftValue;
  }

  right(): R {
    return this.rightValue;
  }
}

const either: Either&lt;number, number&gt; = new SimpleEither(4, 5);
either.left(); // 4
either.right(); //5</code></pre>
<h2 id="contrains">contrains</h2>
<p>어떤 타입이 올 지 알 수 없다고 해도, any처럼 사용되지 않기 위해서 제약을 걸 수 있는 부분은 제약을 걸 수도 있습니다.
타입을 좀 더 구체적으로 정할수록 좋습니다.</p>
<pre><code class="language-typescript">const obj = {
  name: &#39;ellie&#39;,
  age: 20,
};

const obj2 = {
  animal: &#39;🐕&#39;,
};

console.log(getValue(obj, &#39;name&#39;)); // ellie
console.log(getValue(obj, &#39;age&#39;)); // 20
console.log(getValue(obj2, &#39;animal&#39;)); // 🐕

function getValue&lt;T, K extends keyof T&gt;(obj: T, key: K): T[K] {
  return obj[key];
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[cache와 조건부 요청]]></title>
            <link>https://velog.io/@dev_crystal/cache%EC%99%80-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%9A%94%EC%B2%AD</link>
            <guid>https://velog.io/@dev_crystal/cache%EC%99%80-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%9A%94%EC%B2%AD</guid>
            <pubDate>Fri, 08 Oct 2021 21:11:20 GMT</pubDate>
            <description><![CDATA[<h1 id="캐시가-없을-때">캐시가 없을 때</h1>
<ul>
<li>데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.</li>
<li>인터넷 네트워크는 느리므로 사용자 경험이 느려진다.</li>
</ul>
<h1 id="캐시-적용">캐시 적용</h1>
<ul>
<li>캐시를 하면 캐시 가능 시간(cache-control)동안 네트워크를 사용하지 않아도 됨.</li>
<li>비싼 네트워크 사용량을 줄일 수 있어서 사용자 경험이 빨라진다.</li>
<li>캐시 유효시간이 초과하면 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.</li>
</ul>
<p><img src="https://images.velog.io/images/dev_crystal/post/b5f289e1-7f20-4cbb-ab0b-b066a7d151ad/image.png" alt=""></p>
<h1 id="검증-헤더-추가">검증 헤더 추가</h1>
<p>캐시 유효시간이 만료되어 서버에 재요청을 할 때, 서버에는 2가지 상태가 존재한다.</p>
<ol>
<li>서버에서 데이터가 변경되지 않았음</li>
<li>서버에서 데이터가 변경되었음.</li>
</ol>
<p>1번의 경우라면 데이터를 또 받는 것보다 캐시를 재사용하는 게 효율적이다. 단, 클라이언트 데이터와 서버 데이터가 같다는 걸 알 수 있어야 한다.</p>
<blockquote>
<p>실용적인 해결책으로, 데이터가 바뀌지 않았을 때 네트워크 다운로드가 발생해도 용량이 적은 헤더 정보만 다운로드 하도록 설계한다.</p>
</blockquote>
<h2 id="last-modified">Last-Modified</h2>
<p>응답 헤더의 Last-Modified를 브라우저 캐시에 저장했다가 캐시 시간이 초과되어서 재요청할 때(if-modified-since 조건부 요청 헤더) 서버에서 데이터 최종 수정일을 비교하여 같으면 304 Not Modified를 보내고 http body를 보내지 않는다.</p>
<ul>
<li>1초 미만 단위로 캐시 조정 불가능</li>
<li>날짜 기반의 로직 사용(데이터 결과가 같지만 데이터를 건드려서 날짜만 다른 경우)</li>
<li>서버에서 별도의 캐시 로직을 관리하고 싶은 경우</li>
</ul>
<h2 id="etag방식">ETag방식</h2>
<p>캐시용 데이터에 임의의 고유한 버전 이름을 달아두고, 데이터가 변경되면 이 이름을 바꾸어서 변경함. 태그가 같으면 유지, 다르면 다시 받기!</p>
<p>응답헤더에서 ETag로 값을 보내면 브라우저 캐시에 이를 저장했다가 요청을 보낼 때 If-None-Match(조건부 요청 헤더)로 저장했던 값을 보내고 서버에서 태그가 같으면 304, 아니면 데이터 보냄.</p>
<ul>
<li>캐시 제어 로직을 서버에서 완전히 관리</li>
<li>ETag만 서버에 보내서 같으면 유지, 다르면 다시 받기</li>
</ul>
<blockquote>
<p>정리:
검증 헤더: ETag, Last-Modified
조건부 요청 헤더: If-Match, If-None-Match (ETag값 사용) / If-Modified-Since, If-Unmodifid-Since (Last-Modified값 사용)</p>
</blockquote>
<h1 id="캐시-제어-헤더">캐시 제어 헤더</h1>
<ul>
<li>Cache-Control: 캐시 제어</li>
<li>Pragma: 캐시 제어(하위 호환)</li>
<li>Expires: 캐시 유효 기간(하위 호환)</li>
</ul>
<h2 id="cache-control">Cache-Control</h2>
<ul>
<li>Cache-Control: max-age
캐시 유효시간, 초 단위</li>
<li>Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 origin 서버에 검증하고 사용</li>
<li>Cache-Control: no-store
데이터에 민감한 정보가 있으므로 저장하면 안됨.</li>
</ul>
<h2 id="pragma">Pragma</h2>
<ul>
<li>Pragma: no-cache
http 1.0 하위 호환</li>
</ul>
<h2 id="expires">Expires</h2>
<ul>
<li>Espires: Mon, 01 Jan 1990 00:00:00 GMT
HTTP 1.0 하위 호환. 캐시 만료일을 정확한 날짜로 지정</li>
</ul>
<h1 id="프록시-캐시">프록시 캐시</h1>
<p>예를 들어 origin server가 미국에 있고 클라이언트는 한국이라면 서버가 너무 멀어서 통신 시간이 지연됩니다. 이를 해소하고자 프록시 캐시 서버를 한국 어딘가 두어 사용하는 방법이 있습니다. 이때 클라이언트에게 있는 캐시는 private 캐시, 프록시 캐시 서버는 public 캐시라고 합니다.</p>
<ul>
<li>Cache-Control: public
응답이 public 캐시에 저장되어도 됨.</li>
<li>Cache-Control: private
응답이 해당 사용자만을 위한 것이라 private 캐시에 저장함(기본값)</li>
<li>Cache-Control: s-maxage
프록시 캐시에만 적용되는 max-age</li>
<li>Age: 60
오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간(초 단위)</li>
</ul>
<h1 id="캐시-무효화">캐시 무효화</h1>
<blockquote>
<p>Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache</p>
</blockquote>
<ul>
<li>no-cache: 데이터는 캐시해도 되지만, 항상 원서버에 검증하고 사용</li>
<li>no-store: 데이터에 민감한 정보가 있으므로 저장하면 안됨.(메모리에서 사용하고 최대한 빨리 삭제)</li>
<li>must-revalidate: 캐시 만료 후 최초 조회 시 원 서버에 검증해야 하며, 원 서버에 접근 실패 시 반드시 오류가 발생해야 함(504)</li>
<li>Pragma는 HTTP1.0 하위호환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿠키]]></title>
            <link>https://velog.io/@dev_crystal/%EC%BF%A0%ED%82%A4</link>
            <guid>https://velog.io/@dev_crystal/%EC%BF%A0%ED%82%A4</guid>
            <pubDate>Thu, 07 Oct 2021 21:51:59 GMT</pubDate>
            <description><![CDATA[<h1 id="특징">특징</h1>
<ul>
<li>항상 서버에 전송되어 네트워크 트래픽을 추가로 유발한다.</li>
</ul>
<h1 id="생명주기">생명주기</h1>
<ul>
<li>세션쿠키: 만료 날짜를 생략하면 브라우저 종료시까지만 유지</li>
<li>영속쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지<blockquote>
<p>Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
Set-Cookie: max-age=3600 (3600초)</p>
</blockquote>
</li>
</ul>
<h1 id="경로">경로</h1>
<p>이 경로를 포함한 하위 경로 페이지만 쿠키 접근</p>
<blockquote>
<p>path=/home</p>
</blockquote>
<h1 id="보안">보안</h1>
<ul>
<li>secure: 쿠키는 http, https를 구분하지 않고 전송하는데 Secure를 적용하면 https일때만 전송</li>
<li>HttpOnly: XSS 공격을 방지하고 자바스크립트에서 접근 불가한 쿠키.</li>
<li>SameSite: XSRF 공격을 방지하고 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[http header]]></title>
            <link>https://velog.io/@dev_crystal/http-header</link>
            <guid>https://velog.io/@dev_crystal/http-header</guid>
            <pubDate>Thu, 07 Oct 2021 21:47:04 GMT</pubDate>
            <description><![CDATA[<h1 id="http-header란">HTTP Header란</h1>
<p>http 전송에 필요한 모든 부가정보를 다룸. 필요시 임의의 헤더도 추가 가능하다. 표준 헤더가 너무 많다.</p>
<h1 id="헤더-분류">헤더 분류</h1>
<ul>
<li>Gneral 헤더: 메시지 전체에 적용되는 정보</li>
<li>Request 헤더: 요청정보</li>
<li>Response 헤더: 응답 정보</li>
<li>Entity 헤더: 엔티티 바디 정보를 해석할 수 있는 정보 제공.</li>
</ul>
<h1 id="rfc723x-변화">RFC723x 변화</h1>
<p>오랫동안 표준으로 사용되던 1999년의 RFC2616이 폐기되고 2014년 새로운 RFC7230~7235 표준이 등장함.</p>
<ul>
<li>엔티티 -&gt; 표현(Representation)으로 명칭이 바뀜.</li>
</ul>
<h2 id="representation-header">Representation header</h2>
<ul>
<li>Content-Type: 표현 데이터의 형식
  미디어 타입, 문자 인코딩 등으로 표현. ex) Content-Type: text/html; charset=utf-8 or application/json or image/png</li>
<li>Content-Encoding: 표현 데이터의 압축 방식. 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가. 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제. ex) gzip, deflate, identity</li>
<li>Content-Language: 표현 데이터의 자연 언어. ex)ko, en, en-US</li>
<li>Content-Length: 표현 데이터의 길이. 바이트 단위. Transfer-Encoding을 사용하면 이 헤더는 사용하면 안됨.</li>
</ul>
<h3 id="content-negotiation협상-클라이언트가-선호하는-표현-요청">Content-negotiation(협상): 클라이언트가 선호하는 표현 요청.</h3>
<ul>
<li>Accept: 클라이언트가 선호하는 미디어 타입 전달</li>
<li>Accept-Charset: 클라이언트가 선호하는 문자 인코딩</li>
<li>Accept-Encoding: 클라이언트가 선호하는 압축 인코딩</li>
<li>Accept-Language: 클라이언트가 선호하는 자연 언어</li>
</ul>
<p>여러가지를 원할 수 있으므로 우선순위를 넣어서 보낼 수도 있다. </p>
<p>1) Quality Values(q)로 구현 가능하고, 값은 0~1사이인데 클수록 우선순위가 높다. 생략하면 1이다.
2) q가 없다면 구체적일수록 우선순위가 높다.</p>
<p>ex1) Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7</p>
<ol>
<li>ko-KR</li>
<li>ko</li>
<li>en-US</li>
<li>en</li>
</ol>
<p>ex2) Accept: text/<em>, text/plain, text/plain;format=flowed, */</em></p>
<ol>
<li>text/plain;format=flowed</li>
<li>text/plain</li>
<li>text/*</li>
<li><em>/</em></li>
</ol>
<h2 id="전송방식">전송방식</h2>
<ul>
<li>Content-Length: 단순 전송. ex) Content-Length: 3423</li>
<li>Content-Encoding: 압축 전송 ex) Content-Length: gzip</li>
<li>Transfer-Encoding: 분할 전송 ex) Transfer-Encoding: chunked</li>
<li>Range, Content-Range: 범위 전송 ex) Range: bytes=1001-2000 or Content-Range: bytes 1001-2000 / 2000</li>
</ul>
<h2 id="일반정보">일반정보</h2>
<ul>
<li>From: 유저 에이전트의 이메일 정보. 검색 엔진에서 주로 사용.</li>
<li>Referer: 이전 웹페이지 주소. 이걸 이용해서 유입 경로 분석 가능</li>
<li>User-Agent: 유저 에이전트 애플리케이션 정보. 통계 정보.</li>
<li>Server: 요청을 처리하는 오리진 서버의 소프트웨어 정보. 응답에서 사용.</li>
<li>Date: 메시지가 생성된 날짜. 응답에서 사용.</li>
</ul>
<h2 id="특별한-정보">특별한 정보</h2>
<ul>
<li>Host: 요청한 호스트 정보(도메인). 필수. 서버에 여러 호스트가 있을 수 있기 때문.</li>
<li>Location: 페이지 리다이렉션. 3xx 응답 결과에서 자동 이동을 위해서. 201과 쓰이면 리소스 url이 됨.</li>
<li>Allow: 허용 가능한 HTTP method. 405 응답에 포함되어야 함.</li>
<li>Retry-After: 유저가 다음 요청을 하기까지 기다려야 하는 시간. 503과 쓰여 서비스가 언제까지 불능인지 알려줄 수 있음. 날짜 표기 혹은 초단위로 표기함.</li>
</ul>
<h2 id="인증">인증</h2>
<ul>
<li>Authorization: 클라이언트 인증 정보</li>
<li>WWW-Authenticate: 리소스 접근시 필요한 인증 방법 정의. 401과 함께 사용.</li>
</ul>
<h2 id="쿠키">쿠키</h2>
<ul>
<li>Set-Cookie: 서버에서 클라이언트로 쿠키 전달(응답)</li>
<li>Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>