핀토스는 사람을 병들게 한다.전체적인 코드를 보고싶으면 여기 있는 레포지토리에서 확인하시면 됩니다.https://github.com/jun9898/pintos-kaist 🐳 문제정의현재상황Pintos - thread - alarm_clock 까지 구현된 상태에서는 작업의 우선순위가 고려되지 않은 채 쓰레드 스케쥴링을 수행한다. ( thread_unblock, thread_set_priority )여기서 만약 Priority에 따라 Ready_list를 정렬한다고 할지라도, Priority Inversion이 발생할 수 있기 때문에 공유자원에 대한 관리 또한 필요하다. (sema_up, sema_down)Priority Inversion을 해결하기 위한 방법으로는 priority inheritance p..
OSI 7계층OSI 7계층네트워크에서 통신이 일어나는 과정을 7계층으로 나눈것계층을 나눈 이유통신이 일어나는 과정을 단계별로 파악할 수 있고, 특정 계층에서 문제가 발생하면 문제가 밠애한 계층만 고치면 되기 때문임 1계층 Physical layer물리계층모든 파일과 프로그램은 0과 1의 나열이다. 결국 0과 1만 주고받을 수 있으면 통싱에 성공했다고 할 수 있는 셈.두대의 컴퓨터를 연결했다고 가정했을때, 1을 보낼때는 +5V의 전기를 전선으로 흘려보내고 0을 보낼때는 -5V의 전기를 전선으로 흘려보내면 0과 1의 전송이 가능할 것이다.0과 1을 주고받을 수 있으면 모든 데이터를 주고받을 수 있으므로 컴퓨터간의 통신이 가능해진다.그러나 이 아이디어는 실제에선 잘 동작하지 않는데, 그 이유는 전자기파의 주파..
Exceptional Control Flow제어 흐름처음 전원을 켤때부터 전원을 끄기까지, 프로그램 카운터는 일련의 값들을 순차적으로 가진다.순차적으로 명령을 실행하는 것을 제어 전달이라고 하며, 이러한 제어 전달의 연속은 프로세서의 제어 흐름이라고 한다(flow of control).예외 제어흐름가장 간단한 종류의 제어 흐름은 메모리에서 인접한 위치에 있는 연속된 명령을 수행하는 것이다.하지만 이런 흐름의 급격한 변화는 점프(jumps), 호출(calls), 반환(return)과 같은 익숙한 제어문으로 인해 발생한다.그러나 시스템은 내부 프로그램 변수로 포착되지 않는 시스템 상태의 변화에도 반응해야 하는데, 이는 프로그램의 정상적인 실행과 관련이 없을 수 있다.예를들어 OS가 관리하는 하드웨어 타이머에..
메모리 계층구조메모리 계층구조메모리 시스템은 바이트들의 선형배열이다.CPU 레지스터들은 가장 자주 이용하는 데이터를 보관한다.작고 빠른 캐시 메모리는 비교적 느린 메인 메모리에 저장되어있는 데이터와 인스트럭션을 미리 올려놓아, 상위 메모리에서 보다 빠르게 접근할 수 있게 구성되어있다.메모리 계층의 바닥으로 갈 수록 저렴하고 많은 용량을 저장할 수 있어, 단계적으로 캐시 메모리를 두어 보다 빠르게 데이터에 접근할 수 있게 구성되어있다. 저장장치 기술RAMRandom access memory는 정적램(SRAM), 동적램(DRAM)으로 나뉜다.정적램은 동적램보다 훨씬 더 빠르고 훨씬 더 비싸다.SRAM은 캐시 메모리로 사용되며 CPU 칩 내부 또는 외부에 장착된다 (L1, L2, L3)DRAM은 메인 메모..
Implicit free list 묵시적 가용 리스트의 구현을 위해서는 다음과 같은 메크로가 필요하다.#define WSIZE 4#define DSIZE 8#define CHUNKSIZE (1 (y) ? (x) : (y))#define PACK(size, alloc) ((size) | (alloc))#define GET(p) (*(unsigned int *)(p))#define PUT(p, val) (*(unsigned int *)(p) = (val))#define GET_SIZE(p) (GET(p) & ~0x7)#define GET_ALLOC(p) (GET(p) & 0x1)#define HDRP(bp) (..
Virtual Memory Dynamic Memory Allocation 동적 메모리 할당동적 메모리 할당기는 힙이라고 하는 프로세스의 가상 메모리 영역을 관리한다.할당기는 힙을 다양한 크기의 블록들의 집합으로 관리한다. 각 블록은 할당되었거나 가용한 가상 메모리의 연속적인 묶음이다.할당기명시적인 할당기는 응용 프로그램이 명시적으로 할당된 블록을 반환해 줄것을 요구한다. 예를들어, C 표준 라이브러리는 malloc 패키지라고 하는 명시적 할당기를 제공한다.반면에 묵시적 할당기들은 언제 할당한 블록이 더 이상 프로그램에 의해 사용되지 않고 블록을 단환하는지 할당기가 판단해서 free를 때려버린다.묵시적 할당기는 가비지 컬렉터라고 알려져 있다. malloc an..
Exceptional Control Flow제어 흐름처음 전원을 켤때부터 전원을 끄기까지, 프로그램 카운터는 일련의 값들을 순차적으로 가진다.순차적으로 명령을 실행하는 것을 제어 전달이라고 하며, 이러한 제어 전달의 연속은 프로세서의 제어 흐름이라고 한다(flow of control).예외 제어흐름가장 간단한 종류의 제어 흐름은 메모리에서 인접한 위치에 있는 연속된 명령을 수행하는 것이다.하지만 이런 흐름의 급격한 변화는 점프(jumps), 호출(calls), 반환(return)과 같은 익숙한 제어문으로 인해 발생한다.그러나 시스템은 내부 프로그램 변수로 포착되지 않는 시스템 상태의 변화에도 반응해야 하는데, 이는 프로그램의 정상적인 실행과 관련이 없을 수 있다.예를들어 OS가 관리하는 ..
RB-Tree RB-Tree란? 자가 균형 이진 탐색 트리의 일종으로, 이진탐색 트리를 가지고 있고, 노드의 삽입과 삭제를 할 때 전체 트리의 높이를 균형있게 제한하는 이진 탐색 트리이다. RB-Tree의 특징 RB-Tree의 가장 큰 특징은 각각의 노드가 색깔에 관한 정보를 갖는다는 점과, 규칙을 만족하지 않으면 케이스 별로 노드를 회전시키며 균형을 맞춘다는 점이다. (노드를 승격시키는 B트리와의 차별점) NIL 노드 NIL 노드란, 실제 데이터를 갖는 트리가 아닌, 리프노드 끝에 NULL 대신 NIL 노드를 선언해 해당 트리의 끝을 알린다. (NIL 노드를 사용하면 트리의 끝을 NULL 포인터로 처리하는 대신 트리의 모든 노드를 동일한 방식으로 처리할 수 있다. 이로 인해 코드의 일관성과 가독성이 향..
C, 키워드 포인터 주소값 모든 데이터는 해당 데이터를 담고 있는 주소값을 가지고 있다. 여기서 주소값이란 데이터가 저장되어 있는 메모리의 위치. 만약 int형 데이터를 선언한다면, 해당 시작 주소값으로부터 4byte만큼의 메모리 영역을 사용하게 된다. 포인터의 개념 여기서 해당 int 자료형의 첫번째 주소값을 가르키도록 선언할 수 있는데, 이것을 포인터라고 한다. int n = 100; // 변수의 선언 int *ptr = &n; // 포인터의 선언 포인터의 연산자 해당 데이터가 저장되어있는 첫번째 주소값은 주소연산자(&) 로 표현하고 이를 가르키는 포인터는 참조연산자(*)로 선언하게 된다. 여기서 주소 연산자 앰퍼샌드(ampersand)라고 부르며, 사용법은 위에 보이는 예시와 같이 변수 이름 앞에 ..
11723 집합 import sys input = sys.stdin.readline def add(S, x): x = int(x) S |= (1