목록분류 전체보기 (111)
yoongrammer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOhMqd/btqU4A6PJ2R/fBehIM1X4YZmXJ4aDrfXdk/img.png)
목차스레드(Thread) 알아보기스레드(Thread)란 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있습니다.이러한 실행 방식을 멀티스레드(multi-thread)라고 합니다.그림을 보면 스레드는 자신만의 고유한 스레드 ID, 프로그램 카운터(PC), 레지스터 집합, 스택을 가지고 코드 , 데이터 및 OS 리소스(예 : 열린 파일 및 신호)는 프로세스 내의 다른 스레드와 공유합니다. 스레드마다 고유한 자원(PC, 레지스터 집합, 스택)을 가지고 있는 이유는 독립적인 함수 호출을 가능하게 하여 독립적인 실행 흐름을 추가하기 위해서입니다. 프로세스 vs 스레드 주요 차이점프로세스와 스레드..
목차 큐(Queue) 구현하기 in Go 큐는 선입 선출 (FIFO) 원리를 따라 정렬된 데이터 구조입니다. golang에서 Slice를 사용하면 쉽게 큐를 구현할 수 있습니다. built-in 함수인 append를 사용하여 enqueue를 구현합니다. 배열의 첫 번째 요소를 잘라내는 방식으로 dequeue를 구현합니다. 구현 package main import "fmt" type Queue []interface{} //IsEmpty - 큐가 비어있는지 확인하는 함수. func (q *Queue) IsEmpty() bool { return len(*q) == 0 } //Enqueue - 큐에 값을 추가하는 함수. func (q *Queue) Enqueue (data interface{}) { *q = a..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cmulEL/btqUtV5vwgu/5VQXzE8HpuWiTTearkJyK1/img.png)
문맥 교환 (Context switch) 알아보기 문맥(context)은 프로세스의 상태 정보를 의미합니다. 문맥 교환(context switch)은 프로세스의 상태 정보를 교환하는 작업입니다. 자세히 설명하자면 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스의 상태를 PCB에 보관하고 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정입니다. 문맥 교환은 멀티태스킹(=멀티프로세싱)이 가능하도록 해줍니다. 멀티태스킹 : 다수의 프로세스가 하나의 CPU 자원을 나누어 사용하는 것 하나의 CPU에서 여러 개의 프로세스가 동시에 수행되는 것처럼 보이는 이유는 문맥 교환이 빠르게 일어나고 있기 때문입니다. 문맥 교환 중에는 다른 작업을..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tIPDr/btqUnKRlmuB/DJIs4kFAwQE5ySaiJz25Kk/img.png)
프로세스 제어 블록 (PCB: Process Control Block) 알아보기 PCB(Process Control Bolock)는 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 자료구조입니다. 운영체제에서 프로세스는 PCB로 표현됩니다. 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB도 함께 제거됩니다. CB는 프로세스 상태 관리와 문맥 교환(Context switch)을 위해서 필요합니다. 운영체제에 따라 PCB에 포함되는 항목이 다를 수 있지만, 일반적으로 다음과 같은 정보가 포함되어 있습니다. 포인터 프로세스의 현재 위치를 저장하는 포인터 정보입니다. 프로세스 상태 프로세스의 각 상태 (생성(New), 준비(Ready..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CixF9/btqUeiAiCDc/eTwjkrBKVnFhsNCAHYGw10/img.png)
목차프로세스 알아보기 (메모리 구조, 상태 전이)프로그램 (Program)프로그램은 작업을 수행하기 위해 컴퓨터에 제공되는 일련의 명령어들의 모음입니다.프로그램은 보조기억장치(디스크)에 저장되어 있고 엑셀, 메모장 같은 실행파일일 수 있으며 컴파일된 결과물뿐만 아니라, 프로그래머가 작성한 소스코드까지도 포함됩니다. 다음은 C 언어로 작성된 간단한 프로그램입니다.void main() { printf("Hello\n");}프로세스 (Process)프로세스는 실행 중에 있는 프로그램을 의미하며, 작업(Job) 또는 태스크(Task)라고도 합니다.프로그램이 메모리에 적재(Load)되는 순간 프로세스가 됩니다.프로세서(Processor)프로세스가 동작될 수 있도록 하는 하드웨어(=CPU)입니다.- 동작: 프로그..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTPXIF/btqT90ej6eR/QjxFkymPTGSoqCuVktkthk/img.png)
목차Raft Consensus Algorithm 알아보기Raft는 이해하기 쉽도록 설계된 분산 합의 알고리즘입니다.여러 서버들 중 일부 서버에 장애가 발생하더라도 기능을 유지하도록 하는 내결함성을 가지고 있습니다.분산 합의(Distributed Consensus)란?하나의 클라이언트와 서버가 있고 클라이언트가 서버에게 데이터를 전달한다고 가정해보겠습니다. 서버는 하나의 노드로 이루어져 있기 때문에 합의가 이루어지는 건 아주 쉬운 문제입니다.여기서 합의란 클라이언트와 서버가 동일한 데이터를 공유하는 상태(동기화)가 되는 것을 의미합니다.만일 위 그림처럼 여러 노드로 이루어진 분산 서버에서 합의를 할 때 발생하는 문제를 distributed consensus problem이라고 합니다.Raft 작동방식Raf..
목차 스택(Stack) 구현하기 in Go 스택은 후입 선출 (LIFO) 원리를 따라 정렬된 데이터 구조입니다. golang에서 Slice를 사용하면 쉽게 스택을 구현할 수 있습니다. built-in 함수인 append를 사용하여 push를 구현합니다. 배열의 마지막 요소를 잘라내는 방식으로 pop을 구현합니다. 구현 Go 언어로 구현하면 다음과 같습니다. package main import "fmt" type Stack []interface{} //IsEmpty - 스택이 비어있는지 확인하는 함수 func (s *Stack) IsEmpty() bool { return len(*s) == 0 } //Push - 스택에 값을 추가하는 함수. func (s *Stack) Push(data interface{..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/YtUPQ/btqTp4a1KVt/4PVDDPsKZKe8hqFaL0DTmK/img.png)
목차스택(Stack) 구현하기 in C스택 자료형을 구현하는 방법은 일반적으로 다음 방법들을 사용합니다.배열 기반으로 구현동적 배열을 기반으로 구현연결 리스트로 구현배열 기반으로 구현배열을 사용하여 스택을 구현하는 방법입니다.배열 index를 추적하는 top변수를 사용합니다.top은 -1로 초기화합니다.top이 -1이라면 스택이 비어있다는 의미이고 배열 크기-1이라면 스택이 가득 찼다는 의미입니다.push연산은 top을 1 증가시키고 값을 top위치에 저장하도록 구현합니다.pop연산은 top을 1 감소시키도록 구현합니다. C 언어로 구현하면 다음과 같습니다.#include #include #include typedef struct ArrayStack { int top; int capacity; in..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/UZ5W8/btqS6XDWUzf/Lg829QU64irK0OfYgMbKZk/img.jpg)
목차 [Go] go get 알아보기 go get 명령어는 패키지 및 관련 종속성(dependency)을 다운로드 및 설치하는 명령어입니다. 패키지는 $GOPATH/src/ 경로에 저장됩니다. Usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] -d : 설치는 하지 않고 소스 파일만 다운로드합니다. -u : 패키지 및 해당 종속성을 업데이트합니다. -t : 패키지에 대한 테스트를 빌드하는 데 필요한 패키지도 다운로드합니다. -v : 진행 및 디버그 출력 자세한 옵션 설명은 go help get을 통해 확인할 수 있습니다. go get 사용하기 예를 통해 알아보도록 하겠습니다. 사전 작업 github에 있는 pl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/5NOv1/btqSTINnoq8/4f8bjzzf6W4POewlq8At31/img.png)
목차[자료구조] 큐 (Queue)큐는 먼저 집어넣은 데이터가 먼저 나오는 FIFO (First In First Out) 구조로 저장하는 선형 자료구조입니다.실제 예로 매표소 대기열에서 먼저 줄을 선 사람이 먼저 나갈 수 있는 상황과 비슷합니다. 나중에 집어넣은 데이터가 먼저 나오는 스택(Stack)과는 반대되는 개념입니다.큐 표현큐는 FIFO(First In First Out) / LILO(Last In Last Out) 순서를 따릅니다.FIFO : 처음 들어온 값이 처음에 나가는 것LILO : 마지막에 들어온 값이 마지막에 나가는 것큐에 끝(Rear)에서 요소를 추가하는 작업을 enqueue라고 하며 큐에 맨 앞(Front)에서 요소를 제거하는 작업을 dequeue라고 합니다. 가득 찬 큐에 요소를 추..