![[인프런 워밍업 클럽 3기] CS - 1주차 미션](https://cdn.inflearn.com/public/files/blogs/6f556692-c492-4b5a-898f-7369d66f2ef6/인프런 워밍업 클럽 3기 썸네일.jpg)
[인프런 워밍업 클럽 3기] CS - 1주차 미션
1주차 미션
운영체제
while(true){
wait(1); // 1초 멈춤
bool isActivated = checkSkillActivated(); // 체크
}
위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식 입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?
폴링 방식을 사용하게 되면 CPU가 주기적으로 이벤트 발생 여부를 확인하는데 불필요한 연산 때문에 성능이 좋지 않고 , 계속 이벤트 체크를 해주어야 하기 때문에 자원이 낭비되는 문제가 발생함.
이를 위해 인터럽트 방식을 사용해야 한다.
인터럽트 방식은 이벤트가 발생했을 때 , 서비스 루틴(ISR)을 실행하여 이벤트를 처리하고 ISR은 비동기적으로 동작해 성능이 좋음.
프로그램과 프로세스가 어떻게 다른가요?
프로그램 : 저장 장치에 저장된 명령문의 집합체 (파일 , 코드)를 뜻함
프로세스 : 메모리에 올라가 실행중인 프로그램을 의미
멀티 프로그래밍과 멀티 프로세싱이 어떻게 다른가요?
멀티 프로그래밍 : 메모리에 여러 프로세스가 올라온 형태
멀티 프로세싱 : CPU 여러 개를 사용해 여러 작업을 동시에 처리하는 방식
멀티 프로그래밍은 동시에 실행하는것 처럼 시분할 방식을 가지고 , 멀티 프로세싱은 병렬처리가 이루어져 여러 프로그램을 동시에 실행함.
운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?
PCB를 사용. 프로세스가 만들어지면 운영체제는 프로세스 정보를 가지고 있는 PCB를 생성. PCB 는 서로 연결되어 있는 연결 리스트 형태를 가지고 프로세스를 효율적으로 관리함.
컨텍스트 스위칭이란 뭔가요?
CPU가 실행 중인 프로세스를 변경할 때 , 현재 실행중인 프로세스의 상태를 저장하고 , 다른 프로세스의 상태값으로 교체.
컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경되며 , 컨텍스트 스위칭이 자주 일어나는 환경에서는 오버헤드가 발생할 가능성이 있음.
자료구조 & 알고리즘
여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.
이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.
해시맵을 사용하여 빠르게 검색하고 중복을 피하기 위해 키-값 저장을 할 수 있는 해시맵을 사용할 것같습니다. 학생의 고유 값인 학번 이나 이름을 키로 사용해 빠르게 검색하는 부분에 효율적으로 저장/관리 할 것 같습니다.
여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.
주문이 들어온 순서라면 큐를 사용하여 먼저 들어온 주문을 먼저 처리(FIFO) 선입선출 방식으로 처리하고 데이터의 삽입 삭제가 O(1)로 효율적인 처리가 가능하기 때문입니다.
우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.
public class Stack { private final int[] stack; // 스택 배열 생성 private final int capacity; private int size; public Stack(int capacity) { this.capacity = capacity; this.stack = new int[capacity]; this.size = 0; } public static void main(String[] args) { Stack stack = new Stack(3); stack.push(1); stack.push(2); stack.push(3); stack.push(4); // 스택의 사이즈가 0일 경우 -1 return System.out.println(stack.peek()); // 제일 스택 위에 있는 값 3 System.out.println(stack.pop()); // 3 System.out.println(stack.pop()); // 2 System.out.println(stack.pop()); // 1 System.out.println(stack.pop()); // -1 } // 스택이 비었는지 검증 public boolean isEmpty() { return size == 0; } // 스택이 가득 차있는지 검증 public boolean isFull() { return size == capacity; } // 데이터 삽입 (출구 쪽에 삽입) public void push(int data) { if (isFull()) { // 가득 차있을경우는 스택에 값을 삽입하지 않음. return; } // 마지막 인덱스에 삽입 stack[size] = data; size++; } // 데이터 삭제 (출구 쪽에서 삭제) public int pop() { if (isEmpty()) { // 스택에 값이 없을경우 -1 return return -1; } // 마지막 인덱스의 데이터 반환 후 크기 감소 int poppedValue = stack[size - 1]; size--; return poppedValue; } // 스택 가장 위의 값 public int peek() { if (isEmpty()) { // 스택이 비었을 때 검증 return -1; } return stack[size - 1]; } }
해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.
(힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력)
hashFunction(name){
let hashValue = 0;
for (let i = 0; i < name.length; i++) {
hashValue += name.charCodeAt(i); // 각 문자의 유니코드 값 더함
}
return hashValue % 10;
}
댓글을 작성해보세요.