1. 리눅스 환경에서의 프로세스

- ps 명령어: 현재 시스템에서 실행 중인 프로세스에 관한 정보를 출력하여 사용자에게 제공

- PID: 프로세스 고유식별자

- PPID: 부모 프로세스의 PID

 

2. C언어 프로세스 ID 구하기 함수

- getpid(): 실행중인 프로세스 ID를 구함

- getppid(): 부모 프로세스의 ID를 구함

 

3. 프로세스 생성(Process Creation)

- 부모 프로세스가 연산을 통해 자식 프로세스를 만들어냄

- 생성된 자식 프로세스 또한 새로운 자식 프로세스를 만들 수 있음

- 고유의 PID를 가지게 됨

- fork(): 새로운 프로세스를 생성하는 시스템콜

- exec(): 이진 파일을 메모리에 적재하고 그 프로그램을 실행하는 시스템콜

- wait(): 자식 프로세스가 종료할 때까지 기다리는 시스템콜

- exit(): 운영체제에게 자신의 삭제를 요청하고 종료하는 시스템콜

 

4. exec 계열 함수

- 현재 실행되고 있는 프로세스를 다른 프로세스로 대신하여 새로운 프로세스를 실행하는 함수

- 현재의 프로세스 이미지를 새로운 프로세스 이미지로 덮어씀

 

5. Copy On Write(COW)

- 자식 프로세스 생성시 발생하는 메모리 복사 비용을 줄이기 위한 기법

- 작성시 이전의 내용을 Copy한다는 뜻

- 프로세스가 copy on write 메모리 영역에 접근하게 되면 그 영역을 먼저 복사하고 작성하게 됨

 

6. 좀비 프로세스

- 자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 자식 프로세스를 좀비 프로세스라고 함

 

7. 프로세스 스케쥴링 관련 함수

- nice(): 우선순위 변경하는 시스템콜

- getpriority(): 어떤 프로세스의 우선순위 값을 가져온다

- setpriority(): 어떤 프로세스의 우선순위 값을 변경한다

 

8. 프로세스간 커뮤니케이션(IPC, Inter-process Communication)

- Message Queue

- Pipe

- Shared memory

- Signal

- Socket

 

9. 셸 스크립트(Shell script)

- 셸이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영체제를 위해 쓰인 스크립트

 

10. pthread(POSIX Thread)

- 유닉스 계열 POSIX 시스템에서 병렬적으로 작동하는 소프트웨어를 작성하기 위하여 제공하는 API

- libpthread 라이브러리에 포함되어 있으므로 컴파일 시 명시적으로 -pthread 옵션을 명시해야만 함

 

11. 메모리 매핑 함수

- mmap 함수를 사용하면 파일을 프로세스의 가상 메모리에 매핑할 수 있음

- 매핑할 메모리의 위치와 크기를 인자로 받음

 

12. inode

- 파일 시스템에 저장된 모든 파일과 디렉토리에 대한 메타데이터를 저장하는 데이터 구조

1. 변수와 자료형

(1) 변수(variable)

- 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간

int level;          //정수형 변수 level을 선언
level = 10;         //값 10을 level 변수에 대입

int level = 10;     //level 변수 선언과 동시에 값을 대입(초기화)

 

(2) 기본 자료형

- 정수형: byte, short, int, long

- 문자형: char

- 실수형: float, double

- 논리형: boolean

int iNum = 10;
byte bNum = (byte)iNum;     //강제로 형을 바꾸려면 바꿀 형을 괄호로 써서 명시해야 함

double dNum = 3.14;
int iNum2 = (int)dNum;      //실수 자료형 double을 정수 자료형 int로 형 변환

 

2. 연산자

(1) 기본 연산자

- 단항/이항/삼항 연산자, 대입 연산자, 부호 연산자, 산술 연산자, 증가/감소 연산자, 관계 연산자, 논리 연산자, 복합 대입 연산자, 조건 연산자

(2) 비트 연산자

- 비트 논리 연산자: &(AND) 연산자, |(OR) 연산자, ^(XOR) 연산자, ~(반전) 연산자

- 비트 이동 연산자: << 연산자(왼쪽으로 비트를 이동), >> 연산자(오른쪽으로 비트를 이동), >>> 연산자(오른쪽으로 비트를 이동, 왼쪽에 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 됨)

 

