본문 바로가기

전체 글

(56)
C 프로그래밍 언어의 역사 C 언어는 포인터라는 깊은 논리적인 사고를 요하는 연산자와 긴 코드때문에 어렵기로 악명이 높습니다.. 그러나 프로그래밍을 전문적으로 전공하는 사람들이라면 반드시 한 번쯤은 고비를 넘어가야 하는 필수 언어이기도 합니다. 필자 또한 돌아보면 1학년 2학기에 교수님께서 유독 C언어의 중요성을 강조하시면서 혹독하게 학생들을 훈련시켰던 기억이 있습니다. 4학년이 된 지금은 그 이유를 서서히 꺠닫고 있습니다. 그렇다면 어떻게 C언어가 탄생하게 되었을까? 우선 이름의 유래부터 살펴보자. 상단의 그림의 두 분의 성함은 켄 톰슨과 데니스 리치이고, 이 두분이 AT&T사의 벨 연구소에서 1969부터 1973년까지 4년에 걸쳐 C언어를 개발하셨다고 한다. 개발의 목표는 UNIX 운영체제를 만드는 데에 사용되었던 언어인 PD..
[Nachos] 4. Priority Scheduler 구현 [Nachos] 4. Priority Scheduler 구현 1. 문제제기 a) 목표 현재 디폴트 값인 Round-Robin 스케줄러를 통해서 실행되고 있는 나쵸스 프로그램을, 아직 덜 구현된 Priority 스케줄러를 사용하여 구현한다. b) 상황 현재 PriorityScheduler 클래스에는 내부클래스로 PriorityQueue와 ThreadSate가 선언되어있고 이 중 ThreadState의 맴버함수중getPriority(), EffectivePriority(), SetPriority()가 아직 덜 구현되어있다. 기존에 정의되어있는 priority를 사용하면 심각한 deadlock에 빠질 가능성이 있다. 예를 들어 설명하면 3의 우선순위를 가진 스레드 A와 5의 우선순위를 가진 스레드 B가 있고 ..
[Nachos] 3. Alarm 클래스 구현 [Nachos] 3. Alarm 클래스 구현 1. 문제제기 a) 상황 및 목표 아직 미완성의 Alarm 클래스를 완성하는 것이다. 기존의 Alarm클래스는 sleep을 하지 않고 스핀을 통해서 원하는 시간까지 기다린 뒤에 스레드를 시작하는 코드로 구성되어 있다. 따라서 스핀하고 있는 스레드 때문에 하드웨어를 효율적으로 사용하지 못하는 코드이다. 따라서 Alarm의 wait을 호출한 스레드가 sleep하였다가 원하는 시간 후에 깨어나는 것으로 구현된다면, 다른 리소스가 CPU를 사용할 수 있게 된다. 위에 설명한 방식대로 Alarm을 구현하는 것이 목표이다. 이 때 하드웨어의 Timer의 도움을 받아서 구현한다. 2. 분석 및 알고리즘 a) Alarm.timerInterrupt() 코드 분석 b) Alar..
[Nachos] 2. Condition 클래스 구현 [Nachos] 2. Condition 클래스 구현 1. 문제제기 a) 목표 Semaphore로 구현 되어있는 Condition클래스를, 하드웨어 인터럽트를 사용하여 Condition2에 새롭게 구현한다. b) 상황 동기화를 위해 semaphore를 사용할 경우, user 프로그래머가 실수로 P와V의 순서를 반대로 생각하고 프로그램을 작성했을 경우, 심각한 Deadlock에 빠질 수 있다. 따라서 lock과 conditional variable을 분리시킨 monitor를 사용하면 이러한 실수나 예외적인 프로그램환경에서 프로그램이 돌아갈 수 있다. 2. 분석 및 알고리즘 a) Condition2.sleep() 코드 분석 b) Condition2.wake() 코드 분석 c) Condition2.wakeAll..
[Nachos] 1. KThread.join() 구현 [Nachos] 1. KThread.join() 구현 1. 문제제기 a) 목표 Nachos 소스코드에 아직 불완전하게 정의되어 있는 KThread 클래스에 join 기능을 추가하여, 여러 개의 스레드를 동시에 작동시킬 때Serialize(직렬화)를 가능하게 하게한다. b) 상황 현재 KThread에는 Join 기능이 구현되어 있지 않다. 따라서 먼저 job을 실행한 스레드가 나중에 job을 실행한 스레드 보다 일찍 끝난다는 보장이 없다. 때문에 어떤 한 스레드가 일련의 작업을 수행한 뒤, 그 결과를 바탕으로 다른 작업을 수행해야 한다면 병렬처리를 포기하고 하나의 프로세서로 batch 프로그래밍을 해야 하는 상황이다. 하지만 join기능을 이용하면 병렬처리를 하면서, 즉 CPU자원을 최대로 활용하면서 스레..
루소의 <에밀>을 바탕으로 바라본 프랑스 대혁명의 사상적 기초 어린이와 어른 사이는 너무 거리가 있어 도무지 양자를 연결 시킬만한 공통점이 없다.” “우리는 어린 시절에 대하여 아무것도 모르고 있다. 가장 현명한 학자들도 어린이에 대해 어른이 알아야 하는 것에는 관심이 없다. 항상 어린이 속에서 어른을 요구할 뿐. 어른이 되기 전의 어린이가 어떤 것인지를 생각하지 않는다. 이것이 바로 나의 주된 관심사이다. 우리는 무엇보다도 먼저 어린이를 좀더 주의 깊게 바라보고 관찰해야 한다. 왜냐하면 어린이에 대해서 아무것도 모른다는 사실이 명백하기 때문이다.” 정말 그렇다. 어른들은 어린이들에 잘 안다고 생각하지만, 사실은 그렇지 못하다. 우리 또한 어린시절 어른들의 입장에서 교육을 받아왔고, 어린시절 느낀 부자연스러움은 대부분 망각하기 때문이다. 그리고 우리는 또 다시 어린..
[운영체제] 생산자-소비자 문제 (Producer-Consumer Problem) 본 포스팅의 내용은 Operating System Concepts 10th, Operating Systems Three Easy Pieces를 참조하여 작성되었습니다. 운영체제는 여러개의 프로세스들이 동시에(Concurrently) 실행되는 것처럼 사용자에게 보여주거나, 실제로 여러개의 코어를 활용해 여러개의 스레드를 실행시킵니다. 이때 모든 프로세스나 스레드가 자신만의 독자적인 메모리 주소공간을 사용한다면 문제가 없겠지만, 스레드 간의 공유하는 메모리 주소공간이 있다면 문제가 생길 수 있습니다. 이러한 문제를 가장 직관적으로 잘 설명한 것이 생산자(Producer)-소비자(Consumer) 문제(Problem)입니다. 쉽게 설명하기 위해 아래 그림을 통해 예를들어 설명해 보겠습니다. 왼쪽에 있는 소비자..
[네트워크] 프로토콜이란 무엇인가? 본 포스팅의 내용은 Computer Networking A Top Down Approach 7th를 많이 참고하여 작성하였습니다. 프로토콜이란 무엇인가? 위키피디아에 따른 통신 프로토콜의 정의는 아래와 같습니다. 통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 통신 프로토콜은 신호 체계, 인증, 그리고 오류 감지 및 수정 기능을 포함할 수 있다. 프로토콜은 형식, 의미론 그리고 통신의 동기 과정 등을 정의하기는 하지만 구현되는 방법과는 독립적이다. 따라서 프로토콜은 하드웨어 또는 소프트웨어 그리고 때로는 모두를 사용하여 구현되기도 한다. 한마디로 설명하면, 프로토콜이란 통신할 때 미리 약속한 규칙이라 바꾸어 표현할 수 있습니다. 책에서는 사람..