본문 바로가기

CS STUDY

(42)
뮤텍스 & 세마포어 세마포어(Semaphore) 멀티 프로그래밍 환경에서 공유된 자원의 데이터가 한 번에 하나의 프로세스만 접근할 수 있도록 제한 동기화 대상이 하나 이상 세마포어를 소유하지 않는 스레드가 세마포어 해제 가능 세마포어는 시스템 범위에 걸쳐 있고 파일로 존재 뮤텍스(Mutex) 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘 동기화 대상이 하나일 때 사용 자원을 소유하고 있는 스레드만이 뮤텍스 해제 가능 뮤텍스는 프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 정리 뮤텍스 vs 세마포어 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없음 Q. 뮤텍스와 세마포어의 적용범위의 차이? A. 세마포어는 프로세스간에 주로 사용, 뮤텍스는 스레드간에 주로 사용, 뮤텍스는 0,1로 ..
시스템 콜(System Call) 시스템 콜(System Call) 개념 사용자가 직접 커널 접근x => 응용프로그램에서 시스템 커널에 어떠한 기능을 수행해 달라고 요청 명령어 fork, exec: 새로운 프로세스 생성 wait: 프로세스가 만든 자식 프로세스가 끝날 때까지 기다리는 명령어 fork() 함수를 통해 부모 프로세스를 복사하면 주소 공간을 Binary 통째로 복사 Program Counter까지 모두 복사되니 자식 프로세스는 부모와 똑같이 동작 자식은 main()의 시작부터 실행하는 것이 아니라 fork() 다음 코드부터 실행 Q. 그러면 어떻게 자식과 부모를 구분? A. 리턴값의 차이 => 부모는 양수 자식은 0 exec()라는 System Call을 통해 프로그램을 덮어 씌우기 그 다음 코드 실행x wait()의 경우 자..
DFS & BFS DFS(Depth-First Search) 개념 루트노드에서 시작해 다음 분기로 넘어가기 전 해당 분기를 완벽하게 탐색 스택 or 재귀함수로 구현 특징 장점 최단 경로 빠르게 찾을 수 있다. 단점 경로가 매우 길 경우 많은 기억 공간 필요 비연결 그래프일 경우, 모든 그래프 탐색 후 실패 BFS(Breadth First Search) 개념 루트 노드에서 시작해 인접한 노드를 먼저 탐색하는 방식으로 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어진 정점을 나중에 방문 큐를 이용해 구현 특징 장점 적은 메모리 사용 찾으려는 노드가 깊은 단계에 있는 경우 BFS보다 빠름 단점 경로가 존재하지 않아도 끝날 때까지 탐색 최단 경로 찾기 힘듬
이분 탐색(Binary Search) 이분 탐색 개념 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터 탐색 배열 내부의 데이터가 정렬되어 있어야만 사용 가능 과정 데이터를 오름차순으로 정렬 자료의 중간값(mid)가 찾고자 하는 값(target)인지 비교 mid 값이 target과 다르다면 대소관계를 비교해 탐색 범위를 좁히고, target과 mid 값이 같을 때까지 아래 조건에 따라 2, 3번 반복 target이 mid보다 작으면 end를 mid 왼쪽 값으로 바꿈 target이 mid보다 크면 start를 mid 오른쪽 값으로 바꿈 코드 def binary_search(target, data): data.sort() start = 0 # 맨 처음 위치 end = len(data) - 1 # 맨 마지막 위치 while start ..
계수정렬(Counting Sort) 계수정렬(Counting Sort) 개념 각 숫자가 몇 개 있는지 개수를 세어 저장한 후에 정렬 기수정렬과 마찬가지로 비교를 하지 않는 알고리즘 양수만 가능, 값의 범위가 제한적 과정 1. 정렬되지 않은 배열의 수들이 각각 몇 번 나왔는지 count 배열에 기록 # 정렬을 수행할 배열 arr = [4, 7, 9, 1, 3, 5, 2, 3, 4] count = [0] * (max(arr) + 1) for num in arr: count[num] += 1 print(count) # [0, 1, 1, 2, 2, 1, 0, 1, 0, 1] 2. count 배열을 앞에서 순회하여 자신이 정렬된 배열에서 몇 번째에 나와야 하는지 기록하기 위해 누적합으로 갱신 for i in range(1, len(count)): ..
기수정렬(Radix Sort) 기수정렬(Radix Sort) 개념 자릿수를 기준으로 정렬하는 알고리즘 비교를 하지 않는 알고리즘 양수만 가능 과정 특징 Least Significant Digit(LSD) 안정정렬 추가적인 메모리 공간 필요 정렬 대상의 모든 길이가 동일해야 효율적 시간 복잡도 O(dN) => N은 데이터의 개수, d는 데이터들의 최대 자리 수 Q. 왜 주로 낮은 자리 수부터 정렬? A. LSD의 경우 10000와 1을 비교할 때, Digit의 갯수만큼 확인 but MSD의 경우 중간에 정렬이 완료되면 더 살펴볼 필요가 없음 LSD의 코드 구현이 MSD에 비해 간결
힙 정렬(Heap Sort) 힙 정렬(Heap Sort) 개념 완전 이진 트리를 기본으로 하는 힙(Heap) 자료구조를 기반으로 한 정렬 방식 최대 힙 트리나 최소 힙 트리를 구성해 정렬 내림차순 정렬을 위해서는 최대 힙 구성, 오름차순 정렬 위해서는 최소 힙 구성 과정 최대 값을 하나씩 뽑아내면서 정렬 코드 # Max Heapify 함수: 특정 인덱스의 노드를 최대 힙 형태로 유지하는 함수 def max_heapify(arr, n, i): largest = i # 부모 노드의 인덱스로 초기화 left = 2 * i + 1 # 왼쪽 자식 노드의 인덱스 right = 2 * i + 2 # 오른쪽 자식 노드의 인덱스 # 왼쪽 자식 노드가 부모 노드보다 크면 largest 값을 갱신 if left < n and arr[largest] <..
대칭키 & 공개키 대칭키(Symmetric Key) 암호화, 복호화에 같은 암호키(대칭키)를 사용하는 알고리즘 동일한 키를 주고받기 때문에 매우 빠름 but 전달과정에서 해킹 위험에 노출 DES, 2DES, AES, SEED, ARIA 등 공개키(Public Key)/비대칭키(Asymmetric Key) A가 B에게 데이터를 보내는 경우 A는 B의 공개키로 데이터를 암호화해서 보내고 B는 본인의 개인키로 해당 암호화된 데이터를 복호화해서 확인 암호화된 데이터는 B의 공개키에 대응되는 개인키를 갖고 있는 B만이 볼 수 있다. 중간 공격자가 B의 공개키를 알아도 B의 개인키로만 복호화가 가능 복잡한 수학 연산을 수행하기 때문에 대칭키 알고리즘에 비해 속도가 느리다. Diffie-Hellman, RSA, DSA, ECC 등 참..