
운영체제의 역할 컴퓨터시스템 = 사용자(사람, 프로그램, 장치) + 하드웨어 + 소프트웨어 운영체제는 하드웨어와 사용자 간의 1) 조정자 2) 자원관리자 3) 입출력장치와 사용자프로그램 제어 역할을 수행 🐷 운영체제의 목표 1) 편리성 (convenience) 2) 효율성 ( efficiency = 성능향상) 3) 안정성 (robustness) 4) 확장성 🐷 운영체제의 발전과정 초기 : 일괄처리 ( Batch System) ex) omr 시스템 장점 : 한꺼번에 처리 가능 단점 : 단절되어 있다. (offline system) 어떻게 하면 오프라인 시스템의 성능을 향상 시킬 수 있을까 ? -> 온라인 시스템 (데이터가 처리되고 나가기까지의 과정이 그대로 유지) 으로 바꿔줘야한다. 즉, 데이터를 입력장치..
🐰 덱(deque) ? 덱은 double-ended queue의 줄임말로서 큐의 전단(front)나 후단(rear)에서 모두 삽입과 삭제가 가능한 큐이다. 덱의 연산 create() : 덱 생성 init(dq) : 덱 초기화 is_empty(dq) : 덱이 공백 상태인지 확인 is_full(dq) : 덱이 포화 상태인지 확인 add_front(dq,e) : 덱의 앞에 요소를 추가한다. add_rear(dq,e) : 덱의 뒤에 요소를 추가한다. delete_front(dq) : 덱의 앞에 있는 요소를 반환한뒤 삭제한다. delete_rear(dq) : 덱의 뒤에 있는 요소를 반환한뒤 삭제한다. get_front(q) : 덱의 앞에서 삭제하지 않고 앞에 있는 요소를 반환한다. get_rear(q): 덱의 뒤..
c언어로 간단한 계산기 프로그램을 구현해보자. 👩🏻💻 생각과정 👩🏻💻 1) 먼저 값을 나타내는 변수들과 연산자, 정답을 나타내는 변수를 설정한다. 2) scanf 문을 활용해서 사용자에게 값을 입력받는다. 3) 조건문을 활용해서 다양한 경우의 수를 확인해준다. 4) 예외 조건을 확인한다. #include #include #include #include int main(int argc,char* argv[]){ float valueOne; float valueTwo; char operator; float answer; printf("Enter calculation: \n\n"); scanf("%f %c %f",&valueOne,&operator, &valueTwo); switch(operator){ c..
🔔 원형 큐 선형 큐에서 더 발전된 형태인 원형 큐를 살펴보자. 앞서 말했듯 선형 큐는 front와 rear의 값이 계속 증가만 하기 때문에 언젠가는 배열의 끝에 도달하게 되고 배열의 앞부분이 비어 있더라도 사용하지 못한다. 따라서 주기적으로 모든 요소들을 왼쪽으로 옮겨주어야 한다. 즉, 매번 요소들을 이동시키기 위해서는 상당한 시간과 복잡한 코딩이 소요된다. 원형 큐는 이러한 선형 큐들의 문제점을 해결한다. 배열을 선형이 아닌 원형으로 생각을 하는 건데 즉 front와 rear의 값이 배열의 끝인 (MAX_QUEUE_SIZE-1) 에 도달하면 다음에 증가되는 값은 0이 되도록 하는 것이다. 🔔 원형 큐 전체 코드 #include #include #define MAX_QUEUE_SIZE 5 typedef..

💬 큐 앞서 배웠듯 스택의 경우 나중에 들어온 데이터가 먼저 나가는 구조이다. 그러나 큐는 먼저 들어온 데이터가 먼저 나가는 구조이다. 즉, FIFO (First In First Out) 선입선출 형태를 띈다. 데이터는 큐의 후단(rear)에 삽입되고 전단(front)를 통해 나간다. 즉, 삽입과 삭제가 같은 곳이 아니라는 것 ! 더보기 - 전단(front) : 데이터의 삭제 연산 (가장 먼저 들어왔던 데이터가 쌓여있는 쪽) -> dequeue 연산 - 후단(rear) : 데이터의 삽입 연산 (가장 나중에, 최근에 삽입된 데이터가 쌓여있는 쪽) -> enqueue 연산 💬 큐의 연산 enqueue: 큐의 rear 에 새로운 원소를 삽입하는 연산 dequeue: 큐의 front에 있는 원소를 큐로부터 삭제..

먼저 스택을 전역변수(global variable)로 구현해보자. 여기서 전역변수란 중괄호 외부에 선언되는 변수다. #include #include #define MAX_STACK_SIZE 100 typedef int element; element stack[MAX_STACK_SIZE]; int top= -1; int is_empty(void) //공백 상태 검출 함수 { return (top==-1); } int is_full(void) //포화 상태 검출 함수 { return (top==(MAX_STACK_SIZE-1)); } void push(element item) { if(is_full()){ fprintf(stderr,"스택 포화 에러\n"); return; } else stack[++top]..
*(++ptr)=20; //ptr에 저장된 값 자체를 변경 *(ptr+1)=20; //ptr에 저장된 값은 변경하지 않음 위의 두 문장 모두 현재 ptr이 가르키는 위치에서 4바이트씩 떨어진 메모리 공간에 20을 저장하는 문장이지만 연산 이후 포인터 변수 ptr에는 차이가 있다. 첫번째 문장의 경우 ++ 연산의 결과로 인해 포인터 변수 ptr에 저장된 값이 4만큼 증가한다. 하지만 두 번째 문장의 경우 + 연산으로 인해서는 ptr에 저장된 값이 증가하지 않는다. 다만 증가된 값을 연산의 결과로 얻어서 * 연산을 진행하는 것이다. 예시로 이해해보도록 하자 ! 👩🏻💻 문제 1) 길이가 5인 int형 배열 arr을 선언하고 이를 1,2,3,4,5로 초기화한 다음, 이 배열의 첫 번째 요소를 가르키는 포인터 ..
🎀 타입과 인스턴스 타입( type)는 추상화 된 것이고 인스턴스 (instance) 는 타입을 실체화한 구체적인 실체를 의미한다. 예시로 원을 하나의 타입이라고 하고 종이 위에 여러 크기의 원을 그리면 이러한 원들이 인스턴스가 된다. 🎀 객체 지향에 필요한 클래스의 구조 새로운 자료형 (타입)을 만들때는 클래스 (class)를 사용한다. 객체 지향 프로그램에서는 타입으로 클래스를 만들고 이를 기반으로 인스턴스인 객체를 만든다. 클래스를 기반으로 인스턴스를 만드는 것을 인스턴스화 (instantiation) 라고 한다. 객체지향 프로그래밍을 할때는 1) 클래스 정의 2) 멤버 함수 정의 3) 애플리케이션 ( 클래스를 기반으로 객체를 만들어 사용하는 부분) 이 필요하다. #include using name..