728x90

Linux

  • 운영 체제 (Operating System)
    : 컴퓨터 하드웨어를 구동하고 사용자의 요청을 받아 여러가지 응용프로그램을 실행시키는 프로그램
  • Unix
    • 다중 사용자 및 다중 작업 운영체제 : 여러 사용자가 동시 로그인, 동시 작업 가능, 각각의 사용자는 독립적으로 작업 가능
    • 고수준 언어(c)로 작성된 최초의 운영체제
    • 최소한의 조정으로 다른 기계에 쉽게 이식
    • 서버에 특화
  • Linux
    • Unix에서 파생된 컴퓨터 운영 체제
    • 오픈 소스 기반 : 누구나 자유롭게 접근과 수정이 가능
    • 다양한 배포판 존재 : 사용자의 요구에 맞게 선택 가능 (ex. Ubuntu)
    • 다중 사용자 및 다중 작업 지원, 다중처리 시스템
    • 안정성과 보안
    • 안정적인 네트워크 지원
    • 다양한 응용프로그램 제공
  • Ubuntu
    • Linux 배포판 중 하나
    • 사용자 친화적인 환경 제공
    • 쉽게 설치 가능하며 다양한 그래픽 도구 사용 가능

리눅스 문법

  • 파일 권한 : ls -l 명령을 사용하여 확인 가능
    • 1 번째 자리 : -(파일), d(디렉토리)
    • 2~4 번째 자리 : 유저owner의 권한
    • 5~7 번째 자리 : 그룹group의 권한
    • 8~10 번째 자리 : 제3자other의 권한
    • 순서대로 r(read, 읽기), w(write, 쓰기), x(execute, 실행) 권한을 나타낸다
    • 예시 : -rwxr-xr-x (해당 파일은 유저에게 모든 권한 부여, 그룹과 제3자에게는 읽기와 실행 권한만 부여)
  • ls(list) : 해당 디렉토리에 있는 파일의 목록 나열
    • ls -l : 자세히 나열
    • ls -a : 숨겨진 파일을 포함한 나열
    • ls -al : 숨겨진 파일을 포함하여 자세히 나열
    • 숨겨진 파일 : 파일이름이 .으로 시작, 일반 파일 목록에선 보이지 않음
  • pwd (Print Working Directory) : 현재 디렉토리의 전체 경로 출력
  • cd (Change Directory) : 디렉토리 이동
    • ~ : 홈 디렉토리
    • . : 현재 디렉토리
    • .. : 상위 디렉토리
  • cat (concatenate) : 파일 내용 출력
  • vi : 새로운 문서 편집
  • file : 어떤 종류의 파일인지 출력
  • clear : 터미널 화면을 깨끗하게 지움
  • mkdir(make directory) : 새로운 디렉토리 생성, 생성된 디렉토리는 만든 사용자의 소유
  • rm (remove) : 파일이나 디렉토리 삭제
    • rm -i : 정말 지울지 확인하는 메시지가 출력됨
    • rm -f : 확인하지 않고 바로 삭제
    • rm -r : 디렉토리와 디렉토리 안 파일까지 모두 삭제
  • mv (move) : 파일이나 디렉토리 이동 또는 이름 변경
  • cp (copy) : 파일이나 디렉토리 복사
  • find : 특정 파일의 위치 검색
    • find -name : 파일 이름
    • find -user : 파일 소유자
    • find -perm : 파일 권한
    • find -size : 파일 크기 (b: 블록단위 / c : byte / k : kbyte / w : 워드)
    • find -group : 파일 그룹
  • id : uid, gid 등을 출력
  • whoami : 현재 사용자 이름 출력
  • touch : 크기가 0인 새 파일을 생성하거나 최종 수정 시간 변경
  • *(와일드카드) : 임의의 문자(열)에 대응시키기 위하여 사용하는 문자
  • |(파이프라인) : 한 데이터 처리 단계에 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조
  • grep [OPTION] [PATTERN] [FILE] : 파일 내에서 문자열 검색
    • OPTION : 출력
    • PATTERN : 검색할 문자열
    • FILE : 검색 대상 파일

