워밍업 클럽(CS) 첫 스타트🐣 1주차 발자국🐾

워밍업 클럽(CS) 첫 스타트🐣 1주차 발자국🐾

전공자 만큼의 지식을 갖기 위한 나의 첫걸음, 인프런 워밍업 클럽과 함께

비전공자에 공무원인 내가 개발자가 되기를 꿈꾸며 시작한 인프런 워밍업클럽!

진짜 먼 여정이 남았지만 첫 시작을 이번 워밍업클럽과 하게되어 너무 즐겁고,

그 첫 발자국을 이렇게 남깁니다.

 

강의 한줄평

'감자'님의 강의는 깔끔한 화면과 깔끔한 설명으로 공부하면서 눈도 즐거운 완벽한 강의다.


1주차 발자국📓

 

그림으로 쉽게 배우는 자료구조와 알고리즘

프로그램 = 자료구조 + 알고리즘

  • 자료구조

     

     

    • 데이터가 어떤 구조로 저장되고 어떻게 사용되는 지를 나타냄

    • 예시 : 변수, 배열

  • 알고리즘

     

     

    • 어떤 문제를 해결하기 위한 확실한 방법

       

알고리즘의 속도 => 성능의 척도 "시간복잡도"

  • 특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간

  • 코드에서 성능에 많은 영향을 주는 부분 -> "반복문"

  • 성능 평가

     

     

    • Big-Ω 최선의 경우 한 번에 찾음

    • Big-Ο 최악의 경우 배열의 길이만큼 걸림

    • Big-Θ 평균의 경우 배열의 길이 중간만큼 걸림

       

배열

  • 일반적인 배열

     

    • 배열을 선언할 때 배열의 크기를 알려준다.

    • 예시

       

      • int arr[10] = {1, 2, 3, 4, 5};

      • 운영체제는 숫자 10개가 들어갈 수 있는 연속된 빈 공간을 찾아 1,2,3,4,5 할당

      • 운영체제는 배열의 시작 주소, 즉 1이 들어간 주소만 기억

      • 배열의 인덱스 참조는 길이에 상관없이 한 번에 가져오기 때문에 Ο(1)의 성능을 가진다.

      • 읽기 쓰기 참조 성능 Good, 데이터의 삽입 삭제 성능 Bad

         

  • 자바스크립트의 배열

     

    • 상황에 따라 연속적, 불연속적으로 메모리 할당

    • 불연속적으로 할당된 메모리는 내부적으로 연결

     

연결리스트(Linked List)

  • 크기를 모르면 메모리가 낭비될 수 있다는 배열의 단점을 해결하기 위해 등장

  • 저장하려는 데이터를 메모리 공간에 분산해 할당하고 데이터들을 서로 연결

  • 노드(Node)를 만들어서 수행 , 노드 = 데이터를 담는 변수 + 다음 노드를 가리키는 변수

    image

  • 연결리스트는 데이터들이 전부 떨어져 있기 때문에 바로 접근 X

  • 데이터 참조 성능 : O(n)

  • 추상자료형 : 어떠한 데이터와 그 데이터에 대한 연산

  • 연결리스트의 추상자료형

     

    • 모든 데이터 출력 printAll()

    • 모든 데이터 제거 clear()

    • 인덱스 삽입 insertAt(index, data);

    • 마지막 삽입 insertLast(data);

       

    • 인덱스 삭제 deleteAt(index);

    • 마지막 삭제 deleteLast();

    • 인덱스 읽기 getNodeAt(index);

  • "Node" 클래스 선언, "LinkedList" 클래스 선언

    class Node{
        constructor(data, next = null){
            this.data = data;                    # 자바스크립트에서 클래스 내의 변수는 프로퍼티
            this.next = next;
        }
    }
    
    class LinkedList{
        constructor(){
            this.head = null;
            this.count = 0;
        }
    
        insertAt(index, data){
            if(index > this.count || index < 0){
                throw new Error("범위를 넘어갔습니다.");
            }
    
            let newNode = new Node(data);
    
            if(index==0){
                newNode.next = this.head;
                this.head = newNode;
            } else {
                let currentNode = this.head;
    
                for(let i = 0; i < index - 1; i++){
                    currentNode = currnetNode.next;
                }
                newNode.next = currentNode.next;
                currentNode.next = newNode;
            }
            this.count++;
        }
    }

 스택(stack)

  • First In Last Out(FILO)

  • 먼저 들어간 데이터가 나중에 나오는 규칙

  • head에만 삽입, 제거

