본문으로 건너뛰기

week 1. 자료구조와 알고리즘, 운영체제

banner.webp

1. 강의 진도표

CS (3/3~3/7)

Day 1 운영체제 들어가기

  • 알고리즘 Section 1
  • 운영체제 Section 1

Day 2 프로세스와 쓰레드

  • 알고리즘 Section 2 (1~3),
  • 운영체제 Section 2 (1~4)

Day 3 프로세스와 쓰레드

  • 알고리즘 Section 2 (4~8)
  • 운영체제 Section 2 (5~7)

Day 4 CPU 스케줄링

  • 알고리즘 Section 2 (9~10)
  • 운영체제 Section 3 (1~4)

Day 5 CPU 스케줄링 (과제必)

  • 알고리즘 Section 2 (11)
  • 운영체제 Section 3 (5~7)

2. 운영체제 week 1

컴퓨터가 기능을 수행하는 과정을 직관적인 시각자료와 간단한 예시를 통해 설명하고 있다. 시간은 평균 3분 정도로, 식사를 하거나 시간이 날 때 하나씩 들으며 진행했다.


1. 운영체제 들어가기

운영체제의 개요와 역사, 구조에 대해 설명하고 컴퓨터의 구성 요소에 대한 기본적인 내용이다.

  • 인터럽트 : 입출력 작업에서 CPU가 명령을 내리고 다른 일을 처리하는 것으로, 비동기적으로 처리하기 때문에 성능이 향상된다.
interrupt keyPressed(Key key){
if(key == KEY>ENTER)
{
print("Enter 눌림!!");
}
}

2. 프로세스와 쓰레드

프로세스

프로세스는 프로그램이 명령한 내용이 메모리에 올라갔을 때 실행중인 프로그램을 뜻한다.


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

  • 멀티 프로그래밍은 메모리에 프로세스를 여러 개 올리고 I/O 작업을 만났을 때 다른 프로세스를 실행시켜 CPU 효율을 향상시킨다.

  • 멀티 태스킹은 메모리에 프로세스를 여러 개 올리고 하나씩 짧게 실행시키는 방식으로 모든 프로세스를 동시에 실행시키는 것처럼 느끼게 만든다. 여러 개의 CPU가 이 과정을 처리하는 것이 멀티프로세싱이다.


PCB (Process Control Block)

프로세스의 정보를 저장한 공간으로 연결리스트라는 자료구조로 저장된다. 운영체제는 PCB의 프로세스 상태값을 읽고 기능을 수행한다.


컨텍스트 스위칭

프로세스 실행 후 인터럽트가 일어날 때 프로세스 상태를 PCB에 저장하고 다른 프로세스를 실행한다. 프로세스의 점유율이 높아지면 일어난다.


쓰레드

작업 처리마다 프로세스를 생성하면 메모리가 무거워지기 때문에 프로세스 내부에서 영역을 공유하는 쓰레드를 생성해 성능을 향상시킬 수 있다.


3. CPU 스케줄링

운영체제가 프로세스에게 CPU를 할당/해제하는 것을 뜻한다. 프로세스에게 CPU 사용 권한과 점유율을 할당하며 컴퓨터 성능에 큰 영향을 미치는 작업이다.


3. 알고리즘 week 1

앞서 배운 운영체제를 복습하며 더 깊게 이해하는 과정이다. 성능 향상이라는 추상적인 개념을 코드를 통해 자세하게 이해할 수 있게 진행하고 있다.


1. 개요

프로세스 실행 순서(코드의 배치) 를 정리하는 것이 자료구조다. 이 구조에 따라 성능이 바뀌며, 성능이 좋다는 것은 속도가 빠르다는 것을 뜻한다. 최악의 경우의 수에서 가장 높은 성능을 내는 것이 중요하다.


2. 자료 구조

연결리스트

데이터를 참조해야 하는 경우 배열을 사용하는 것이 좋지만, 데이터의 수가 자주 바뀌게 된다면 연결리스트를 사용해 성능을 향상시킬 수 있다.

  • 배열(Array) : 크기가 일정한 데이터를 연속된 메모리 주소에 할당한다.

  • 연결 리스트(Linked List) : 크기가 정해지지 않은 데이터를 노드에 할당하고 참조할 수 있다.


스택(Stack)

가장 마지막에 들어온 데이터가 먼저 나가게 된다. 이 기능을 이용해 사용자가 입력한 작업 내용을 되돌리는 등의 역할을 수행할 수 있다.


큐(Queue)

가장 먼저 들어온 데이터가 먼저 나가게 된다. 운영체제에서 프로세스를 대기열을 순서대로 처리할 때 사용한다.


