inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 클럽 스터디 3기 - CS 전공지식 <1주차 발자국>

jinwoo2511
0

'그림으로 쉽게 배우는 운영체제'


[섹션 01]

운영체제란??

컴퓨터의 하드웨어적인 요소들과 소프트웨어적인 요소들을 효율적으로 운영하여 관리함으로써 사용자가 시스템을 이용하는데에 편리함을 제공하는 시스템 소프트웨어를 말합니다.


운영체제 종류 및 특징

 

 

 


 

운영체제 특징

 


운영체제 역사

 

 

 

 

운영체제의 구조

 


컴퓨터 하드웨어와 구조

컴퓨터 부팅 과정

 


폴딩

인터럽트


 

[섹션 02]

프로그램이란?

 


프로세스란?

 


컴파일 과정

고급 언어(예: C, C++)로 작성된 소스 코드를 기계어(바이너리 코드)로 변환하는 과정
4단계(전처리 → 컴파일 → 어셈블 → 링크)로 진행

 

1. 전처리 (Preprocessing)

2. 컴파일 (Compilation)

3.어셈블 (Assembling)

주요 작업

4. 링크 (Linking)

멀티 프로그래밍과 멀티 프로세싱


PCB (Process Control Block)

 프로그램 카운터가 필요한 이유는 어떤 프로세스가 실행되다가 다른 프로세스에게 CPU를 뺏기고 다시 실행될 때 원래 실행하던 명령어가 실행되어야 하기 때문에 프로그램 카운터가 꼭 있어야 함

 


프로세스 상태

1. 생성

3.실행

4.대기

5. 완료


컨텍스트 스위칭 (Context Switching)

 


프로세스 생성과 종료

 


쓰레드 (Thread)

 

 


[섹션 03]

 CPU 스케줄링 이란?

 


2. 스케줄링 목표


다중 큐 (Multi-Queue)


FIFO (First In First Out)

 


SJF (Shortest Job First)

 


타임 슬라이스 (Time Slice)란?

 


타임 슬라이스의 특징

 

타임 슬라이스가 적용되는 스케줄링 알고리즘

 


RR (Round Robin)

 


MLFQ (Multi-Level Feedback Queue)

 

 


'그림으로 쉽게 배우는 자료구조와 알고리즘(기본편)'

 

자료구조와 알고리즘이란?

 


시간 복잡도(Time Complexity)란?

image


배열(Array) 개념

 

배열 구현

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    
    cout << "배열 요소 출력: ";
    for(int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    
    return 0;
}

 


연결 리스트(Linked List) 개념

연결리스트 구현

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
    Node(int val) : data(val), next(nullptr) {}
};

class LinkedList {
public:
    Node* head;
    
    LinkedList() : head(nullptr) {}

    void insert(int data) {
        Node* newNode = new Node(data);
        newNode->next = head;
        head = newNode;
    }

    void remove(int data) {
        Node* temp = head;
        Node* prev = nullptr;
        
        while (temp && temp->data != data) {
            prev = temp;
            temp = temp->next;
        }
        
        if (!temp) return; // 삭제할 노드 없음

        if (prev) prev->next = temp->next;
        else head = temp->next; // 첫 번째 노드 삭제 시
        
        delete temp;
    }

    void display() {
        Node* temp = head;
        while (temp) {
            cout << temp->data << " -> ";
            temp = temp->next;
        }
        cout << "NULL\n";
    }
};

int main() {
    LinkedList list;
    list.insert(10);
    list.insert(20);
    list.insert(30);
    
    list.display();
    list.remove(20);
    list.display();
    
    return 0;
}

 


스택(Stack) 개념

스택 구현 (C++)

#include <iostream>
#include <stack>
using namespace std;

int main() {
    stack<int> s;
    
    s.push(10);
    s.push(20);
    s.push(30);
    
    cout << "Top: " << s.top() << endl;
    
    s.pop();
    cout << "Top after pop: " << s.top() << endl;
    
    return 0;
}

 


큐(Queue) 개념

큐 구현 (C++)

#include <iostream>
using namespace std;

class Queue {
private:
    struct Node {
        int data;
        Node* next;
        Node(int val) : data(val), next(nullptr) {}
    };

    Node *frontNode, *rearNode;

public:
    Queue() : frontNode(nullptr), rearNode(nullptr) {}