3. 조건문

(1) if문과 if-else문

- 하나의 조건을 만족하는 경우와 그렇지 않은 경우

if (조건식) {
    수행문;        //조건식이 참일 경우에 이 문장을 수행
}

if (조건식) {
    수행문1;       //조건식이 참일 경우에 이 문장을 수행
} else {
    수행문2;        //조건식이 거짓일 경우에 이 문장을 수행
}

 

(2) if-else if-else문

- 하나의 상황에서 조건이 여러 개인 경우

- if-else문은 하나의 조건을 만족하면 나머지 조건을 비교하지 않고 다음 수행문으로 넘어감

- if문으로만 이루어진 코드는 조건마다 각각 비교

if (조건식) {
    수행문1;      //조건식1이 참일 경우에 수행함
} else if (조건식2) {
    수행문2;      //조건식2가 참일 경우에 수행함
} else if (조건식3) {
    수행문3;       //조건식3이 참일 경우에 수행함
} else {
    수행문4;       //위의 조건이 모두 해당하지 않는 경우에 수행함
}
수행문5;         //if-else if-else문이 끝난 후 수행함

- if-else문은 조건 연산자로도 구현할 수 있음

max = (a > b) ? a : b;

 

(3) switch-case문

- 조건식의 결과가 정수 또는 문자열 값이고 그 값에 따라 수행되는 경우가 각각 다른 경우

- default문은 if-else if문의 else문 역할을 함(어떤 case에도 해당하지 않으면 맨 마지막 default문 수행)-

- break문은 조건에 맞는 수행문을 수행한 후에 수행을 멈추고 swtich-cases문을 빠져나가도록 함

switch(조건){
        case1:수행문1;
        break;
        case2:수행문2;
        break;
        case3:수행문3;
        break;
default:수행문4;
        }

 

- case문 동시 사용

case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31;
        break;
case 4: case 6: case 9: case 11: day = 30;
        break;
case 2: day = 28;
        break;

4. 반복문

(1) while문

- 조건식이 참이 동안 수행문을 반복해서 수행

int num = 1;        //초기화
int sum = 0;
while (num <= 10){  //조건 비교
    sum += num;
    num++;          //증감식
}

(2) do-while문

- { } 안의 문장을 무조건 한 번 수행 한 후에 조건식을 검사

- 조건이 만족하는지 여부를 마지막에 검사

do {
    수행문;
    ...
} while (조건식);
    수행문2;
    ...

(3) for문

- 중첩된 반목문: 외부 for문과 내부 for문이 어떤 순서로 실행되는지 잘 이해해야 함

- continue문: 반복문 안에서 continue문을 만나면 이후의 문장은 수행하지 않고 for문의 처음으로 돌아가 증감식 수행, 특정 조건에서는 수행하지 않고 건너뛰어야 할 때 사용

//홀수일 때만 더하고 짝수일 때는 더하지 않는 프로그램
int total = 0;
int num;

for (int num = 0; num <= 100; num++) {      //100까지 반복
    if (num % 2 == 0)                       //num값이 짝수인 경우
        continue;                           //이후 수행을 생략하고 num++ 수행
    total += num;                           //num값이 홀수인 경우에만 수행
}
//변수 num이 짝수일 때는 이후 수행을 생략하고 for문의 증감식으로 돌아가서 num에 1을 더함
//num이 홀수일 때는 계속 진행(continue)해서 total += num; 문장을 수행

 

- break문

int sum = 0;
int num = 0;
//0부터 시작해서 숫자를 1씩 늘리면서 합을 계산할 때 숫자를 몇까지 더하면 100이 넘는지
for (num = 0; ; num++) {    //조건식을 생략하는 대신 break문을 사용
    sum += num;
    if (sum >= 100)         //sum100보다 크거나 같을 때(종료 조건)
        break;              //반복문 중단
}

 

4.배열

(1) 배열

- 배열: 자료가 연속적으로 나열된 자료 구조

int[] studentIDs = new int[10];     //int형 요소가 10개인 배열 선언
//알파벳 문자와 아스키 코드 값 출력하기
char[] alphabets = new char[26];
char ch = 'A';