리눅스 프로세스 메모리 구조 Linux Process Memory Layout

  • 프로세스의 메모리를 크게 5개의 세그먼트(Segment)로 구분
    • 세그먼트 : 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것
  • os가 각 용도에 맞게 적절한 권한을 부여할 수 있음 -> cpu가 메모리에 대한 권한이 부여된 행위만 할 수 있음

  • 코드 세그먼트 (Code Segment) : 실행 가능한 기계 코드가 위치하는 영역 (읽기, 실행 권한)
  • 데이터 세그먼트 (Data Segment) : 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역 (읽기 권한)
    • 쓰기가 가능한 세그먼트 (=data segment) : 값이 변할 수 있는 데이터 (ex. 전역 변수)
    • 쓰기가 불가능한 세그먼트 (=rodata segment) : 값이 변할 수 없는 데이터 (ex. 전역 상수)
  • BSS 세그먼트 (BSS Segment) : 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 영역 (읽기, 쓰기 권한)
  • 스택 세그먼트 (Stack Segment) : 프로세스의 스택이 위치하는 영역, 실행 중에 동적으로 할당되어 임시 변수들이 저장됨 (읽기, 쓰기 권한)
  • 힙 세그먼트 (Heap Segment) : 힙 데이터가 위치하는 영역, 실행 중에 동적으로 할당 (읽기, 쓰기 권한)

SSH

  • shell : 사용자가 글자를 입력하여 컴퓨터에 명령할 수 있도록 하는 프로그림
  • SSH (Secure Shell) : 네트워크 상 다른 컴퓨터의 쉘을 사용할 수 있게 해주는 프로토콜, 강력한 보안 제공
  • PuTTY : windows를 위한 무료 SSH
728x90

컴퓨터 구조

: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 구성하는 방법

 

컴퓨터의 기능 구조에 대한 설계

: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야 ex) 폰 노이만 구조, 하버드 구조, 수정된 비트 구조 등

  • 폰 노이만 구조
    : 컴퓨터 핵심 기능(연산, 제어, 저장)이 필요하다 생각
    • 중앙처리장치 (CPU) - 연산, 제어
      : 프로그램 연산 처리 및 시스템 관리. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 모든 과정 수행
      • 구성
        1. 산술논리장치 (ALU, Arithmetic Logic Unit) : 산술/논리 연산 처리
        2. 제어장치 (Control Unit) : CPU 제어
        3. 레지스터 (Register) : CPU에 필요한 데이터 저장
    • 기억장치 (Memory) - 저장
      : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용
      1. 주기억장치 : 프로그램 실행 과정에서 필요한 데이터 임시 저장
        ex) 램 (RAM, Random-Access Memory)
      2. 보조기억장치 : 운영체제, 프로그램 등과 같은 데이터 장기간 보관
        ex) 하드 드라이브 (HDD, Hard Disk Drive), SSD (Solid State Drive)
    • 버스 (Bus) - 장치 간 데이터 or 제어 신호 교환
      : 컴퓨터 부품 간 또는 컴퓨터 간 신호 전송 통로
      • 데이터 버스 (Data Bus) : 데이터 이동
      • 주소 버스 (Address Bus) : 주소 지정
      • 제어 버스 (Control Bus) : 읽기/쓰기 제어
      • 랜선이나 데이터 전송 소프트웨어, 프로토콜 등을 포함

 

CPU 기능에 대한 설계

: 명령어 집합구조 (Instruction Set Architecture). CPU가 처리해야 하는 명령어를 설계하는 분야
ex) ARM, MIPS, AVR, 인텔의 x86-64 등

  • 명령어 집합구조 (ISA, Instruction Set Architecture) = CPU 설계도
    : 어떤 구조의 메모리와 호환이 가능한지 명시.
    프로그램 실행 시 기계어 명령어들을 CPU가 읽기 및 처리.
    명령어 집합 / 레지스터 집합 / 메모리 구조 정의
    ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재.
    • Intel x86-64 아키텍처 ( =x64, AMD64, Intel 64)
      : 인텔의 64비트 CPU 아키텍처
      인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에 사용할 수 있도록 확장
      32비트 모델보다 훨씬 더 많은 양의 가상 메모리와 물리적 메모리 지원 → 더 많은 양의 데이터 저장 가능
      • n비트 아키텍처
        → n : CPU가 한번에 처리할 수 있는 데이터 크기
        → WORD : CPU가 이해할 수 있는 데이터 단위 

      • Intel x64의 레지스터
        • 레지스터 : CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용
        1. 범용 레지스터 (General Register) : 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터
        2. 세그먼트 레지스터 (Segment Register) : cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터 존재
        3. 명령어 포인터 레지스터 (IP, Instruction Pointer Register) : 프로그램을 구성하는 기계어 코드들 중 CPU가 어느 부분의 코드를 시행할지 가리킴
        4. 플래그 레지스터 (Flag Register) : 프로세서의 현재 상태를 저장하고 있는 레지스터

