분류 전체보기 779

[ Linux Kernel ] 00. 리눅스커널과 운영체제

LINUX 커널 리눅스 커널을 한 사람이 전부 아는 것은 불가능하다. 커널 관련 두터운원서를 75~80권 정도는 읽어야 "아, 한 번씩은 훑어봤다"라고 말할 수 있을 정도다. IBM같은 대형회사에서도 리눅스를 다루는 사람만 250명 정도 있다고 한다. 250명의 사람이 방대한 커널에서 각자 분야를 맡아서 일을 처리한다. 따라서 "모든걸 다 알아야지~!"라는 마음가짐 보다는 "커널과 운영체제가 어떤식으로 동작하는지 개략적으로 이해해보자"라는 수준의 마음가짐으로 임할것이다. 1. 운영체제란? 운영체제(Operating System)이란 하드웨어 자원들(cpu, memory, disk, tty)을 관리하고 프로그램들을 지원(support)해주는 것이다. (아래 그림을 살펴보면 Operating System의 ..

[ C ] 15. 공용체

[ 공용체 ] 공용체는 구조체와 정의 방법이 같지만 멤버를 저장하는 방식이 다르다. 즉, 다음과 같이 멤버들이 각각 공간을 차지하지만 공용체는 모든 멤버가 공간을 공유한다. 즉, 공용체는 멤버 중에서 가장 큰 자료형의 공간을 공유한다. 현실에서 예를 들자면 물건이 하나 들어있는 선물상자와 비슷하다. 같은 크기의 상자지만 들어있는 물건의 종류가 다른 것 처럼. 공용체 만들고 사용하기 union 공용체이름{ 자료형 멤버이름; }; 공용체는 정의만 해서 사용할 수 없고 따로 변수로 선언해서 사용해야한다. #define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include #inlcude // strcpy 함수 union Box{ short candy;..

[ 기타 ] 02. 마크다운(markdwon) 문법 알아보자

git을 활용하고 개발하는 사람들이라면 마크다운 다들 많이 이용하실텐데요~ 오늘은 마크다운 작성법과 문법에 대해서 알아보겠습니다~ 저는 typora를 사용 하고 있어요 마크다운 기초 1. 제목(Heading) 제목은 # 으로 표시된다. 제목 레벨은 6단계 까지 있다. h3 제목 h4 제목 h5 제목 h6제목 2.목록 순서가 있는 목록 순서가 있는 목록 enter+tab을 통해 레벨 다운 순서가 없는 목록 순서가 없는 목록 여기에서 shift + tab 여기에서 엔터 여기 여기 결국여기. 3.링크 마크다운 설명서 4.이미지 typora의 가장 큰장점ㅎ(이미지를 그냥 올리면 ㅇㅋ) typora에서 이미지를 편하게 활용하기 위해서는 추가 설정이 필요하다. 아래의 옵션을 모두 체크 로컬 이미지에 해당 규칙 온라..

IT/[ 기타 ] 2020.08.14

[ 기타 ] 01. 제안서 작성하기

제안서 작성하기 제안 개요 제안 배경 제안 목적 수행 방안 구성 아키텍처 개발 방안 데모 화면(예) 수행 일정 기타 RFP에 기재된 기능 하나하나를 어떻게 개발할 것인지를 세부적으로 명시. 자유양식 모듈별로 세분화하여 일정을 세운 뒤 전체 일정을 수립 배경 : 다른 경쟁 업체들을 조사하기. U+(홈네트워크), 현대기아(커넥티드카) => 우리는 이렇게 더 발전할 것이다. 유의 사항 쉽게 작성한다. (Simple is Best) - 전문용어를 최소화 전체 목차 구조를 의식. 프레임읆 맞출 것 RFP 요구사항은 모두 기술 요구사항이 누락된다면 심사과정에서 큰 불이익을 받는다. 차별화 포인트가 있다면 적극 표현. 주의!!! 동문서답은 NO~

IT/[ 기타 ] 2020.08.14

[ Network ] 03. CAN통신에 관하여

CAN통신이란? Controller Area Network 개요 1985년 벤츠의 의뢰로 Bosch사에서 차량 네트워크용으로 최초로 개발 1980년대까지 자동차는 대부분 기계식 기술의 발전으로 자동차에 다양한 모듈(ECU)들이 생기기 시작 UART의 통신은 각 모듈이 1:1통신을 해서 모듈이 추가될 때마다 더 많은 연결선이 필요 CAN통신은 자동차 내부 전장 및 산업용 제어기에 많이 사용 된다. 노이즈에 강하고 프레임을 하드웨어적으로 처리하므로 스프퉤어 처리가 비교적 단순하다 특징 Multi-Master 구조 통신 신호 충돌 대책이 있음(CSMA/CA) 메시지 ID간 우선 순위가 있다 데이터 송신 충돌 정지 시, 선로가 비어 있을때 자동 재 전송 기능 통신 속도 : 최대 1MBPS 까지 통신 가능 통신 ..

[ 개념 ] 04. Locality 관점에서 Quick Sort가 Merge Sort보다 빠른 이유

> Locality의 관점에서 Quick sort가 Merge sort보다 빠른이유 Quick sort와 Merge sort는 nlogn의 시간복잡도를 가지는 대표적인 정렬 방법이다. 일반적으로 Quick sort가 Merge sort보다 크다. 그 이유는 Locality와 관련이 있다. Locality의 개념을 알아보고 왜 Quick sort가 더 빠른지 알아보도록 하자. Locality 지역성(Locality)은 CPU가 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복적으로 엑세스하는 경향을 말한다. 메모리 내의 정보를 균일하게 엑세스 하는게 아닌, 짧은 시간내에 특정 부분을 집중적으로 참조하는 특성이다. void f() { //간단한 작업을 수행 } void g() { int arr[1000]..

[ 개념 ] 03. Tail Call Recursion

> Tail Call Recursion C++ 제가 이번에 설명할 것은 제가 검색하다가 발견한! Tail Call Recursion 이라는 새로운 재귀?적인 방법의 코딩입니다. 기존의 재귀함수와 비교하면서 설명하도록 하겠습니다. 1. 기존의 재귀함수 먼저 기존의 재귀함수를 보도록합니다. 여기서는 가장 대표적인 피보나치 수열을 이용한 재귀함수를 살펴보겠습니다. #include using namespace std; int f(int n){ if(n < 0) return 0; if(n < 2) return n; return f(n-1) + f(n-2); } int main(void){ cout

[ 개념 ] 02. 이진트리에 관하여

> 이진트리 1. 후위 순회(postorder) 이진 트리(binary tree)의 후위 순회 알고리즘이 사용될 수 있는 대표적인 예는 특정 디렉토리(directory)의 용량 계산이다. 단, 이진 트리이기 때문에 특정 디렉토리(=폴더)의 서브 디렉토리의 개수는 2개 이하로만 존재해야 한다. 삼진 트리(ternary tree)였다면 서브 디렉토리는 총 3개까지 존재할 수 있다. 1.1 디렉토리의 용량 계산 디렉토리의 용량 계산을 위해서는 어떤 알고리즘이 사용되야하는가를 먼저 고민해보자. 생각을 할 때 구체적인 상황을 두고 예시를 들어보면 이해가 빠르다. 현재 사용하는 컴퓨터에 datastructure 라는 디렉토리가 있다고 가정해보자. 이 datastructure 디렉토리 내부에는 stack, queue..

[ 개념 ] 01. N-gram과 두 점 사이의 거리 구하기

> N-gram 빅데이터 분석, 검색 엔진에서 많이 쓰인다. 구글은 책들을 스캔해서 N-gram viewer를 만들었는데 사람들의 언어 패턴을 시대별로 분석하기도 함. N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법. 만약 "hello"라는 문자열을 2-gram으로 추출하면 He, el, ll, lo 글자 단위 N-gram( 2gram ) #include #include int main(){ char text[30] = "Hello"; int length; length = strlen(text); for (int i=0; i

[ 개념 ] 00. 회문판별

> 회문판별 회문은 유전자 염기서열 분석에서 많이 쓰인다 회문(palindrome)은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 말한다. #define _CRT_SECURE_NO_WARNINGS #include #include #include int main(){ char word[30]; // 단어 저장 배열 int length; // 문자열 길이 bool isPalindrome = true; // 회문 판별값을 저장할 변수, 초깃값 TRUE printf("단어 입력하세요: "); scanf("%s", word); length = strlen(word); // 0부터 문자열 길이의 절반만큼 반복 for(int i=0; i

[ Network ] 02. I2C통신에 관하여

이 글은 I2C에 대한 전반적인 설명과 I2C 통신을 GPIO를 이용하여 코드로 구현한 것이므로 매우 긴글임을 주의** I2C란? 1. alc5633q가 무엇이냐? I2C + I2S Stereo Audio Codec 기능을 가지고 있는 반도체 부품 중의 하나. 2. I2C는 무엇이냐? I2C(Inter-Intergrated Circuit, 또는 TWI - Two Wire Interface)는 복수 개의 슬레이브 장치가 복수개의 마스터 장치와 통신하기 위한 프로토콜이다. SPI와 마찬가지로 하나의 완성품을 구성하는 요소들 간의 근거리 통신을 위해 고안되었음. 비동기식 시리얼통신(이하 UART)은 클럭을 맞춰줘야 하고 데이터 라인으로 들어오는 신호를 항상 주시해야 하기 때문에 오버헤드가 있으며 하드웨어가 복..

[ C ] 14. goto에 관하여

[ goto에 관해 ] goto는 별다른 제약 조건 없이 원하는 부분으로 이동할 수 있기 때문에 초보 때는 goto를 남발하는 경우가 많다. 그러다 보니 처음에는 goto는 가급적 사용하지 말라고 한다. 하지만 goto를 적절히 활용하면 중복되는 코드를 없애고 코드를 좀 더 간결히 만들 수 있을 것이다. 특히 에러처리에 매우 유용하기 때문에 리눅스커널에서도 자주 쓰이며 for, switch 등 중첩 반복문에 많이 쓰이는 것을 알아두자. # 스파게티 코드 스파게티 코드는 `goto`를 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여있다는데서 붙여진 이름이다. 그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘들다. goto와 레이블 #define _CRT_SECURE_NO_WARN..

[ C ] 13. 함수 포인터 배열 활용하기

[ 함수 포인터 배열 활용 ] 함수 포인터 배열 사용하기 #define _CRT_SECURE_NO_WARNINGS #include int add(int a, int b){ return a + b; } int sub(int a, int b){ return a - b; } int mul(int a, int b){ return a * b; } int div(int a, int b){ return a / b; } int main(){ int funcNumber; // 함수 번호 int num1, num2; int (*fp)(int, int) = NULL; // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 선언 printf("함수 번호와 계산할 값을 입력하세요: "); scanf("%d %d %..

[ C ] 12. 함수와 가변인자

[ 함수와 가변인자 ] printf, scanf와 같이 매개변수의 개수가 정해지지 않은 개수가 있다. 이렇게 매번 함수에 들어가는 인수(argument)의 개수가 변하는 것을 가변 인자(가변 인수, variable argument)라고 한다. 함수에서 가변인자를 정의할 때는 고정 매개변수가 한 개 이상 있어야 하며 고정 매개변수 뒤에 ...을 붙여 매개변수의 개수가 정해지지않았다는 표시를 해준다. 단, ...뒤에는 다른 매개변수를 지정할 수 없다. 반환값 자료형 함수이름(자료형 고정매개변수, ...){ } #include // args는 고정 매개변수 void printNumbers(int args, ...){ printf("%d ", args); } int main(){ printNumbers(1, 1..

[ C ] 11. 함수와 배열

[ 함수와 배열 ] 함수에서 배열을 매개변수로 사용하면 연속된 값을 전달할 수 있꼬, 전달한 배열의 요소를 함수 안에서 변경할 수 있다. 1차원배열 매개변수 함수에서 배열을 매개변수로 사용하려면 ( )(괄호)안에서 매개변수 이름 뒤에 [ ](대괄호)를 붙이거나 매개변수를 포인터로 지정해줍니다. 대괄호를 포인터로 지정하기 반환값자료형 함수이름(자료형 매개변수[]){ } 반환값자료형 함수이름(자료형 *매개변수){ } #include void printArray(int arr[], int count){ // 배열의 포인터와 개수를 받음 for(int i=0; i