for (int i = 0; i < alphabets.length; i++, ch++) {
    alphabets[i] = ch;      //아스키 값으로 각 요소에 저장
}

for (int i = 0; i < alphabets.length; i++) {
    System.out.println(alphabets[i] + "," + (int) alphabets[i]);
}

-  배열 복사하기: for문 반복 복사,  System.arraycopy( ) 메서드

System.arraycopy(array1, 0, array2, 1, 4);
// (복사할 배열, 복사할 첫 위치, 대상 배열, 붙여 넣을 첫 위치, 복사할 요소 개수)

- 얕은 복사/깊은 복사

- 향상된 for문과 배열: 배열의 처음에서 끝까지 모든 요소를 참조할 때 사용하면 편리 

String[] strArray = {"Java", "Android", "C", "JavaScript", "Python"};

for (String lang : strArray) {
    System.out.println(lang);
}

(2) 다차원 배열

- 조건식이 참

(3) ArrayList

- 조건식이 참

 

 

 

6. 클래스와 객체

7. 상속

8. 다형성

9. 추상 클래스

10. 인터페이스

11. 내부 클래스

12. 입출력

13. 예외 처리

14. 컬렉션 프레임워크

15. 람다식

16. 스트림

'공사중' 카테고리의 다른 글

기초 수학  (0) 2023.11.13
코딩테스트 입문  (0) 2023.11.10

데크 deque

- 양쪽에서 삽입과 삭제가 모두 가능한 자료 구조
- deque: Doubly-ended Queue
- Stack과 Queue를 합친 상태
- 데크의 기본 구조는 양방향에서 삽입&삭제 가능한 구조
- 입력 제한 데크(Scroll): 한쪽의 입력을 제한한 데크
- 출력 제한 데크(Shelf): 한쪽의 출력을 제한한 데크

해시테이블(=해시맵, 해시표)

- 키(key), 값(value)을 대응시켜 저장하는 데이터 구조
- 키를 통해 해당 데이터에 빠르게 접근 가능
- 해싱: 키를 특정 계산식에 넣어 나온 결과를 사용하여 값에 접근하는 과정

해시테이블 구조

- 키: 해시 테이블 접근을 위한 입력 값
- 해시 함수: 키를 해시 값으로 매핑하는 연산
- 해시 값: 해시 테이블의 인덱스
- 해시 테이블: 키-값을 연관시켜 저장하는 데이터 구조

해시 충돌

- 해시 테이블의 같은 공간에 서로 다른 값을 저장하려는 경우
- 서로 다른 키의 해시 함수를통한 해시 값이 동일한 경우
- 해시 충돌 해결 방법으로는 크게 개방 주소법과 분리 연결법이 있음

개방 주소법(open address)

- 충돌시 테이블에서 비어 있는 공간의 hash를 찾아 데이터를 저장
- hash와 value가 1:1 관계유지
- 비어 있는 공간 탐색 방법에 따라 분류:선형탐사법, 제곱 탐사법, 이중 해싱

선형 탐사법(linear probing)

- 빈 공간을 순차적으로 탐사하는 방법
- 충돌 발생 지점부터 이후의 빈 공간을 순서대로 탐사
- 일차 군집화 문제 발생
- 반복된 충돌 발생 시 해당 지점 주변에 데이터가 몰리는 경우 발생

제곱 탐사법(quadratic probing)

- 빈 공간을 n제곱만큼의 간격을 두고 탐사하는 방법
- 충돌 발생 지점부터 이후의 빈 공간을 n제곱 간격으로 탐사
- 일차 군집화 문제 일부 보완
- 이차 군집화 문제 발생 가능성

이중 해싱(double hashing)

- 해싱 함수를 이중으로 사용
- 해시 함수1: 최초 해시를 구할 때 사용
- 해시 함수2: 충돌 발생 시 탐사 이동 간격을 구할 때 사용
- 선형 탐사, 제곱 탐사에 비해 데이터가 골고루 분포됨

분리 연결법(seperate chaining)

- 해시 테이블을연결 리스트로구성
- 충돌 발생 시 테이블내의 다른 위치를 탐색하는 것이 아닌 연결 리스트를 이용하여 해당 테이블에 데이터를연결