CPU의 하드웨어적 설계

: 마이크로 아키텍쳐(Micro Architecture). 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

 


 

자료구조(Data Structure)

: 여러 데이터들의 묶음을 저장하고, 사용하는 방법을 정의한 것. 데이터의 효율적인 관리 및 사용을 위해 필요.

 

데이터(Data) : 문자, 숫자, 소리, 그림, 영상 등 실생활을 구성하고 있는 모든 값으로 그 자체만으로 어떤 정보를 가지기 힘듦

자료구조의 종류

  1. 단순 구조 : 자료 값 사용을 위해 컴퓨터가 기본적으로 제공하는 자료형 ex) 2진수, 정수, 실수, 문자, 문자열
  2. 선형 구조 : 자료를 구성하는 데이터를 순차적으로 나열시킨 형태로 자료들 간의 관계가 1:1인 자료 ex) 배열, 연결 리스트, 텍, 스택, 큐
  3. 비선형 구조 : 하나의 자료 뒤에 여러 개의 자료가 존재할 수 있는 것 ex) 그래프, 트리
  4. 파일 구조 : 서로 관련 있는 필드로 구성된 레코드 집합인 파일에 대한 자료구조. 보조 기억 장치에 데이터가 실제로 기록되는 형태로 메모리에 한 번에 올릴 수 없는 대용량을 다룸. ex) 순차 파일, 색인 파일, 직접 파일

선형자료구조

  • 스택 (Stack)
    : 데이터 삽입과 추출이 한쪽방향만 가능한 구조 (stack = 쌓다, 한쪽만 뚫림)
    • 푸시 (push) : 스택에 데이터를 넣는 작업
    • 팝 (pop) : 스택에서 데이터를 꺼내는 작업
    • Top : 스택의 가장 윗부분
    • Bottom : 스택에 가장 아랫부분
    • 후입선출 (LIFO, Last In First Out) 방식
  • 큐 (Queue)
    : 데이터 삽입과 추출이 양방향으로 가능한 구조 (양쪽 모두 뚫림)
    • 선입선출(FIFO, First In First Out) 방식
  • 리스트 (List)
    : 선형리스트. 항목 간의 순서를 정한 데이터가 나열된 자료구조. 구현 방법에 따라 순차 리스트와 연결 리스트로 구분.
    • 순차 리스트 (Array List)
      : 순차적인 메모리 공간을 할당하여 구현하는 리스트로 보통 배열로 구현
    • 연결 리스트 (Linked List)
      : 데이터가 불연속 공간에 흩어져 있는 상태에서 다음 데이터의 위치 정보를 보유하게 하는 자료구조로 메모리 동적 할당 기법을 이용하여 구현
      • 다른 여러 자료구조 (스택, 큐, 트리, 그래프) 구현시 활용

비선형자료구조

  • 트리 (Tree)  
    : 계층적인 구조를 나타냄. 하나의 루트 노드를 가지고 있으며, 각 노드는 0개 이상의 자식 노드를 가질 수 있음.
    • 노드(Node) : 트리의 기본 단위, 데이터를 저장하는 요소
    • 루트(Root) : 트리의 맨 위에 있는 노드
    • 부모(Parent) : 다른 하나 이상의 노드(자식 노드) 가리키는 노드
    • 자식(Child) : 부모 노드가 가리키는 노드
    • 조상(Ancestor) : 특정 노드에서 루트까지 이어지는 경로 상의 모든 노드
    • 자손(Descendant) : 특정 노드에서 아래 쪽으로 이어지는 모든 노드
    • 형제(Sibling) : 같은 부모 노드를 가진 자식 노드들
    • 잎(Leaf) : 자식 노드를 가지지 않는 노드, 트리의 가장 하위에 위치
    • 서브트리(Subtree) : 특정 노드와 그 하위 자손들로 이루어진 부분 트리