덱(Deque)

스택과 큐의 특성을 종합한 구조를 가진다. 데이터의 순서에 상관없이 원하는 방향으로 데이터를 유연하게 처리할 수 있다.


해시 테이블(Hash Table)

데이터를 키와 값으로 저장하는 방식으로 빠른 데이터 검색과 효율적인 삽입 삭제가 가능하지만 메모리 사용량이 높다.


셋(Set)

해시 테이블을 사용한다고 해서 해시 셋이라고도 한다. 값을 제외하고 키만 사용해서 저장하기 때문에 중복된 원소를 자동으로 삭제하므로, 중복을 허용하지 않는다.


3. 과제 week 1

1. 운영체제

1. 코드 수정

 while(true){
wait(1); // 1초 멈춤
bool isActivated = checkSkillActivated(); // 체크
}
  • 해당 코드의 성능을 개선해야 한다.

    isActivated = checkSkillActivated();
if (isActivated)
{
actionSkillActivated();
}
  • 조건문을 넣어 스킬이 사용됐을 때만 특정 행동을 하도록 만들었다.

2. 프로그램과 프로세스는 어떻게 다른가요?

프로세스는 프로그램이 명령한 내용이 메모리에 올라갔을 때 실행중인 프로그램을 뜻한다.


3. 멀티 프로그램과 멀티 프로세싱이 어떻게 다른가요?

멀티 프로그래밍은 I/O 작업이 일어나는 조건으로 다른 프로그램을 실행하고, 멀티 프로세싱은 여러 개의 프로그램을 짧은 시간에 한번씩 수행해 동시에 작업이 일어나는 것처럼 보이게 하는 방식을 여러 CPU에서 사용한다.


4. 컨텍스트 스위칭이란 뭔가요?

프로세스 실행 후 인터럽트가 일어날 때 프로세스 상태를 PCB에 저장하고 다른 프로세스를 실행한다.


2. 알고리즘

1. 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하기 위한 자료구조 선택

데이터가 바뀌게 된다고 해도 구조가 아닌 내용이 바뀌게 되기 때문에 일반적인 상황에서 자주 바뀌지 않는다. 데이터 구조가 정적이기 때문에 배열을 사용할 것이다.


2. 고객의 주문을 순서대로 처리하는 프로그램의 자료구조 선택

대기열을 순서대로 처리하는 방식이면 큐(Queue)를 사용해 처리하는 것이 바람직하다.


3. 스택을 출구쪽으로 데이터가 삽입되고 나오는 구조로 변경

class Stack{
constructor(){
this.list = new LinkedList();
}
push(data){
this.list.insertAt(0, data);
}
pop(){
try{
return this.list.deleteAt(0);
} catch(e){
return null;
}
}
peek(){
return this.list.getNodeAt(0);
}
isEmpty(){
return (this.list.count == 0);
}
}
  • 기존 구조는 입구쪽으로 데이터가 삽입되고 나오는 구조이다.
  • LinkedList는 insertAt(index, data), insertLast(data), deleteAt(index), deleteLast(), getNodeAt(index)의 자료구조를 가진다.

class Stack{
constructor(){
this.list = new LinkedList();
}
push(data){
this.list.insertLast(data);
}
pop(){
try{
return this.list.deleteLast();
} catch(e){
return null;
}
}
peek(){
return this.list.getNodeAt(this.list.count - 1);
}
isEmpty(){
return (this.list.count === 0);
}
}

선수 해시 테이블을 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정

  • 힌트: charCodeAt() 함수를 이용
  • 예시: name1 = "이운재"
  • name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력
class HashTable{
hashFunction(number){
return number % 10;
}
}
  • 이 코드에서 name 프로퍼티를 사용해야 한다.

class HashTable{
hashFunction(name){
let hash = 0;
for (let i = 0; i < name.length; i++) {
hash += name.charCodeAt(i);
}
}
}

후기

펼치기
  1. 좋았던 점: CS 관련 지식이 없는 비전공자도 쉽게 이해할 수 있는 강의이다.

  2. 배운 점: 자료 구조와 알고리즘, 운영체제의 기초를 배웠다.

  3. 어려웠던 점: 컴퓨터가 좋아진 시대에 살고 있기 때문에 대용량 데이터 등을 처리하는 방식이 아니라면 성능 변동을 체감하기 함들 것 같다고 생각한다.

  4. 향후 계획: 자료 구조와 알고리즘은 클린 코드에도 영향을 끼친다고 생각한다. 목적에 맞는 자료구조를 선택할 때 고민 할 필요가 있다.