'오공완' 카테고리의 다른 글

자바스크립트: 문서 객체 모델(DOM)  (0) 2024.02.20
스프링 부트3 시작하기  (0) 2024.02.05
231120 오공완  (0) 2023.11.21
231115 오공완  (0) 2023.11.16
231105 오공완  (0) 2023.11.05

heap 힙

- 최댓값 및 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안됨

- 이진 트리(binary tree)를 기본으로 한 자료구조

- A가 B의 부모노드(parent node)이면, A의 키(key)값과 B의 키값 사이에는 대소관계가 성립

- 키값의 대소관계는 오로지 부모노드와 자식노드 간에만 성립 (형제사이X)

- max heap 최대 힙: 부모노드 키값이 자식노드 키값보다 항상 크거나 같은 힙

- min heap 최소 힙: 부모노드 키값이 자식노드 키값보다 항상 작은 힙

- 주요동작: insert, delete, peek

- 활용 사례: 프로세스 스케줄링, 힙 정렬

priority queue 우선순위 큐

- 큐와 유사하지만 우선순위가 높은 아이템이 먼저 처리됨

- ADT인 priority queue를 구현한 대표적인 data structure가 heap

 

#짝수는 싫어요

#숫자 문자열과 영단어

#9012

'오공완' 카테고리의 다른 글

스프링 부트3 시작하기  (0) 2024.02.05
231121 오공완  (0) 2023.11.21
231115 오공완  (0) 2023.11.16
231105 오공완  (0) 2023.11.05
231102 오공완  (0) 2023.11.03

Map

- key-value pair들을 저장하는 ADT
- 같은 key를 가지는 pair는 최대 한 개만 존재
- Map의 구현체: hash table, tree-based

Hash Table(Hash Map)

- 배열과 해시 함수를 사용하여 map을 구현한 자료구조
- 일반적으로 상수 시간으로 데이터에 접근하기 때문에 빠름
- 해시 함수: 임의의 크기를 가지는 type의 데이터를 고정된 크기를 가지는 type의 데이터로 변환하는 함수, 해시테이블에서 임의의 데이터를 정수로 변환하는 함수
- hash tale resizing: 데이터가 많이 차게 되면 크기를 늘려줘야 함
- default initial capa: 16
- hash table capa: power of 2
- F(key) -> HashCode -> Index  -> Value

Hash Collision(해시 충돌)

- key값은 무한한 것에 비해 hash code는 정수로 한정되어 있기 때문에 충돌이 불가피함
- key는 다른데 hash가 같을 때 (different keys -> same code)
- key도 hash도 다른데 hash%map_capa 결과가 같을 때  (different code -> same index)
- 해결 방법: open addressing(linear probing, CPython), seperate chaining (자바)

 

연결 리스트 (Linked List)

- 데이터를 링크로 연결해서 관리하는 자료구조
- 자료의 순서는 정해져 있지만 메모리상 연속성이 보장되지는 않음
- 장점: 데이터 공간을 미리 할당할 필요 없음(데이터 길이 가변적이어서 데이처 추가/삭제 용이)
- 단점: 연결구조를 위한 별도 데이터 공간 필요, 연결 정보 찾는 시간 필요(접근 속도 상대적으로 느림), 데이터 추가/삭제 시 앞뒤 데이터의 연결을 재구성하는 작업 필요
- 노드(node): 데이터 저장 단위로 값과 포인터로 구성
- 데이터 추가/삭제: 위치(head/중간/tail)에 따른 연결 작업 필요

List 구현체

- Array list: 배열(array)을 사용하여 list를 구현
- Linked list: 노드를 연결(linked) 시키는 형태로 구현

배열

- 같은 타입의 변수들로 이루어져 있고, 크기가 정해져 있음

- 인접한 메모리 위치에 있는 데이터를 모아놓은 집합

- 인덱스에 해당하는 데이터에 직접 접근(랜덤 접근)할 수 있음

- 중복O, 순서O

- 배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당됨

//배열 선언과 초기화
자료형[]배열이름=new 자료형[개수];
자료형 배열이름[]=new 자료형[개수];
int[]studentIDs=new int[10]; //int형 요소가 10개인 배열 선언

 

+ Recent posts