알고리즘

정렬 알고리즘

: 목록 안에 저장된 요소들을 특정한 순서대로 재배치하는 알고리즘. 입력 데이터는 보통 배열과 같은 데이터 구조.

  • 선택정렬 (Selection Sort) : 선택된 값과 나머지 데이터 중에 비교하여 알맞은 자리를 찾는 알고리즘 (안전성 보장되지 않음)
  • 삽입정렬 (Insertion Sort) : 데이터 집합을 순회하면서 정렬이 필요한 요소를 뽑아내어 이를 다시 적당한 곳으로 삽입하는 알고리즘 (버블정렬보다 좋은 성능)
  • 버블정렬 (Bubble Sort) : 인접한 두 수 를 비교하여 오름차순/내림차순으로 정렬하는 알고리즘 (안전성 보장되지 않음)
  • 병합정렬 (Merge Sort) : 둘 이상의 부분 집합으로 가르고, 각 부분 집합을 정렬한 다음 부분 집합들을 다시 정렬된 형태로 합치는 알고리즘 (분할정복법(Divide and Conquer), 안전성 보장됨)
  • 힙 정렬 (Heap Sort) : 트리 기반으로 최대 힙 트리/최소 힙 트리를 구성해 정렬하는 알고리즘 (안전성 보장되지 않음, 내림차순 정렬-최대 힙, 오름차순 정렬-최소 힙)
  • 퀵 정렬 (Quick Sort) : 데이터 집합 내에 임의의 기준(pivot) 값을 정하고 해당 피봇으로 집합을 두 개의 부분 집합(pivot보다 큰 부분과 작은 부분)으로 나누어 정렬하는 알고리즘 (안전성이 보장되지 않음)

 

728x90

기초

  • c 언어 : 컴퓨터 프로그래밍 언어 중 하나, 절차지향 언어(위에서 아래로만 컴파일 진행됨)
  • 헤더파일 : c언어의 문법을 가진 프로그램으로 코드의 맨처음에 불러와야 함. #include <헤더파일 이름> (ex. #include <stdio.h>)와 같이 불러옴.
  • 세미콜론 (;) : 문장 하나가 끝날 때 입력해줘야 함.
  • 주석 : 설명을 달 때 사용. //(한 줄), /* */(여러 줄).
  • 변수 선언 : (변수형) (변수이름) 형식 (ex. int a, float b)으로 선언.
    • int : 정수, unsigned int : 자연수, float : 실수, char : 문자 한 개, string : 문자열, double, long : 큰 실수
  • 매크로 상수 : #define (매크로 상수 이름) (숫자) 형식. 상수를 정의.

 

 

 입출력

  • printf( ) : 화면에 수나 문자를 출력하는 함수. printf(”출력할 내용”); , printf(”변환문자”, 변수); 형식으로 사용.
    • 변환 문자 : %d (int, 정수), %f (float, 실수 소수점 아래 6자리), %g (float, 실수 소수점 아래 1자리), %c (char, 문자 1개), %s (string, 문자열)
    • 기호 문자 : \n (줄바꿈), \t (tab) 등
  • scanf( ) : 변수에 값을 입력하는 함수. scanf(”변환문자”, &변수); 형식으로 사용.
  • cast 연산자 : 변수형을 임시로 변환하는 함수. (ex. printf(”%c”, (char)a); → int형의 변수 a를 char형으로 임시 변환)

 

 