큐(Queue)

  • First In First Out(FIFO)

  • 먼저 들어간 데이터가 먼저 나오는 규칙

  • head에 삽입하고 tail에서 제거

덱(Deque)

  • 데이터의 삽입과 제거를 head와 tail 두 군데서 자유롭게 할 수 있는 자료구조

해시 테이블(Hash Table)

  • 해시(Hash), 맵(Map), 해시맵(HashMap), 딕셔너리(Dictionary)

  • Key만 알면 Value에 Ο(1)의 성능으로 읽기 가능

  • 삽입, 수정, 삭제까지 Ο(1)의 성능

셋(set)

  • 데이터의 중복을 허용하지 않는 자료구조

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

운영체제가 하는 일

  1. 프로세스 관리

  2. 메모리 관리

  3. 하드웨어 관리

  4. 파일시스템 관리

운영체제의 역사

  • 1940년도

     

    • 애니악

    • 1943년부터 미군지휘하에 펜실베니아 대학교에서 개발

    • 최초 목적 : 미사일 탄도계산

    • 스위치와 배선 연결을 통한 프로그래밍

     

  • 1950년도 초반

     

    • 진공관과 전선으로 만들어진 논리 회로를 아주 작은 크기로 만든 직접 회로(IC) 개발

    • 현대적인 컴퓨터 모습 갖춤

    • CPU, 메모리 있었지만 키보드와 모니터는 없었음

    • 펀치카드 이용, 프로그래머가 카드에 구멍을 뚫어 프로그래밍

     

  • 1950년도 중후반

     

    • "싱글스트림 배치시스템"

    • 프로그래머가 여러개의 펀치카드를 오퍼레이터에 전달, 컴퓨터는 순서대로 실행

    • 입출력 I/O 디바이스 컨트롤러를 만들어 입출력 중에도 CPU가 계산할 수 있도록 만듦

    • 한계 : 입출력에도 CPU를 기다려야 하는 작업이 있음

     

  • 1960년도

     

    • "시분할 시스템"

    • 프로그램을 동시에 여러개 사용

    • 여러 사용자들이 여러 터미널로 하나의 컴퓨터에 접근하여 사용 -> 파일시스템 등장

    • UNIX

       

      • AT&T벨 연구소에서 C언어로 유닉스 운영체제 개발

      • 멀티 프로그래밍, 다중 사용자, 파일시스템 구현

    • 메모리 침범 이슈 발생

    • 베이스 레지스터 : 프로그램의 시작 주소 저장, 모든 프로그램은 0번지에서 실행한다고 가정

     

  • 1970년도 이후

     

    • 개인용 컴퓨터의 시대 시작

    • 애플의 매킨토시, 마이크로소프트의 MS-DOS가 많이 사용

     

운영체제의 구조

  • 운영체제의 핵심은 커널

     

image

폰 노이만 구조

image

CPU 스케줄링

  • 운영체제는 모든 프로세스에게 CPU를 할당/해제하는데 이를 CPU 스케줄링이라고 한다.

  • CPU 스케줄링에서 스케줄러(운영체제)가 고려해야 할 사항

     

    • 첫번째, 어떤 프로세스에게 CPU 리소스를 줘야하는가?

    • 두번째, CPU를 할당받은 프로세스가 얼마의 시간동안 CPU를 사용해야하는가?

  • 스케줄링 목표

     

    • 리소스 사용률

    • 오버헤드 최소화

    • 공평성

       

    • 처리량

    • 대기시간

    • 응답시간

  • 스케줄링 알고리즘

     

    • FIFO(First In First Out)

    • SJF

    • RR

    • MLFQ

       

 

 

댓글을 작성해보세요.

채널톡 아이콘