    void enqueue(int data) {
        Node* newNode = new Node(data);
        if (!rearNode) {
            frontNode = rearNode = newNode;
            return;
        }
        rearNode->next = newNode;
        rearNode = newNode;
    }

    void dequeue() {
        if (!frontNode) return;
        Node* temp = frontNode;
        frontNode = frontNode->next;
        if (!frontNode) rearNode = nullptr;
        delete temp;
    }

    int front() {
        return (frontNode) ? frontNode->data : -1;
    }

    bool isEmpty() {
        return frontNode == nullptr;
    }
};

int main() {
    Queue q;
    q.enqueue(10);
    q.enqueue(20);
    q.enqueue(30);
    
    cout << "Front: " << q.front() << endl;
    q.dequeue();
    cout << "Front after dequeue: " << q.front() << endl;
    
    return 0;
}

 


덱(Deque) 개념

덱 구현 (C++)

#include <iostream>
using namespace std;

class Deque {
private:
    struct Node {
        int data;
        Node* next;
        Node* prev;
        Node(int val) : data(val), next(nullptr), prev(nullptr) {}
    };

    Node *frontNode, *rearNode;

public:
    Deque() : frontNode(nullptr), rearNode(nullptr) {}

    void push_front(int data) {
        Node* newNode = new Node(data);
        if (!frontNode) {
            frontNode = rearNode = newNode;
        } else {
            newNode->next = frontNode;
            frontNode->prev = newNode;
            frontNode = newNode;
        }
    }

    void push_back(int data) {
        Node* newNode = new Node(data);
        if (!rearNode) {
            frontNode = rearNode = newNode;
        } else {
            newNode->prev = rearNode;
            rearNode->next = newNode;
            rearNode = newNode;
        }
    }

    void pop_front() {
        if (!frontNode) return;
        Node* temp = frontNode;
        frontNode = frontNode->next;
        if (frontNode) frontNode->prev = nullptr;
        else rearNode = nullptr;
        delete temp;
    }

    void pop_back() {
        if (!rearNode) return;
        Node* temp = rearNode;
        rearNode = rearNode->prev;
        if (rearNode) rearNode->next = nullptr;
        else frontNode = nullptr;
        delete temp;
    }

    int front() {
        return (frontNode) ? frontNode->data : -1;
    }

    int back() {
        return (rearNode) ? rearNode->data : -1;
    }
};

int main() {
    Deque d;
    d.push_back(10);
    d.push_front(20);
    
    cout << "Front: " << d.front() << ", Back: " << d.back() << endl;
    
    d.pop_front();
    cout << "Front after pop: " << d.front() << endl;
    
    return 0;
}

 


해시 테이블(Hash Table) 개념

해시 테이블 구현 (C++)

#include <iostream>
#include <vector>
using namespace std;

class HashTable {
private:
    static const int SIZE = 10;
    vector<pair<int, int>> table[SIZE];

    int hashFunction(int key) {
        return key % SIZE;
    }

public:
    void insert(int key, int value) {
        int hashIndex = hashFunction(key);
        table[hashIndex].push_back({key, value});
    }

    int get(int key) {
        int hashIndex = hashFunction(key);
        for (auto &p : table[hashIndex]) {
            if (p.first == key) return p.second;
        }
        return -1; 
    }
};

int main() {
    HashTable ht;
    ht.insert(1, 100);
    ht.insert(11, 200);
    
    cout << "Key 1: " << ht.get(1) << endl;
    cout << "Key 11: " << ht.get(11) << endl;
    
    return 0;
}

 


셋(Set) 개념

 

셋 구현 (C++)

#include <iostream>
using namespace std;

class Set {
private:
    struct Node {
        int data;
        Node* next;
        Node(int val) : data(val), next(nullptr) {}
    };

    Node* head;

public:
    Set() : head(nullptr) {}

    void insert(int data) {
        if (contains(data)) return;
        Node* newNode = new Node(data);
        newNode->next = head;
        head = newNode;
    }

    bool contains(int data) {
        Node* temp = head;
        while (temp) {
            if (temp->data == data) return true;
            temp = temp->next;
        }
        return false;
    }
};

int main() {
    Set s;
    s.insert(10);
    s.insert(20);
    s.insert(10); 
    
    return 0;
}

 

답변 0