조건문

  • 조건식
    • 1 : 조건식이 참, 0 : 조건식이 거짓
    • == (같다), != (다르다), <,>,<=,>= (부등호)
    • (조건식)&&(조건식) : and, 두 조건식 모두 만족하면 참
    • (조건식)||(조건식) : or, 두 조건식 중 하나라도 만족하면 참
    • !(조건식) : not, 참이면 거짓, 거짓이면
  • 조건 연산자 : (조건식) ? (참일 때) : (거짓일 때)
  • if 문
    • 형식 :
    • if (조건식) { 실행문; }
    • 실행 : 조건식이 참일 때 실행문으로 수행하고 거짓이면 다음으로 넘어감.
    • if - else 문 : if 문의 조건식이 거짓이면 else 문이 실행.
    • if - else if - else 문 : else if 문의 수는 제한이 없음. 여러개의 조건문을 위에서부터 읽어가며 가장 먼저 참이 되는 블록이 실행. 모든 조건식이 거짓인 경우 else 문이 실행.
  • switch-case 문
    • 형식 :
    • switch (판단할 변수) { case 숫자 : 실행문 ; break; default: 실행문; }
    • 실행 : 판단할 변수의 값이 n일 경우 case n의 실행문을 수행함. 해당하는 case가 없다면 default의 실행문을 수행함.
  • 반복문
    • for 문
      • 형식 :
      • for ( 초기화식; 조건식; 증감식 ){ 실행문; }
      • 실행 : 조건식이 참일 때 실행한 후 증감식을 실행하고 다시 조건식 평가, 거짓이 되면 종료.
    • while 문
      • 형식:
      • while (조건식) { 실행문; }
      • 실행 : 조건식이 참이면 실행문을 수행하고 다시 조건식 평가, 거짓이 되면 종료.
    • do-while 문
      • 형식 :
      • do { 실행문 ; } while (조건식) ;
      • 실행 : 실행문을 수행한 후 조건식 평가. 참이면 조건식을 수행하고, 거짓이 되면 종료.
    • break : break를 만나면 반복문에서 빠져나감.
    • continue : continue를 만나면 이하 실행문은 수행되지 않고 반복문의 처음으로 돌아감.

 

 

배열

  • 여러 개의 변수를 한꺼번에 선언
  • 형식 : 자료형 변수이름[갯수];
  • int, float 배열은 중괄호를 써서 변수의 값을 정함, {0, }을 쓰면 변수들이 0으로 초기화됨. char 배열은 “…” 형식으로 선언 가능.
  • 다차원 배열 : 2차원 - 자료형 변수이름[가로][세로], 3차원 - 자료형 변수이름[가로][세로][높이]
  • char 배열 (문자열 배열)
    • 배열의 마지막 값으로 반드시 NULL 값을 배정해줘야함
    • gets(), puts()
    • string.h
      • strcpy(char* s1, const char* s2) : s1에 s2의 모든 원소를 복사함
      • strcat(char* s1, const char* s2) : s1에 s2를 이어붙임
      • strchr(const char* s, int c) : s 배열에서 c라는 특정문자를 찾음
      • strlen(const char* s) : s 배열에서 NULL을 제외한 길이를 셈

 

 

함수

  • 형식 : 반환형 함수이름 (매개변수) { … }
  • 함수 반환형 : int (반환값이 정수형), void (반환값이 없음) 등
  • 함수 정의 : 함수를 실제 코드로 만드는 것
  • 함수 선언 : 어떤 함수를 만들어서 쓸 것이라고 미리 컴파일러에 정보를 주는 것
  • 매개변수 : 함수가 처리할 데이터를 저장하는 변수. 배열도 입력가능. (배열의 길이 비워둠. 다차원의 경우 첫 번째만 비워둠)
  • 재귀함수 : 함수 안에서 자신을 호출하는 함수

 

 

포인터

  • 메모리 주소를 저장하는 변수, 다른 변수의 메모리 주소를 저장하고 해당 변수에 대한 간접적인 접근을 제공
  • 형식 : 데이터형태* 포인터이름 (ex. int* ptr, char* str)
  • 동적 메모리 할당, 함수 호출, 배열 등 다양한 용도로 사용
  • 포인터 연산자 : * (역참조), & (주소 연산자)

 

 

구조체

  • 서로 다른 데이터 형식을 포함하는 사용자 정의 데이터 형식. 하나의 구조체 변수 안에 여러 데이터를 그룹화하여 관리.
  • 형식: struct 구조체 이름 { 자료형 변수명; 자료형 변수명; }
  • 구조체 멤버 접근 : . 연산자를 사용
  • 구조체 변수는 단일 변수처럼 전달, 함수의 인수로 전달되거나 반환될 수 있음

 


포인터랑 구조체는 다음에 자세히 정리하는 것으로-!

+ Recent posts