전체 글

전체 글

    운영체제(OS) - 스케줄링(Scheduling)

    스케줄링은 프로세스가 생성되어 실행될 때 필요한 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업이다. CPU는 한 번의 하나의 작업만 처리 가능한데, 여러개의 작업이 존재할 경우 해당 작업들이 번갈아 가면서 수행되도록 만드는 것을 스케쥴링이라고 한다. 프로세스가 실행되는 순서를 정해주는 작업이라고도 한다. 스케줄링 과정 1. 문맥교환(Context Switching) 문맥교환 "Context Switching에서 Context는 현재 프로세스에 사용되는 자원 혹은 개체들의 상태를 의미한다. Switching은 교환을 의미한다. CPU가 스케줄링에 따라서 프로세스들에게 CPU를 할당해 줄 때 1) 현재 CPU가 할당된 프로세스의 정보를 저장.(프로세스 테이블에 레지스터값과 메모리맵(참조비트)) 2) ..

    IOS - 사용자에게 알람 승인을 구하는 법.

    우리들은 앱을 처음 설치하고 열었을 때 "이 앱에서 오는 알림을 받으시겠습니까?" 하는 별도에 Alert을 기억 할텐데 그런 식으로 만약에 사용자가 허용을 하지 않으면 우리가 잘 설정해 놓은 이런 알람도 사실상 앱에 표현되지 않는다. 어쨋든 이러한 허용을 받아야만 보낼 수 있는 구조로 되어있기 때문에, 사용자의 승인을 구하는 코드를 추가해야한다. AppDelegate.swift파일에서 UserNotifications를 추가해준다. //AppDelegate.swift import UIKit import UserNotifications 그리고 didFinishLaunchingWithOption에서 구현한다. class AppDelegate: UIResponder, UIApplicationDelegate { ..

    운영체제(OS) - IPC(2)(Inter-Process Communication), ITC(Inter-Thread Communication)

    race cindition을 피하기 위해 하드웨어 지원을 통한 Busy Waiting TSL(Test and Set Lock) TSL R, A 명령어를 사용한다. 메모리 A에서 레지스터 R로 값을 읽고 동시에 A에 0이 아닌 값을 저장한다. 프로그램 코드상 동시에 일어나기 때문에 스케쥴러에 의해 코드가 실행되다 cpu사용권을 넘겨주는 일은 발생하지 않는다. 실행 횟수 cpu memory 초기 0 0 실행 1 0 1 실행 2 1 1 0번 프로세스와 1번 프로세스가 있다고 가정한다면 0번 프로세스가 메모리의 0을 읽는다. 그럼 cpu의 레지스터엔 0이 읽히고 메모리는 1이된다. 그리고 1번 프로세스로 넘어가서 다시 메모리를 읽으려한다면 메모리엔 실제 값인 0이 아닌 1의 값을 읽게된다. 메모리의 값이 0이면..

    알고리즘 - 퀵 정렬(Quick Sort)

    퀵 정렬은 대표적인 분할 정복 알고리즘이다, 하지만 알고리즘이 수행되는 과정을 살펴보면 정복 후 분할하는 알고리즘이다. 피봇은 항상 요소의 가장 오른쪽 멤버가 되는 퀵정렬 1. 퀵 정렬의 아이디어는 피봇이라는 원소(숫자)를 정하고, 피봇보다 작은 숫자는 왼편으로, 피봇보다 큰 숫자는 오른편에 위치하도록하고, 피봇을 그 사이에 놓는다. 2. 피봇을 기준으로 작은쪽(왼쪽)과, 큰쪽(오른쪽)의 순서는 상관하지 않는다. 3. 피봇의 왼쪽엔 피봇으로 정한 수보다 작은수들만 모여있다. 순서X 4. 피봇 이전의 수를 기준으로 다시 수들을 정렬하고, 5. 피봇의 위치를 그 수들의 사이에 놓는다. 6. 1 ~ 5를 반복한다. 예) 7 2 5 1 3 4 피봇은 4가된다. 4보다 작은 애들을 왼쪽으로 몰아둔다. j가 4보다..

    알고리즘 - 선택 정렬(Selection Sort)

    선택 정렬(Selection Sort)은 입력 배열 전체에서 최솟값을 선택하여 배열의 0번 원소와 자리를 바꾸고, 다음에는 0번 원소를 제외한 나머지 원소에서 최솟값을 선택하여 1번 원소와 자리를 바꾼다. 이런 방식으로 마지막에 2개의 원소중에서 작은 값을 선택하여 자리를 바꿈으로써 오름차순의 정렬을 마친다. 정렬 할 데이터: 15 9 6 27 24 9 8 13 10 1 5 정렬된 데이터 1회전 결과: 1 9 6 27 24 9 8 13 10 15 5 2회전 결과: 1 5 6 27 24 9 8 13 10 15 9 3회전 결과: 1 5 6 27 24 9 8 13 10 15 9 4회전 결과: 1 5 6 8 24 9 27 13 10 15 9 5회전 결과: 1 5 6 8 9 24 27 13 10 15 9 6회전 ..

    알고리즘 - 버블 정렬(Bubble Sort)

    버블정렬 이웃하는 숫자를 비교하여 작은 수를 앞 쪽으로 이동시키는 과정을 반복하여 정렬하는 알고리즘이다. 버블정렬의 시간복잡도는 O(N^2)이다. 한 번의 Loop에 요소의 갯수만큼 비교를 하며 총 Loop는 요소의 개수번 돈다. 정렬할 수: 15, 2, 6, 27, 24, 9, 8, 13,10, 1, 5 실행 결과 0 회전 결과: 2 6 15 24 9 8 13 10 1 5 1 회전 결과: 2 6 15 9 8 13 10 1 5 24 2 회전 결과: 2 6 9 8 13 10 1 5 15 24 3 회전 결과: 2 6 8 9 10 1 5 13 15 24 4 회전 결과: 2 6 8 9 1 5 10 13 15 24 5 회전 결과: 2 6 8 1 5 9 10 13 15 24 6 회전 결과: 2 6 1 5 8 9 1..

    알고리즘 - 알고리즘

    알고리즘이란 이름은 페르시아 수학자 알라콰즈미(al-Khwarizmi 서기 780 ~ 850년)로부터 유래되었다. 알고리즘은 문제를 해결하는 단계적 절차 또는 방법이다. 입력이 주어지고, 수행 결과인 해(또는 답)을 출력한다. 알고리즘의 특성 - 정확성 알고리즘은 주어진 입력에 대해 올바른 해를 주어야 한다. - 수행성 알고리즘의 각 단계는 컴퓨터에서 수행이 가능하여야 한다. - 유한성 알고리즘은 유한 시간 내에 종료되어야 한다. - 효율성 효율적일수록 그 가치가 높아진다. 알고리즘은 항상 시간적, 공간효율성을 갖도록 고안되어야한다. 알고리즘의 분류 - 분할 정복 - 그리디 - 동적 계획 - 근사 - 백트래킹 - 분기 한정 그 외에도 확률 개념이 사용되는 랜덤, 병렬, 분산, 양자 알고리즘 등이 있다.

    알고리즘 - 동전 거스름돈

    물건을 사고 거스름돈을 동전으로 받아야 한다면? 예를 들어 거스름돈이 730원인 경우 가장 적은 수의 동전을 받기 위해서 1. 730원에서 500원짜리 몇 개? 1개 -> 730 - 500 = 230 2. 230원에서 100원 짜리 몇 개? 2개 -> 230 - 200 = 30 3. 30원에서 50원짜리 몇 개? 0개 4. 30원에서 10원짜리 몇 개? 3개 500원짜리 1개 200원짜리 2개 10원짜리 3개 쓸데없이 재귀함수 소스코드) void change(int money){ if (money >= 500) { int fivehun = money / 500; printf("500원 짜리: %d개\n", fivehun); change(money % 500); } else if(money >= 100){..

    알고리즘 - 이진탐색(Binary Search)

    이진탐색(Binary Search), K찾기 - 오름차순으로 데이터를 정렬한다. - 중간 숫자와 K비교한 후 같으면 탐색 성공 - K가 작으면 앞부분 반에서 같은 방법으로 K를 찾고 - K가 크면 뒷부분 반에서 같은 방법으로 K를 찾는다. 값이 보다 크다면 mid + 1 ~ high / 2 값이 보다 작다면 low ~ mid - 1 / 2 void binarysearch(int a[], int high, int target){ int low = 0, mid; //첫 최솟값은 0 while (low

    알고리즘 - 순차탐색(Sequential Search)

    최대 숫자 찾기 가장 큰 숫자가 적힌 카드를 찾는 한 가지 방법은 카드의 숫자를 하나씩 비교하면서 본 숫자들 중에서 가장 큰 숫자를 기억해가며 진행하는 방법일 것이다. n개의 숫자가 있을경우 n - 1의 비교가 이루어진다. 1 3 2 4 1 5 6 9 6 5 10개의 숫자가 있을 경우 1번째 요소를 가장 큰 요소로 두고 10번까지 9번의 비교가 이루어진다. 소스코드) void SequentialSearch(int a[], int n){ int tmp = 0; for (int i = 1; i < n; i++) { if (a[tmp] < a[i]) { tmp = i; } } printf("\n%d\n", a[tmp]); }