<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>woohaha.log</title>
        <link>https://velog.io/</link>
        <description>Hello World!</description>
        <lastBuildDate>Fri, 29 Nov 2024 14:09:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>woohaha.log</title>
            <url>https://velog.velcdn.com/images/woohaha_log/profile/6184212d-e2c9-4425-bd09-9550b294374f/image.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. woohaha.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/woohaha_log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[운영체제 면접 스터디 회고]]></title>
            <link>https://velog.io/@woohaha_log/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%A9%B4%EC%A0%91-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@woohaha_log/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%A9%B4%EC%A0%91-%EC%8A%A4%ED%84%B0%EB%94%94-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 29 Nov 2024 14:09:23 GMT</pubDate>
            <description><![CDATA[<h3 id="1-스터디-참여-계기">1. 스터디 참여 계기</h3>
<p>11월 한 달 간 <a href="https://jscode-study.oopy.io/">JSCODE CS 스터디</a>에 참여하여 운영체제 면접 스터디를 진행했다!</p>
<p>전공자이지만 운영체제 과목을 수강한지 오래돼서 다시 공부를 해야했기 때문에 스터디를 알아보던 중 JSCODE 스터디를 발견했다</p>
<p>나는 강제성이 없으면 발등에 불이 떨어져도 타들어갈 때까지 미루는 인간이라 예치금 5만원을 걸고 시작하는 게 제일 마음에 들었던 것 같다</p>
<h3 id="2-활동-내용">2. 활동 내용</h3>
<p>스터디는 매주 금요일 저녁 8시에 모의 면접 형식으로 진행되었다</p>
<p>매주 목요일 자정까지 해당 주차의 CS 지식을 블로그에 정리하여 과제로 제출했고,</p>
<p>공부한 개념을 바탕으로 스터디 시간에 실제 CS 면접을 보는 것과 같이 서로 질문해주고 피드백을 해주는 방식이었다</p>
<p><img src="https://velog.velcdn.com/images/woohaha_log/post/33fea936-a4e0-4f4f-b888-73e7f6a381be/image.png" alt="">
⬆️ 매주 이런식으로 운영체제 개념에 대해 정리했었다
이 과정에서 인강도 듣고 책도 찾아보고 나름 재미있었던 것 같기도?</p>
<h3 id="3-느낀-점">3. 느낀 점</h3>
<p>우선 처음 면접 스터디를 진행하고 느꼈던 점이 있다!</p>
<p>확실히 혼자 개념을 정리하고 &#39;음 이해했다~&#39;하고 끝낼 때와는 다르게
질문에 대해 말로 풀어서 설명해야해서 공부했던 내용들이 확실히 내꺼가 되는 느낌이었다</p>
<p>그리고 면접 경험이 많지 않아 첫 주차에는 어버버 답변을 했었는데 뒤로 갈수록 자신감이 생겨서 조금은 더 능숙하게 답변할 수 있었던 것 같다..</p>
<h3 id="4-스터디-참여를-고민하는-사람들에게">4. 스터디 참여를 고민하는 사람들에게!</h3>
<ul>
<li>CS 개념을 공부해야하는데 미루고 있다</li>
<li>면접 경험이 많지 않아 무섭다</li>
<li>열심히 공부하는 사람들에게 동기부여 받고 싶다</li>
<li>한 달동안 빡세게 집중해서 무언가를 해내고 싶다</li>
</ul>
<p>이런 조건에 해당하는 사람들(해당하지 않더라도) 강추합니다...!!</p>
<blockquote>
<ul>
<li>JSCODE 모의면접 스터디 모집 :  <a href="https://jscode-study.oopy.io/">https://jscode-study.oopy.io/</a></li>
</ul>
</blockquote>
<ul>
<li>JSCODE 소프트웨어 교육 :  <a href="https://www.jscode.kr/">https://www.jscode.kr/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[7 - 교착 상태]]></title>
            <link>https://velog.io/@woohaha_log/7-%EA%B5%90%EC%B0%A9-%EC%83%81%ED%83%9C</link>
            <guid>https://velog.io/@woohaha_log/7-%EA%B5%90%EC%B0%A9-%EC%83%81%ED%83%9C</guid>
            <pubDate>Thu, 21 Nov 2024 11:33:13 GMT</pubDate>
            <description><![CDATA[<h1 id="1-교착-상태데드락란">1. 교착 상태(데드락)란?</h1>
<h4 id="💡-2개-이상의-작업이-동시에-이루어지는-경우-다른-작업이-끝나기만-기다리며-작업을-더-이상-진행하지-못하는-상태">💡 2개 이상의 작업이 동시에 이루어지는 경우, 다른 작업이 끝나기만 기다리며 작업을 더 이상 진행하지 못하는 상태</h4>
<ul>
<li><p>아사(기아) 현상과 다른점!</p>
<ul>
<li>아사 현상은 잘못된 정책으로 특정 프로세스의 작업이 지연되는 문제</li>
<li>교착 상태는 여러 프로세스가 작업을 진행하다 보니 발생하는 자연적인 현상. 
따라서 강압적으로 해결해야 함(like 교통정리)</li>
</ul>
</li>
<li><p>*<em>식사하는 철학자🍴 *</em></p>
<img src="https://velog.velcdn.com/images/woohaha_log/post/24783931-d198-497d-a1dd-13f54a3abb4d/image.png" alt="식사하는 철학자" width="300" height="높이">

<p>  이미지 출처: 위키백과</p>
</li>
</ul>
<p>✔️ 둥근 식탁에 앉은 철학자들은 왼쪽에 있는 포크를 잡은 뒤 오른쪽 포크를 잡아야만 식사가 가능함
✔️ 철학자들은 음식을 먹기 위해 왼쪽 포크를 잡은 뒤 오른쪽 포크를 봄
✔️ 하지만 이미 왼쪽 포크를 들고 있는 다른 철학자가 있음
✔️ 결과적으로 오른쪽 포크를 아무도 잡지 못해 모두 굶어 죽음💀</p>
<h1 id="2-교착-상태-필요조건">2. 교착 상태 필요조건</h1>
<p>💡 아래 네 가지 조건을 동시에 만족해야만 교착 상태가 발생함</p>
<h4 id="1-상호-배제">1. 상호 배제</h4>
<ul>
<li>한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태<h4 id="2-점유와-대기">2. 점유와 대기</h4>
</li>
<li>프로세스가 어떤 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태<h4 id="3-비선점">3. 비선점</h4>
</li>
<li>어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태<h4 id="4-원형-대기">4. 원형 대기</h4>
</li>
<li>점유와 대기를 하는 프로세스 간의 관계가 원을 이루어야 함</li>
</ul>
<h1 id="3-교착-상태-해결-방법">3. 교착 상태 해결 방법</h1>
<h2 id="1-예방">1. 예방</h2>
<ul>
<li>교착 상태를 유발하는 네 가지 조건이 발생하지 않도록 무력화 하는 방식(부작용 있음)<h4 id="✔️-상호-배제-예방">✔️ 상호 배제 예방</h4>
</li>
<li>시스템 내의 자원을 모두 공유하게 만든다?    <ul>
<li>임계 구역이 보호 받지 못하면 작업 결과가 달라짐!</li>
<li>결론: 사실상 어렵다<h4 id="✔️-비선점-예방">✔️ 비선점 예방</h4>
</li>
</ul>
</li>
<li>모든 자원을 빼앗을 수 있도록 만드는 방법<ul>
<li>아사 현상 발생 가능</li>
<li>모든 자원이 선점 가능한 것은 아님 ex) 프린터기<h4 id="✔️-점유와-대기-예방">✔️ 점유와 대기 예방</h4>
</li>
</ul>
</li>
<li>프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 하는 방법
== 전부 할당하거나 아예 할당하지 않는 방식<ul>
<li>프로세스가 자신이 사용하는 모든 자원을 자세히 알기 어려움(추가로 필요한 자원이 생기면 확보하기 어려움)</li>
<li>자원의 활용성이 떨어짐<h4 id="✔️-원형-대기-예방">✔️ 원형 대기 예방</h4>
</li>
</ul>
</li>
<li>점유와 대기를 하는 프로세스들이 원형을 이루지 못하도록 막는 방법</li>
<li>자원에 번호를 붙이고 오름차순으로 할당함<ul>
<li>자원에 번호를 어떻게 부여할지 문제가 됨(어떤 번호를 붙이는지에 따라 활용률이 달라지기 때문에)<h2 id="2-회피">2. 회피</h2>
</li>
</ul>
</li>
<li>프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나누어주면 교착 상태가 발생하는지 파악하여 그 수준 이하로 나누어주는 방법</li>
<li>교착 상태가 발생하지 않는 범위 내에서만 자원을 할당함</li>
<li>교착 상태가 발생하는 범위에 있으면 프로세스를 대기 시킴<h4 id="21-은행원-알고리즘">2.1 은행원 알고리즘</h4>
</li>
<li>은행에서 대출 금액이 가능한 범위 내(안정 상태)이면 대출을 허용하고 그렇지 않으면 거부되는 것과 비슷해서 이러한 명칭이 붙음</li>
<li><strong>안정 상태</strong>: 모든 프로세스가 요청한 자원을 순서대로 할당받아 실행될 수 있는 상태</li>
</ul>
<img src="https://velog.velcdn.com/images/woohaha_log/post/59e3e573-8266-4338-9ed0-9a049eda3221/image.png" alt="안정 상태" width="400" height="">

<pre><code> - 만약 P2가 자원을 요청하면 2만큼을 추가로 할당받고 실행을 종료한 뒤 6을 반환함
 - 이런식으로 전체 작업을 완료할 수 있기 때문에 안정 상태임</code></pre><ul>
<li><strong>불안정 상태</strong></li>
</ul>
<img src="https://velog.velcdn.com/images/woohaha_log/post/2fd30f99-a4c8-412b-ab93-e82f53f21a79/image.png" alt="불안정 상태" width="400" height="">

<pre><code>- 사용 가능한 자원이 1인 상태인데 이는 현재 남은 자원으로는 어떤 프로세스도 끝낼 수 없다는 의미</code></pre><h4 id="22-교착-상태-회피의-문제점">2.2 교착 상태 회피의 문제점</h4>
<p>1️⃣ 프로세스가 자신이 사용할 모든 자원을 미리 선언해야 함(정확하지 않을 수 있음)
2️⃣ 시스템의 전체 자원 수가 고정적이어야 함(시스템의 자원수는 유동적임. 고장이나 새로운 자원 추가 등등)
3️⃣ 자원이 낭비됨</p>
<ul>
<li>프로세스에 따라 최대 자원을 사용하지 않고 종료되는 경우도 있음</li>
<li>교착 상태 회피에서는 실제로 교착 상태가 발생하지 않는데도 발생할 것이라고 예상하고 자원을 할당하기 때문에 교착 상태가 발생하지 않을 경우 자원 낭비가 됨<h2 id="3-교착-상태-검출과-회복">3. 교착 상태 검출과 회복</h2>
<ul>
<li>교착 상태의 발생을 인정하고 사후에 조치하는 방식</li>
<li>프로세스가 자원을 요구하면 일단 할당, 교착 상태가 검출되면 회복<h4 id="선점을-통한-회복">선점을 통한 회복</h4>
</li>
<li>교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식<h4 id="프로세스-강제-종료를-통한-회복">프로세스 강제 종료를 통한 회복</h4>
</li>
<li>교착 상태에 놓인 프로세스 모두 강제 종료</li>
</ul>
</li>
<li>작업 내역을 잃을 위험이 있음<ul>
<li>교착 상태가 해결될 때까지 한 프로세스씩 강제 종료</li>
</ul>
</li>
<li>교착 상태가 회복이 됐는지 안 됐는지 계속 확인하느라 오버헤드 발생</li>
</ul>
<blockquote>
<p>참조
<a href="https://product.kyobobook.co.kr/detail/S000200716007">📚 쉽게 배우는 운영체제</a>
<a href="https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard">🧑🏻‍🏫 개발자를 위한 컴퓨터공학1: 혼자 공부하는 컴퓨터구조 + 운영체제</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[6 - 프로세스 동기화]]></title>
            <link>https://velog.io/@woohaha_log/5-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94-zzqnndrl</link>
            <guid>https://velog.io/@woohaha_log/5-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94-zzqnndrl</guid>
            <pubDate>Thu, 21 Nov 2024 08:35:19 GMT</pubDate>
            <description><![CDATA[<h2 id="1-프로세스-동기화란">1. 프로세스 동기화란?</h2>
<p>프로세스들의 수행 시기를 맞추는 것!</p>
<p>크게 두 가지를 의미하는데,</p>
<p>1️⃣ <strong>실행 순서 제어</strong>: 프로세스를 올바른 순서대로 실행하기</p>
<ul>
<li><p><strong>reader writer problem</strong></p>
<ul>
<li>reader 와 writer 프로세스는 순서에 맞게 실행되어야 함</li>
<li>ex: reader 프로세스는 Book.txt 안에 값이 존재한다는 조건이 만족되어야 실행 가능함</li>
</ul>
</li>
</ul>
<p>2️⃣ <strong>상호 배제</strong>: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기</p>
<ul>
<li>bank account problem</li>
<li>생산자 &amp; 소비자 problem</li>
</ul>
<p>(스레드도 동기화의 대상임)</p>
<h2 id="2-공유-자원과-임계구역">2. 공유 자원과 임계구역</h2>
<h3 id="21-용어-정리">2.1 용어 정리</h3>
<p><strong>💡 공유 자원(shared recource)</strong>
여러 프로세스 혹은 스레드가 공유하는 자원
<strong>💡 경쟁 조건(race condition)</strong>
2개 이상의 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황
<strong>💡 임계 구역(critical area)</strong>
공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역</p>
<h3 id="22-임계구역-문제-해결-조건">2.2 임계구역 문제 해결 조건</h3>
<h4 id="✔️-상호-배제mutual-exclusion-⭐️-중요-⭐️">✔️ 상호 배제(mutual exclusion) ⭐️ 중요! ⭐️</h4>
<ul>
<li>한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음</li>
<li>임계구역 내에는 한 번에 하나의 프로세스만 있어야함<h4 id="✔️-한정-대기bounded-waiting">✔️ 한정 대기(bounded waiting)</h4>
</li>
<li>어떤 프로세스도 임계구역에 진입하지 못하여 무한 대기 하지 않아야 함<h4 id="✔️-진행의-융통성progress-flexibility">✔️ 진행의 융통성(progress flexibility)</h4>
</li>
<li>임계구역에 어떤 프로세스도 진입하지 않았다면, 진입하고자 하는 프로세스는 들어갈 수 있어야 함</li>
</ul>
<h2 id="3-동기화-기법">3. 동기화 기법</h2>
<h3 id="31-뮤텍스-락자물쇠-역할">3.1 뮤텍스 락(자물쇠 역할!!)</h3>
<ul>
<li>상호 배제를 위한 동기화 도구<pre><code>acquire();        // 자물쇠가 잠겨 있는지 확인, 잠겨 있지 않다면 잠그고 들어가기
// 임계구역          // 임계구역에서의 작업 진행
release();        // 자물쇠 반환</code></pre></li>
<li>acquire()에서는 임계구역이 잠겨있는지를 반복적으로 확인함 </li>
<li><blockquote>
<p><strong>바쁜 대기(busy waiting)</strong> 발생(CPU 사이클 낭비)</p>
</blockquote>
<h3 id="32-세마포어">3.2 세마포어</h3>
</li>
</ul>
<h4 id="321-카운팅-세마포어">3.2.1 카운팅 세마포어</h4>
<ul>
<li><p>공유 자원이 여러 개 있는 경우에도 적용 가능한 방법</p>
<img src="https://velog.velcdn.com/images/woohaha_log/post/8512ddee-dece-4739-94e4-b7bb95996d15/image.png" alt="세마포어 코드" width="600" style="height:auto;">
</li>
<li><p><strong>Semaphore(n)</strong></p>
<ul>
<li>전역 변수 RS를 n으로 초기화. RS에는 현재 사용 가능한 자원의 수가 저장됨</li>
</ul>
</li>
<li><p><strong>P(wait)</strong></p>
<ul>
<li>잠금을 수행하는 코드</li>
<li>RS가 0보다 크면(사용 가능한 자원 있다는 뜻) 1만큼 감소시키고 임계구역에 진입함</li>
<li>0보다 작으면(사용 가능한 자원 없다는 뜻) 0보다 커질 때까지 기다림(PCB 대기큐 삽입)</li>
<li>block()은 wake_up() 신호를 보낼 때까지 기다리는 함수</li>
</ul>
</li>
<li><p><strong>V(signal)</strong></p>
<ul>
<li>잠금 해제와 동기화를 같이 수행하는 코드</li>
<li>RS 값을 1 증가 시키고 세마포어에서 기다리는 프로세스에 임계구역에 진입해도 좋다는 wake_up() 신호 보냄</li>
</ul>
</li>
</ul>
<h4 id="💡-세마포어의-바쁜-대기-해결-방법">💡 세마포어의 바쁜 대기 해결 방법</h4>
<ul>
<li>사용할 수 있는 자원이 없을 경우 <strong>대기 상태</strong>로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)</li>
<li>사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 <strong>준비 상태</strong>로 만듦
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)</li>
</ul>
<h3 id="33-모니터">3.3 모니터</h3>
<ul>
<li>공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화하는 방법</li>
</ul>
<p>1️⃣ 임계구역에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청을 함
2️⃣ 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌</p>
<blockquote>
<p>참조
<a href="https://product.kyobobook.co.kr/detail/S000200716007">📚 쉽게 배우는 운영체제</a>
<a href="https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard">🧑🏻‍🏫 개발자를 위한 컴퓨터공학1: 혼자 공부하는 컴퓨터구조 + 운영체제</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[5 - CPU 스케줄링]]></title>
            <link>https://velog.io/@woohaha_log/4-CPU-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</link>
            <guid>https://velog.io/@woohaha_log/4-CPU-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</guid>
            <pubDate>Thu, 14 Nov 2024 09:26:00 GMT</pubDate>
            <description><![CDATA[<img src="https://velog.velcdn.com/images/woohaha_log/post/637e73d9-d2b5-4062-9594-21b38a10166c/image.webp" width="1%" height="n%">


<h3 id="✔️-cpu-스케줄링이란">✔️ CPU 스케줄링이란?</h3>
<h4 id="여러-프로세스의-상황을-고려하여-cpu와-시스템-자원을-어떻게-배정할지-결정하는-일">여러 프로세스의 상황을 고려하여 CPU와 시스템 자원을 어떻게 배정할지 결정하는 일</h4>
<h2 id="1-스케줄링의-종류">1. 스케줄링의 종류</h2>
<h4 id="1️⃣-고수준-스케줄링장기-스케줄링-작업-스케줄링">1️⃣ 고수준 스케줄링(장기 스케줄링, 작업 스케줄링)</h4>
<ul>
<li><p>시스템 내의 전체 작업 수를 조절하는 것</p>
<ul>
<li>여기서 <code>작업</code>은 운영체제에서 다루는 일의 가장 큰 단위를 뜻함. 1개 또는 여러개의 프로세스로 이루어짐</li>
</ul>
</li>
<li><p>작업 요청이 들어오면 스케줄러가 시스템의 상황을 고려하여 작업을 승인할지, 거부할지를 결정함(그래서 승인 스케줄링이라고도 함)</p>
</li>
<li><p>스케줄러의 이러한 결정에 따라 시스템 내에서 동시에 실행가능한 프로세스의 수가 결정되는데 이를 <strong>degree of multiprogramming</strong>이라고 함</p>
</li>
</ul>
<h4 id="2️⃣-저수준-스케줄링단기-스케줄링">2️⃣ 저수준 스케줄링(단기 스케줄링)</h4>
<ul>
<li>어떤 프로세스에 CPU를 할당할지, 어떤 프로세스를 대기 상태로 보낼지 등을 결정</li>
</ul>
<h4 id="3️⃣-중간-수준-스케줄링">3️⃣ 중간 수준 스케줄링</h4>
<ul>
<li>고수준 스케줄링과 저수준 스케줄링 사이에 일어나는 스케줄링</li>
<li>시스템의 과부하를 조절하기 위해 활성화된 프로세스 중 일부를 보류 상태로 보냄</li>
<li>보류된 프로세스는 처리 능력에 여유가 생기면 다시 활성화 됨</li>
</ul>
<h2 id="2-선점형-스케줄링과-비선점형-스케줄링">2. 선점형 스케줄링과 비선점형 스케줄링</h2>
<blockquote>
<p><strong>선점</strong>: 빼앗을 수 있음
<strong>비선점</strong>: 빼앗을 수 없음</p>
</blockquote>
<h4 id="✔️-선점형-스케줄링">✔️ 선점형 스케줄링</h4>
<ul>
<li>어떤 프로세스가 CPU를 할당받아 실행 중이더라도 운영체제가 CPU를 <strong>강제로 빼앗을 수 있는</strong> 스케줄링 방식 ex) 인터럽트</li>
<li>시분할 시스템을 고려하여 만들어진 알고리즘</li>
<li>문맥 교환과 같은 작업으로 인해 오버헤드 발생</li>
</ul>
<h4 id="✔️-비선점형-스케줄링">✔️ 비선점형 스케줄링</h4>
<ul>
<li>어떤 프로세스가 실행 상태에 들어가 CPU를 사용하면 그 프로세스가 종료되거나 자발적으로 대기 상태에 들어가기 전까지는 <strong>계속 실행되는</strong> 스케줄링 방식</li>
<li>기다리는 프로세스가 많아 처리율이 떨어지기 때문에 지금은 거의 사용되지 않음</li>
</ul>
<h2 id="3-스케줄링-알고리즘">3. 스케줄링 알고리즘</h2>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">종류</th>
</tr>
</thead>
<tbody><tr>
<td align="left">비선점형</td>
<td align="left">FCFS 스케줄링, SJF 스케줄링</td>
</tr>
<tr>
<td align="left">선점형</td>
<td align="left">라운드 로빈 스케줄링, SRT 스케줄링, 다단계 큐 스케줄링, 다단계 피드백 큐 스케줄링</td>
</tr>
<tr>
<td align="left">둘 다 가능</td>
<td align="left">우선순위 스케줄링</td>
</tr>
</tbody></table>
<h3 id="31-fcfs-스케줄링first-come-first-served">3.1 FCFS 스케줄링(First Come First Served)</h3>
<ul>
<li>선입선출 스케줄링</li>
<li>준비 큐에 <code>도착한 순서대로</code> CPU를 할당하는 비선점형 방식</li>
<li>초기의 일괄 작업 시스템에서 사용됨</li>
<li>한 번 실행되면 그 프로세스가 끝나야만 다음 프로세스 실행 가능</li>
<li>큐가 하나라서 <strong>모든 프로세스의 우선순위가 동일</strong>함</li>
<li>단점: 현재 작업 중인 프로세스가 입출력 작업을 요청하는 경우 CPU가 작업하지 않고 쉬는 시간이 많아져서 작업 효율이 떨어짐</li>
</ul>
<h3 id="32-sjfshortest-job-first최단-작업-우선-스케줄링">3.2 SJF(Shortest Job First)(최단 작업 우선 스케줄링)</h3>
<ul>
<li><p>준비 큐에 있는 프로세스 중에서 <code>실행 시간이 가장 짧은</code> 작업부터 CPU를 할당하는 비선점형 방식</p>
</li>
<li><p>SPF(Shortest Process First) 또는 최단 프로세스 우선 스케줄링이라고도 함</p>
<h4 id="단점">단점</h4>
</li>
<li><p>운영체제가 프로세스의 종료 시간을 정확하게 예측하기 어려움</p>
<ul>
<li>현대의 프로세스는 사용자와 빈번하게 상호작용하기 때문에 프로그램 종료 시간을 파악하기 어려움</li>
</ul>
</li>
<li><p><code>공평성</code>에 위배된다!</p>
<ul>
<li>작업 시간이 짧은 프로세스가 계속해서 준비 큐에 들어오면 작업시간이 긴 프로세스는 계속해서 연기되는데 이를 <code>기아(아사)</code> 또는 <code>무한 봉쇄 현상</code>이라고 함</li>
<li>이러한 기아 상태는 <code>에이징</code>으로 완화 가능<h4 id="기아-상태란">기아 상태란?</h4>
특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태<h4 id="에이징">에이징</h4>
</li>
</ul>
</li>
<li><p>프로세스가 양보할 수 있는 상한선을 정하는 방식</p>
</li>
<li><p>프로세스가 자신의 순서를 양보할 때마다 나이를 한 살씩 먹어 최대 몇 살까지만 양보하도록 규정하는 방식</p>
</li>
<li><p>에이징 값을 어떤 기준으로 정할 것인지 문제가 있어 한계가 있음</p>
</li>
</ul>
<h3 id="33-라운드-로빈-스케줄링rr-round-robin">3.3 라운드 로빈 스케줄링(RR Round Robin)</h3>
<ul>
<li>한 프로세스가 할당 받은 시간(타임 슬라이스)동안 작업을 하다가 완료하지 못하면 준비 큐의 맨 뒤로 가서 자기 차례를 기다리는 방식</li>
<li>프로세스들이 작업을 완료할 때까지 계속 순환하면서 실행됨</li>
<li>선입선출 알고리즘과 유사하지만, 각 프로세스마다 CPU를 사용할 수 있는 최대 시간(타임 슬라이스)가 있음</li>
<li>문맥 교환 시간이 추가됨</li>
</ul>
<h3 id="34-srt-우선-스케줄링shortest-remaining-time최소-잔류-시간-우선-스케줄링">3.4 SRT 우선 스케줄링(Shortest Remaining Time)(최소 잔류 시간 우선 스케줄링)</h3>
<ul>
<li>SJF 스케줄링과 라운드 로빈 스케줄링을 혼합한 방식(SJF의 선점형 버전)</li>
<li>라운드 로빈은 준비 큐에 있는 순서대로 CPU를 할당한다면 SRT 우선 스케줄링은 남은 작업 시간이 적은 프로세스에 CPU를 먼저 할당함</li>
</ul>
<h4 id="단점-1">단점</h4>
<ul>
<li>현재 실행 중인 프로세스와 큐에 있는 프로세스의 남은 시간을 주기적으로 계산하고, 남은 시간이 더 적은 프로세스와 문맥 교환을 해야 하므로 작업이 추가됨</li>
<li>SJF 스케줄링과 마찬가지로 운영체제가 프로세스 종료 시간을 예측하기 어렵고 아사 현상이 발생함</li>
</ul>
<h3 id="35-우선순위-스케줄링">3.5 우선순위 스케줄링</h3>
<ul>
<li><p>프로세스의 우선순위에 따라 스케줄링하는 방식. 어떤 기준으로 우선순위를 정하느냐에 따라 다양하게 구현 가능함</p>
</li>
<li><p>시스템의 효율성이 아니라 프로세스의 중요도를 기준으로 결정됨(커널 &gt; 일반 프로세스)</p>
</li>
<li><p>우선순위 스케줄링은 비선점형과 선점형 방식에 모두 적용 가능함!</p>
<ul>
<li>SJF 스케줄링(비선점형): 작업 시간이 짧은 프로세스에 높은 우선순위 부여</li>
<li>SRT 스케줄링(선점형): 남은 시간이 짧은 프로세스에 높은 우선 순위 부여</li>
</ul>
</li>
<li><p><strong>고정 우선순위 알고리즘</strong></p>
<ul>
<li>한 번 우선순위를 부여받으면 종료될 때까지 우선순위가 고정됨</li>
<li>단순하게 구현 가능하지만 시시각각 변하는 시스템 상황을 반영하지 못해 효율성 떨어짐</li>
</ul>
</li>
<li><p><strong>변동 우선순위 알고리즘</strong></p>
<ul>
<li>일정시간마다 변하는 우선순위를 새로 계산함</li>
<li>시스템이 복잡하지만 상황을 시시각각 반영하여 효율적으로 운영가능함</li>
</ul>
</li>
</ul>
<h3 id="36-다단계-큐-스케줄링mlq-multi-level-queue">3.6 다단계 큐 스케줄링(MLQ Multi-Level Queue)</h3>
<ul>
<li>우선순위에 따라 준비 큐를 여러 개 사용하는 방식</li>
<li>프로세스는 운영체제에게 부여받은 우선순위(고정형 우선순위)에 따라 해당 우선순위의 큐에 삽입됨</li>
<li>상단 큐에 있는 모든 프로세스의 작업이 끝나야 다음 우선순위 큐의 작업이 시작됨</li>
<li>각 단계의 큐에 라운드 로빈 방식을 사용함</li>
</ul>
<h3 id="37-다단계-피드백-큐-스케줄링mlfq-multi-level-feedback-queue">3.7 다단계 피드백 큐 스케줄링(MLFQ Multi-Level Feedback Queue)</h3>
<ul>
<li>오늘날 운영체제가 CPU 스케줄링을 할 때 일반적으로 사용하는 방식</li>
<li>MLQ 방식에서 우선순위가 낮은 프로세스의 작업이 연기되는 문제점을 보완한 방식</li>
<li>프로세스가 CPU를 사용한 후 우선순위가 낮아져서 원래 큐로 되돌아가지 않고 <strong>하나 낮은 큐의 끝</strong>으로 들어감(그렇다고 커널 프로세스가 일반 프로세스의 큐에 삽입되지는 않음)</li>
<li>우선순위에 따라 타임 슬라이스의 크기가 다름(우선순위가 낮을수록 타임슬라이스 커짐)</li>
<li>따라서 마지막 큐(우선순위가 가장 낮은) 프로세스는 무한대의 타임 슬라이스를 얻게됨(프로세스가 실행 상태에 들어가면 CPU를 빼앗기지 않고 끝까지 작업을 마친다는 뜻) -&gt; FCFS 스케줄링 방식으로 동작함</li>
</ul>
<blockquote>
<p>참조
<a href="https://product.kyobobook.co.kr/detail/S000200716007">📚 쉽게 배우는 운영체제</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[4 - 쓰레드]]></title>
            <link>https://velog.io/@woohaha_log/4-%EC%93%B0%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@woohaha_log/4-%EC%93%B0%EB%A0%88%EB%93%9C</guid>
            <pubDate>Thu, 07 Nov 2024 07:18:54 GMT</pubDate>
            <description><![CDATA[<p>운영체제가 작업을 처리하는 단위는 <strong>프로세스</strong>임</p>
<p>사용자가 운영체제에게 작업을 요구하면 그만큼 프로세스의 수가 늘어남!</p>
<p>프로세스를 생성하면 PCB가 생성되고 메모리의 코드, 데이터, 스택, 힙 영역을 만들어줘야 하는데, 프로세스의 수가 많아지면 프로세스의 수만큼 이것들을 만들어줘야 하기 때문에 너무 무거워짐</p>
<p>예를 들어, 웹 브라우저의 탭을 20개 열면 프로세스의 복사가 20번이나 일어나게 되는 것임...</p>
<p>결국 웹브라우저가 메모리를 너무 많이 차지하게 됨..!</p>
<p>그래서 개발자들이 고안해낸 것이 쓰레드 
<img src="https://velog.velcdn.com/images/woohaha_log/post/7053af21-00a9-49ef-96f1-8508869c3279/image.png" width="60%" height="n%"></p>
<h3 id="1-쓰레드란">1. 쓰레드란?</h3>
<ul>
<li>lightwight process</li>
<li>프로세스 내에서 독립적으로 실행되는 CPU 수행 단위</li>
<li>한 개의 프로세스 내에 1개의 쓰레드가 있을 수 있고 10개의 쓰레드가 있을 수 있음</li>
</ul>
<h3 id="2-쓰레드의-메모리-공간">2. 쓰레드의 메모리 공간</h3>
<ul>
<li><p>프로세스 내에서 메모리를 공유하지만 자신만의 독립된 메모리 공간을 가짐</p>
</li>
<li><p>공유하는 메모리</p>
<ul>
<li>PCB, 코드, 데이터, 힙 영역</li>
</ul>
</li>
<li><p>독립적인 메모리</p>
<ul>
<li>각 쓰레드가 개별적으로 가지는 스택 메모리(함수 호출시 사용되는 지역 변수와 반환 주소 등이 저장)</li>
</ul>
</li>
</ul>
<h3 id="3-쓰레드-제어-블록tcb">3. 쓰레드 제어 블록(TCB)</h3>
<ul>
<li>프로세스 내의 여러 쓰레드를 구분하기 위해 쓰레드 아이디를 부여하고 관리하기 위한 장치</li>
</ul>
<h3 id="4-쓰레드의-장점">4. 쓰레드의 장점</h3>
<p> ✔️ <strong>응답성</strong>
 다중 쓰레드로 구성된 테스크 구조에서는 하나의 서버 스레드가 waiting 상태인 동안에도 동일한 테스크 내의 다른 쓰레드가 실행되어 <code>빠른 처리</code>를 할 수 있다. (웹 브라우저에서 이미지를 읽어오는 쓰레드와 텍스트를 읽어오는 쓰레드가 동시에 실행되어 빠르게 읽어올 수 있음)</p>
<p> ✔️ <strong>자원 공유</strong> 
 프로세스 내의 코드, 데이터 등을 공유하기 때문에 효율성이 높음</p>
<p> ✔️ <strong>경제성</strong>
 프로세스와 비교했을 때,
 쓰레드 생성, CPU switching의 오버헤드가 각각 30배, 5배 차이가 남(Solaris)</p>
<h3 id="5-쓰레드의-단점">5. 쓰레드의 단점</h3>
<p> ✔️ <strong>안전성</strong>
쓰레드들은 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스의 자원을 공유하기 때문에 멀티쓰레드 환경에서는 한 쓰레드에 생긴 문제가 프로세스 전체의 문제가 될 수 있다는 단점이 있음</p>
<blockquote>
<p>참조
<a href="http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077">👨🏻‍🏫 이화여자대학교 운영체제 강의</a>
<a href="https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C">👨🏻‍🏫 그림으로 쉽게 배우는 운영체제 - 인프런</a>
<a href="https://product.kyobobook.co.kr/detail/S000214014967">📚 이것이 취업을 위한 컴퓨터 과학이다 with CS 기술  면접</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[3 - 프로세스 관리와 생성]]></title>
            <link>https://velog.io/@woohaha_log/3-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC%EC%99%80-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@woohaha_log/3-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC%EC%99%80-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Wed, 06 Nov 2024 08:27:05 GMT</pubDate>
            <description><![CDATA[<h2 id="1-프로세스의-개념">1. 프로세스의 개념</h2>
<h3 id="-프로세스란">** 프로세스란?**</h3>
<ul>
<li>실행중인 프로그램을 뜻한다.</li>
</ul>
<h3 id="프로세스의-문맥context"><strong>프로세스의 문맥(context)</strong></h3>
<ul>
<li>프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규정하기 위해 필요한 정보를 의미<h4 id="프로세스-문맥의-세-가지-분류">프로세스 문맥의 세 가지 분류</h4>
1️⃣ 하드웨어 문맥<ul>
<li>CPU의 수행 상태를 나타냄</li>
<li>프로그램의 카운터 값과 각종 레지스터에 저장하고 있는 값들을 의미
2️⃣ 프로세스의 주소 공간</li>
<li>프로세스는 코드, 데이터, 스택으로 구성된 자신만의 독자적인 주소 공간을 가짐
3️⃣ 커널상의 문맥</li>
<li>프로세스를 관리하기 위한 자료구조(PCB와 커널 스택)</li>
</ul>
</li>
</ul>
<h2 id="2-프로세스의-상태">2. 프로세스의 상태</h2>
<h4 id="프로세스는-상태가-변경되며-수행된다">프로세스는 상태가 변경되며 수행된다!</h4>
<h3 id="✔️-활성-상태active">✔️ 활성 상태(active)</h3>
<ul>
<li><p><strong>생성(create)</strong></p>
<ul>
<li>프로세스가 메모리에 올라와 실행 준비를 완료한 상태. 프로세스를 관리하는 데 필요한 PCB가 생성된다</li>
</ul>
</li>
<li><p><strong>준비(ready)</strong></p>
<ul>
<li>생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태</li>
</ul>
</li>
<li><p><strong>실행(running, execute)</strong></p>
<ul>
<li>준비 상태에 있는 프로세스중 하나가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태</li>
</ul>
</li>
<li><p><strong>대기(blocking)</strong></p>
<ul>
<li>실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태</li>
</ul>
</li>
<li><p><strong>완료(terminated)</strong></p>
<ul>
<li>실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태로 진입함. </li>
<li>PCB가 사라진 상태</li>
</ul>
<hr>
<h3 id="✔️-비활성-상태-inactive">✔️ 비활성 상태 (inactive)</h3>
</li>
<li><p><strong>휴식(pause)</strong></p>
<ul>
<li>프로세스가 작업을 일시적으로 쉬고 있는 상태</li>
</ul>
</li>
<li><p><strong>보류(suspended)</strong></p>
<ul>
<li>중기 스케줄러의 등장으로 추가된 상태</li>
<li>프로세스가 외부적인 이유로 인해 <strong>메모리에서 쫓겨난 상태</strong></li>
<li>메모리에 너무 많은 프로세스가 올라와 있을 때</li>
<li>프로그램에 오류가 있어서 실행을 미루어야할 때</li>
<li>입출력을 기다리는 프로세스의 입출력이 계속 지연될 때</li>
<li>통째로 디스크에 swap out 된다</li>
</ul>
</li>
</ul>
<h3 id="문맥교환이란">문맥교환이란?</h3>
<p>실행시킬 프로세스를 변경하기 위해 원래 수행 중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정을 문맥교환이라고 한다.</p>
<ul>
<li>CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장</li>
<li>CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴</li>
</ul>
<h2 id="3-프로세스-제어블록pcb">3. 프로세스 제어블록(PCB)</h2>
<h3 id="pcbprocess-controll-block란">PCB(Process Controll Block)란?</h3>
<p>운영체제가 시스템내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조</p>
<ul>
<li><p>프로세스의 구성 요소</p>
<ul>
<li>프로세스의 상태<ul>
<li>프로그램 카운터의 값</li>
<li>CPU 레지스터의 값</li>
<li>CPU 스케줄링 정보</li>
<li>메모리 관리 정보</li>
<li>자원 사용 정보</li>
<li>입출력 상태 정보</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="4-스케줄러">4. 스케줄러</h2>
<h4 id="운영체제-안에-있는-코드의-일부">운영체제 안에 있는 코드의 일부!</h4>
<h4 id="✔️-장기-스케줄러job-scheduler">✔️ 장기 스케줄러(Job scheduler)</h4>
<ul>
<li><code>시분할 시스템에는 장기스케줄러가 없음! (무조건 ready)</code></li>
<li>시작 프로세스 중 어떤 것들을 <strong>ready queue</strong>로 보낼지 결정</li>
<li>프로세스에 <strong>메모리</strong>를 주는 문제</li>
<li><strong>degree of Multiprogramming</strong>: 메모리에 프로세스 여러개가 올라가는 것<h4 id="✔️-단기-스케줄러cpu-scheduler">✔️ 단기 스케줄러(CPU scheduler)</h4>
</li>
<li>자주 호출됨(타이머 인터럽트가 걸릴 때 마다 호출)</li>
<li>어떤 프로세스를 다음번에 <strong>running</strong> 시킬지 결정</li>
<li>프로세스에 <strong>CPU</strong>를 주는 문제<h4 id="✔️-중기-스케줄러swapper">✔️ 중기 스케줄러(Swapper)</h4>
</li>
<li>시분할 시스템이 장기스케줄러를 두지 않는 대신에 두는 스케줄러</li>
<li>메모리가 부족할 때 특정 프로세스를 쫓아내는 역할</li>
<li>프로세스에서 <strong>메모리</strong>를 뺏는 역할</li>
<li><strong>degree of Multiprogramming</strong>을 제어</li>
</ul>
<h2 id="5-프로세스의-생성">5. 프로세스의 생성</h2>
<blockquote>
<p><strong>&quot;시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 된다&quot;</strong>
(운영체제와 정보기술의 원리, 반효경, 2023, p. 131)</p>
</blockquote>
<ul>
<li>프로세스를 생성한 프로세스: <strong>부모</strong> 프로세스</li>
<li>새롭게 생성된 프로세스: <strong>자식</strong> 프로세스</li>
<li>프로세스는 족보와 같은 계층을 형성하게 된다.</li>
<li>자식이 먼저 죽고, 이에 대한 처리는 자식을 생성했던 부모 프로세스가 담당</li>
</ul>
<p>✔️ <strong>자원을 획득하는 방법</strong></p>
<ul>
<li>운영체제로 부터 직접 할당</li>
<li>부모 프로세스와 자원을 공유해서 사용</li>
</ul>
<p>✔️ <strong>프로세스가 수행되는 모델</strong></p>
<ul>
<li><p>부모와 자식이 공존하며 수행되는 모델</p>
<ul>
<li>자식과 부모가 같이 CPU를 획득하기 위해 경쟁하는 관계가 됨</li>
</ul>
</li>
<li><p>부모가 자식의 종료를 기다리는 모델(wait)</p>
<ul>
<li>자식 프로세스가 종료될 때까지 부모 프로세스는 아무 일도 하지 않고 봉쇄 상태에 머물러 있음</li>
<li>자식 프로세스가 종료되면 그때 부모 프로세스가 준비 상태가 되어 다시 CPU를 얻을 권한이 생김</li>
</ul>
</li>
</ul>
<p>✔️ <strong>주소 공간</strong></p>
<ul>
<li>자식은 부모의 주소 공간을 그대로 복사해서 생성함</li>
<li>자식이 새로운 프로그램을 수행하기 위해서는 그 위에 새로운 주소공간의 주소 공간을 덮어씌움</li>
</ul>
<h2 id="51-프로세스-생성유닉스">5.1 프로세스 생성(유닉스)</h2>
<h4 id="✔️-fork-시스템-콜">✔️ fork() 시스템 콜</h4>
<ul>
<li>유닉스에서는 fork() 시스템 콜을 통해 새로운 자식 프로세스를 생성함</li>
<li><strong>프로세스 ID</strong>를 제외한 모든 정보를 그대로 복사</li>
<li><strong>주소 공간은 따로 갖게 되지만 주소 공간 내에는 동일한 내용을 가짐</strong></li>
<li>함수의 결괏값으로 부모에게는 양수를 주고 자식에게는 0을 줌</li>
</ul>
<h4 id="✔️-exec-시스템-콜">✔️ exec() 시스템 콜</h4>
<ul>
<li>exec() 시스템 콜을 통해 새로운 프로그램으로 주소 공간을 덮어씌울 수 있음</li>
<li>프로세스가 지금까지 수행했던 상태를 잊어버리고 그 주소 공간을 완전히 새로운 프로그램으로 덮어씌운 후 새로운 프로그램의 첫 부분부터 다시 실행을 시작하도록 함</li>
</ul>
<h4 id="✔️-wait-시스템-콜">✔️ wait() 시스템 콜</h4>
<ul>
<li>자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 함</li>
<li>자식 프로세스가 종료되면 부모를 준비 상태로 변경시켜 작업을 재개</li>
</ul>
<h2 id="52-프로세스-종료">5.2 프로세스 종료</h2>
<p><strong>1️⃣  자발적 종료</strong></p>
<ul>
<li>프로세스가 마지막 명령을 수행한 후 운영체제에 이를 알려줌</li>
<li>프로그램이 마쳐지는 코드 부분에 <strong>exit() 시스템 콜</strong> 넣어줌</li>
</ul>
<p><strong>2️⃣ 비자발적 종료</strong>(강제 종료)</p>
<ul>
<li><p>부모 프로세스가 자식 프로세스의 수행을 강제로 종료시킴(<strong>abort()</strong>)</p>
</li>
<li><p>자식이 할당 자원의 한계치를 넘어서는 많은 양의 자원을 요구할 때</p>
</li>
<li><p>자식에게 할당된 작업이 더 이상 필요하지 않을 때</p>
</li>
<li><p>부모 프로세스가 종료(exit)되는 경우 -&gt; 단계적인 종료 발생</p>
</li>
</ul>
<h2 id="6-프로세스-간의-협력">6. 프로세스 간의 협력</h2>
<h4 id="✔️-독립적인-프로세스">✔️ 독립적인 프로세스</h4>
<ul>
<li>프로세스는 각자의 독립적인 주소 공간을 가지고 수행되므로 원칙적으로 프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않음</li>
</ul>
<h4 id="✔️-협력-프로세스ipc-inter-process-communication">✔️ 협력 프로세스(IPC: Inter-Process Communication)</h4>
<ul>
<li>독립적인 프로세스들이 협력할 때 업무의 효율성이 증진될 수 있음</li>
<li>프로세스간 협력 매커니즘
1️⃣  <strong>메세지 전달</strong>
   커널을 통해 메시지를 전달함
2️⃣ <strong>공유메모리</strong>
   프로세스들이 주소 공간의 일부를 공유함 -&gt; 서로의 데이터에 일관성 문제가 유발될 수 있음</li>
</ul>
<blockquote>
<p>참조
<a href="http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077">👨🏻‍🏫 이화여자대학교 운영체제 강의</a>
<a href="https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=K762639583&amp;start=pnaver_02">📚 운영체제와 정보기술의 원리</a>
<a href="https://product.kyobobook.co.kr/detail/S000200716007">📚 쉽게 배우는 운영체제</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[2 - 컴퓨터 시스템의 동작 원리]]></title>
            <link>https://velog.io/@woohaha_log/2-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@woohaha_log/2-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Tue, 05 Nov 2024 10:29:32 GMT</pubDate>
            <description><![CDATA[<img src="https://velog.velcdn.com/images/woohaha_log/post/55b69bb0-4a54-4441-ac89-9fd562112849/image.png" width="70%" height="n%">

<p><strong>device controller</strong>: 각각의 장치마다 붙어있는 작은 CPU
<strong>local buffer</strong>: 각각의 장치마다 붙어있는 작은 메모리(데이터를 임시로 저장)</p>
<h3 id="1-mode-bit">1. Mode bit</h3>
<ul>
<li>CPU에서 기계어를 실행할 때 운영체제가 실행하는 것인지, 사용자가 실행하는 것인지 구분하기 위해서 사용하는 것</li>
<li><strong>시스템 모드</strong>(커널 모드)<ul>
<li>mode bit <code>0</code>: 운영체제가 CPU를 사용하는 상태. 보안을 해칠 수 있는 중요한 명령어도 수행 가능(모든 작업이 수행 가능하다는 뜻)</li>
<li>보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행가능한 <code>특권 명령</code>으로 규정</li>
<li>Interrupt나 Exeption(권한이 없는 명령어 실행시) 발생시 하드웨어가 mode bit을 0으로 바꿈</li>
</ul>
</li>
<li><strong>사용자 모드</strong><ul>
<li>mode bit <code>1</code>: 운영체제가 사용자 프로그램에게 CPU를 넘겨준 상태. 사용자 프로그램은 완벽히 믿을 수가 없어서(무한루프, 메모리를 무한정 잡아먹는 것 등등..) 위험한 기계어는 사용하지 못하고 안전한 기계어만 실행 가능</li>
<li>사용자 프로그램에 CPU를 넘기기 전에 mode bit을 1로 세팅</li>
</ul>
</li>
</ul>
<h3 id="2-interrupt-line">2. Interrupt line</h3>
<ul>
<li><p>CPU에 인터럽트 라인이 붙어있음. CPU는 기계어를 실행하기 전에 이곳에 인터럽트가 발생 되었는지 확인</p>
</li>
<li><p><code>Interrupt</code></p>
<ul>
<li>느린 장치들에게 일을 시키고 CPU는 다른 일을 하다가 느린 장치들이 일을 완료하면 CPU에게 인터럽트를 건다</li>
<li>그러면 자동으로 CPU는 운영체제에 넘어가서 mode bit이 0으로 바뀜</li>
<li>운영체제가 CPU를 받아서 인터럽트 이후의 일을 수행할 수 있게 해줌<h3 id="3-register">3. Register</h3>
</li>
</ul>
</li>
<li><p>다양한 연산을 저장하기 위해서 빠르고 작은 크기의 레지스터들이 CPU안에 들어있음</p>
</li>
<li><p><strong>Program counter</strong> register(<strong>PC</strong>)는 다음번에 실행할 기계어의 <strong>메모리 주소</strong>를 갖고 있다</p>
</li>
</ul>
<h3 id="4-timer">4. Timer</h3>
<ul>
<li>사용자 프로그램이 무리하게 CPU를 사용하고 있을 때 운영체제가 뺏어오도록 도와주는 하드웨어<ul>
<li>CPU의 독점을 막기 위해서 존재</li>
</ul>
</li>
<li>짧은 시간 간격으로 CPU를 나눠 쓸 수 있게 함</li>
<li>타이머가 인터럽트를 발생시키는 과정<ul>
<li>운체가 사용자 프로그램에게 CPU를 넘길 때 타이머에 시간을 세팅해서 넘겨줌</li>
<li>타이머는 일정시간으로 인터럽트를 발생시킴</li>
<li>사용자 프로그램이 무한루프를 도는 등 CPU를 독점하더라도 타이머가 인터럽트를 발생시켜서 운영체제로 CPU가 넘어가게 됨</li>
</ul>
</li>
</ul>
<h3 id="5-시스템-콜">5. 시스템 콜</h3>
<ul>
<li>사용자 프로그램이 운영체제의 서비스(특권명령)를 받기 위해 커널 함수를 호출하는 것</li>
<li>사용자 process는 User Mode에서 실행되다가 시스템 자원을 사용해야할 때 시스템 콜을 호출해서 커널 모드로 전환되어 작업을 수행하고 완료 시 다시 사용자 모드로 전환한다</li>
<li>사용자 프로그램이 스스로가 할 수 없는 일을 운체에게 부탁하기 위해 자신의 코드를 통해 인터럽트를 거는 것(소프트웨어 인터럽트, Trap)</li>
</ul>
<h3 id="6-인터럽트cpu가-운영체제한테-넘어오는-경우">6. 인터럽트(CPU가 운영체제한테 넘어오는 경우)</h3>
<ul>
<li>인터럽트 당한 시점의 레지스터와 pc를 저장한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다</li>
<li>Interrupt(하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트</li>
<li><code>Trap</code>(소프트웨어 인터럽트)<ul>
<li>시스템콜: 프로그램이 커널 함수를 호출하는 경우</li>
<li>Exception: 프로그램이 오류를 범한 경우</li>
</ul>
</li>
<li><strong>인터럽트 벡터</strong><ul>
<li>인터럽트 종류별로 해당하는 인터럽트가 발생했을 때, 실행해야하는 코드의 위치를 저장</li>
<li>해당 인터럽트의 처리 루틴 주소를 가지고 있음. 일종의 주소에 대한 포인터</li>
</ul>
</li>
<li>인터럽트 처리 루틴(인터럽트 핸들러)<ul>
<li>운영체제 커널에 있는 함수</li>
<li>해당 인터럽트에서 무슨 일을 해야하는 지 적혀있음</li>
</ul>
</li>
</ul>
<h3 id="7-device-controller">7. Device Controller</h3>
<ul>
<li>I/O device controller<ul>
<li>해당 I/O device controller를 관리하는 일종의 작은 CPU</li>
<li>제어 정보를 위해 controll register, status register를 가짐</li>
<li>I/O는 실제 device와 local buffer 사이에서 일어남</li>
<li>I/O가 끝났을 경우 인터럽트로 CPU에 그 사실을 알림</li>
</ul>
</li>
<li>device driver(장치 구동기)<ul>
<li>운영체제 안에 있는 코드 중 각 장치별 처리 루틴, CPU가 수행하는 코드 → <strong>소프트웨어</strong></li>
</ul>
</li>
<li>device controller(장치제어기)<ul>
<li>각 장치를 통제하는 일종의 작은 CPU, 여기서 수행되는 코드는 펌웨어 → 하드웨어</li>
</ul>
</li>
</ul>
<h3 id="8-동기식-입출력과-비동기식-입출력">8. 동기식 입출력과 비동기식 입출력</h3>
<p>*<em>두 경우 모두 I/O의 완료는 인터럽트로 알려줌
*</em></p>
<ul>
<li>동기식 입출력(synchronous)<ul>
<li>I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감</li>
</ul>
</li>
<li>비동기식 입출력(asynchronous)<ul>
<li>I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감</li>
</ul>
</li>
</ul>
<h3 id="9-dmadirect-memory-access">9. DMA(Direct Memory Access)</h3>
<ul>
<li>빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용</li>
<li>CPU의 중재 없이 디바이스 컨트롤러가 buffer storage의 내용을 메모리에 block 단위로 직접 전송</li>
<li>따라서 바이트 단위로 인터럽트를 발생시키는 것이 아니라 block 단위로 발생시킴 → 인터럽트 발생 빈도 낮아지고, CPU 더 효율적으로 사용 가능</li>
</ul>
<h3 id="10-프로그램의-실행메모리-load">10. 프로그램의 실행(메모리 load)</h3>
<ul>
<li>프로그램이 실행되는 단계<ul>
<li>프로그램은 파일 시스템에 실행 파일 형태로 저장되어있음</li>
<li><strong>실행시키면</strong> 프로그램이 메모리에 올라가서 <code>프로세스</code>가 됨</li>
<li>운영체제의 커널은 메모리에 <strong>기본적으로</strong> 올라가 있음</li>
</ul>
</li>
<li><code>Virtual memory</code><ul>
<li>프로그램이 실행될 때 만들어지는 그 프로그램 만의 독자적인  Address space</li>
<li>Physical memory(물리적 주소)와 Virtual memory(논리적 주소)는 다른 주소. 그래서 주소 변환이 필요함</li>
<li>code: cpu를 실행할 기계어 코드</li>
<li>data: 배열, 변수나 자료구조, 전역변수. 프로그램이 시작해서 끝날 때까지 남아있는 변수</li>
<li>stack: 함수 내의 지역변수 위치, 함수 호출 리턴 시 데이터를 쌓는다</li>
</ul>
</li>
</ul>
<h3 id="11-커널-주소-공간의-내용">11. 커널 주소 공간의 내용</h3>
<ul>
<li>운영체제의 모든 하드웨어들을 관리하기 위한 자료구조들을 가지고 있고,</li>
<li>현재 실행중인 모든 프로세스들을 관리하기 위한 자료구조들을 가지고 있음 == PCB</li>
<li>커널의 스택은 각 프로세스마다 별도로 두고 있음</li>
</ul>
<h3 id="12-사용자-프로그램이-사용하는-함수">12. 사용자 프로그램이 사용하는 함수</h3>
<ul>
<li><p>사용자 정의 함수</p>
<ul>
<li>자신이 프로그램에서 정의한 함수</li>
</ul>
</li>
<li><p>라이브러리 함수</p>
<ul>
<li>자신의 프로그램에서 정의하지 않고 갖다 쓴 함수</li>
<li>자신의 프로그램의 실행 파일에 포함되어 있다</li>
</ul>
</li>
<li><p>커널 함수</p>
<ul>
<li>운영체제 프로그램의 함수</li>
<li>커널 함수의 호출 = <code>시스템 콜</code></li>
</ul>
<blockquote>
<p>참조
<a href="http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077">👨🏻‍🏫 이화여자대학교 운영체제 강의</a>
<a href="https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=K762639583&amp;start=pnaver_02">📚 운영체제와 정보기술의 원리</a></p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[1 - 운영체제 개요]]></title>
            <link>https://velog.io/@woohaha_log/1-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@woohaha_log/1-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Tue, 05 Nov 2024 09:25:37 GMT</pubDate>
            <description><![CDATA[<h2 id="1-운영체제란-무엇인가">1. 운영체제란 무엇인가?</h2>
<ul>
<li>컴퓨터 사용자와 하드웨어 사이의 중개자 역할</li>
<li>컴퓨터 하드웨어를 관리하는 소프트웨어</li>
</ul>
<blockquote>
<p>컴퓨터 하드웨어를 효율적으로 관리하여 성능을 높이고, 사용자에게 편의를 제공하는 프로그램(S/W).</p>
</blockquote>
<h2 id="2-운영체제의-목적">2. 운영체제의 목적</h2>
<h4 id="💡-컴퓨터-시스템을-편리하게-사용할-수-있는-환경을-제공">💡 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공</h4>
<ul>
<li>여러 사용자 및 프로그램들에게 각각 독자적으로 컴퓨터를 사용하는 것과 같은 ‘환상’을 제공하는 것</li>
<li>하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행 (ex. 사용자는 파일이 디스크에 어떻게 저장되는 지 모르지만 운영체제가 쉽게 해줌)</li>
</ul>
<h4 id="💡-컴퓨터-시스켐의-자원을-효율적으로-관리">💡 컴퓨터 시스켐의 <strong>자원을 효율적으로 관리</strong></h4>
<ul>
<li>CPU, 메모리, I/O 장치 등을 효율적으로 관리<ul>
<li>주어진 자원으로 최대한의 성능을 내도록 → <strong>효율성</strong></li>
<li>특정 사용자/프로그램의 지나친 불이익이 발생하지 않도록 → <strong>형평성</strong></li>
</ul>
</li>
<li>사용자 및 운영체제 자신의 보호</li>
</ul>
<h2 id="3-운영-체제의-분류">3. 운영 체제의 분류</h2>
<h4 id="💡-동시-작업-가능-여부">💡 동시 작업 가능 여부</h4>
<ul>
<li>단일 작업: 한 번에 하나의 작업만 처리</li>
<li>다중 작업(멀티테스킹): 동시에 두 개 이상의 작업 처리<h4 id="💡-처리-방식">💡 처리 방식</h4>
<ul>
<li><strong>일괄 처리</strong>(batch processing)
– 요청된 작업을 일정량씩 모아서 한꺼번에 처리하는 방식
– 작업이 완전 종료될 때까지 기다려야함(응답 시간이 길다)</li>
</ul>
</li>
<li><strong>시분할</strong>(time sharing)
– 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
– CPU의 작업시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템
– 일괄 처리 방식에 비해 짧은 응답 시간을 가짐 ex) 유닉스</li>
<li><strong>실시간</strong>(Realtime OS)
– 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간 시스템을 위한 OS
– 원자로, 공장 제어 시스템, 미사일 제어 시스템 등에 사용<h2 id="4-기타-용어">4. 기타 용어</h2>
</li>
<li>Multitasking</li>
<li>Multi-programming system(다중 프로그래밍 시스템)
메모리 공간을 분할해 여러 프로그램들을 동시에 메모리에 올려놓고 처리하는 시스템</li>
<li>Time sharing: CPU의 시간을 분할하여 나누어 씀</li>
<li>Multiprocess</li>
<li>Multi-processor: 하나의 컴퓨터에 CPU가 여러 개 붙어 있음을 의미</li>
</ul>
<blockquote>
<p>참조
<a href="http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077">👨🏻‍🏫 이화여자대학교 운영체제 강의</a>
<a href="https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=K762639583&amp;start=pnaver_02">📚 운영체제와 정보기술의 원리</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>