반응형 분류 전체보기908 [Java] 자바 String 문자열 비교 - String equals(), null 사용 안녕하세요. codeomni입니다. 이번 포스트의 주제는 String 변수입니다. 자바에서 문자열은 String 데이터 타입으로 사용합니다. 내장 클래스로 java.lang 패키지에 포함되어 있습니다. 1. String 생성 1 String name; 문자열 변수의 생성은 String 클래스를 사용합니다. 2. 문자열 대입 1 String name = "codeomni"; 생성한 String 변수에 ""(큰따옴표)를 사용해서 문자 리터럴을 넣습니다. 이 때 주의할 것은 원하는 이름으로 지정한 변수는 스택 영역에 생성되고 ""(큰따옴표)으로 된 문자열 리터럴은 힙 영역에 String 객체로 생성됩니다. 스택영역의 변수가 힙 영역의 String 객체를 참조하고 있습니다. 3. String 생성과 동시에 참조.. 2024. 1. 20. [Java] 자바 NullPointerException 안녕하세요. codeomni입니다. 이번 포스트의 주제는 NullPointerException입니다. 자바에서 NullPoinerException은 Runtime에서 발생하는 예외입니다. 데이터 타입(Data Type)에는 기본 타입과 참조 타입이 있는 데, 여기서 null인 참조 타입의 변수를 사용하면 발생하는 오류입니다. 메소드 호출 시 null 참조, 배열에서 null 참조, 객체 필드에서 null 참조, 메소드 반환 값이 null 참조 등 상황에서 발생할 수 있습니다. 1. 메소드 호출 시 null 참조하는 경우 1 2 3 4 5 6 7 8 package test; public class Example { public static void main(String[] args) { String str.. 2024. 1. 19. [GitHub Copilot] 깃허브 코파일럿 구독 취소하기 안녕하세요. codeomni입니다. 이번 포스트의 주제는 깃허브의 Copilot 구독 취소하기입니다. Copilot의 성능은 너무 좋지만, 공부에 있어서 본인에게 도움이 되지 않아서 구독을 취소했습니다. 깃허브 홈페이지에서 다음의 과정으로 구독을 취소합니다. 깃허브 페이지에서 오른쪽 상단에 위치한 프로필을 클릭합니다. 메뉴 중에서 Settings를 클릭합니다. 왼쪽 메뉴에서 Billing and plans에서 Plans and usage를 클릭합니다. Add-ons의 GitHub Copilot에서 Manage subscription의 Cancel을 클릭합니다. 설문이 나오고 스크롤하면 하단에서 I understand, cancel GitHub Copilot 버튼을 클릭합니다. 다음달의 지불 금액이 변경되.. 2024. 1. 15. [PintOS] 핀토스 뽀개기 - User Programs 2 - User Memory Access 잘못된 내용은 댓글 부탁드립니다.목표PintOS에서 사용자 프로그램이 시스템 콜을 호출할 때, 커널은 사용자 주소 공간에 접근해야 합니다. 예를 들어 read() 시스템 콜은 사용자 포인터에 데이터를 써야 하며, write()는 사용자 버퍼에 데이터를 읽어야 합니다.하지만 커널이 무분별하게 사용자 주소 공간에 접근할 경우, 잘못된 포인터(NULL, 커널영역, 매핑되지 않는 주소 등)으로 인해 시스템이 충돌날 수 있습니다. 이를 방지하기 위해 사용자 메모리 접근의 안정성 검사(User Memory Access Validation)을 구현해야 합니다.수정 파일/userprog/syscall.c/include/userprog/syscall.h구현1. 사용자 주소 유효성 검사 함수: check_address().. 2024. 1. 6. [PintOS] 핀토스 뽀개기 - User Programs 1 - Argument Passing 잘못된 부분은 댓글을 남겨주세요.목표PintOS는 기본적으로 사용자 프로그램을 실행할 때 인자를 전달하지 않습니다. 그러나 실제 운영체제에서는 사용자 프로그램이 명령어 인자(argv)를 통해 동작을 제어하므로, 이를 구현하기 위해 Argument Passing 기능을 추가해야 합니다.process_exec() 함수는 기존에 단순히 실행 파일 이름만 받아 실행했지만, 이 단계를 확장하여 인자를 파싱하고 직절한 형태로 사용자 스택에 올려야 합니다. 이를 통해 사용자 프로그램은 일반적인 C언어 스타일의 int main(int argc, char *argv[]) 형태로 실행될 수 있습니다.수정 파일/userprog/process.c/include/userprog/process.h/devices/timer.c/t.. 2024. 1. 5. [AWS] EC2 프리 티어 사용량 확인하기 - 현재 사용량, 예상 사용량 안녕하세요. codeomni입니다. 이번 포스트의 주제는 AWS에서 프리 티어 사용량 확인하기입니다. 먼저, 아래 링크의 콘솔 홈에 접속합니다. https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2# https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2 ap-northeast-2.console.aws.amazon.com 검색 창에서 프리 티어를 입력합니다. 특징에 있는 프리 티어를 클릭합니다. AWS 프리 티어로 사용하고 있는 서비스의 목록과 현재 사용량을 확인할 수 있습니다. 단, 현재 사용량이 실제 사용한 것보다 업데이트.. 2024. 1. 2. [AWS] WARNING: UNPROTECTED PRIVATE KEY FILE 오류 처리 안녕하세요. codeomni입니다. 이번 포스트의 주제는 AWS에서 UNPROTECTED PRIVATE KEY FILE 오류 처리입니다. 1 2 3 4 5 6 7 8 9 (base) codeomni@codeomni ~ % ssh -i /Users/codeomni/Downloads/pint.pem ubuntu@000.000.000.000 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0777 for '/Users/codeomni/Download.. 2024. 1. 1. [PintOS] 핀토스 뽀개기 - Threads 4 - MLFQS(Multi-Level Feedback Queue Scheduler) 잘못된 내용은 댓글 부탁드립니다. 목표PintOS는 기본적으로 우선순위 기반 스케줄링(Priority Scheduling)을 제공합니다. 하지만 사용자 개입 없이 시스템이 자동으로 우선순위를 조정해야 하는 경우에는 MLFQS(Multi-Level Feedback Queue Scheduler)를 사용해야 합니다.MLFQS는 nice, recent_cpu, load_avg 값을 기반으로 각 스레드의 우선순위를 동적으로 조정합니다. 이를 통해 기아 현상 방지, CPU 사용량에 따른 공정한 분배, 실시간 반응성 개선이 가능합니다.수정 파일/threads/thread.c/threads/thread.h/threads/synch.c/devices/timer.c/include/threads/fixed_point.h(추.. 2023. 12. 27. [PintOS] 핀토스 뽀개기 - Threads 4 - Priority Inversion 잘못된 내용은 댓글 부탁드립니다.목표Pintos에서 스레드는 우선순위 기반으로 스케줄링됩니다. 그러나 실제 운영체제에서는 우선순위 역전(Priority Inversion)이라는 문제가 발생할 수 있으며, 이를 해결하지 않으면 높은 우선순위의 스레드가 실행되지 못하고 무기한 대기하는 문제가 생깁니다.이번 단계에서는 이 문제를 해결하기 위해 우선순위 기부(Priority Donation) 메커니즘을 구현합니다.낮은 우선순위의 스레드(L)가 락을 잡고 있다.높은 우선순위의 스레드(H)가 해당 락을 기다리며 BLOCKED 상태가 된다.그런데 중간 우선순위의 스레드(M)가 계속 CPU를 점유하면 H는 CPU를 받지 못하고 계속 대기하게 됨.결국 우선순위 높은 H가 낮은 L에게 의존해 대기하는 구조 = 우선순위 역.. 2023. 12. 27. [PintOS] 핀토스 뽀개기 - Threads 3 - Priority Scheduling and Synchronization 틀린 내용은 댓글 부탁드립니다.목표 Pintos에서는 다수의 스레드가 동시에 실행될 수 있기 때문에, 공유 자원(Lock, Semaphore, Condition Variable)을 사용하는 경우 스레드 간 동기화가 필수입니다.스레드들이 CPU를 점유할 때 우선순위를 부여하여 공정하고 효율적으로 경쟁시키고, 공유 자원(Lock, Semaphore, Condition Variable)을 얻기 위해 기다릴 때에도 우선순위에 따라 스케줄링이 되도록 수정합니다. 즉, 자원을 기다리는 스레드 중에서도 가장 높은 우선순위 스레드가 먼저 CPU를 얻을 수 있도록 합니다. Lock과 Semaphore를 구현하는 이유 스레드 간 공유 자원 보호Pintos는 하나의 커널(단일 주소 공간) 안에서 여러 스레드가 실행됩니다.이.. 2023. 12. 21. [PintOS] 핀토스 뽀개기 - Threads 2 - Priority Scheduling 틀린 내용은 댓글 부탁드립니다.목표 CPU는 고정된 시간 할당(time slice)을 기준으로, ready_list의 앞에서부터 순서대로 스레드를 실행하고, 시간이 만료되면 해당 스레드를 ready_list 뒤로 이동시키는 Round Robin 스케줄링 방식을 사용합니다.12345678/* /threads/thread.c */static struct thread *next_thread_to_run (void) { if (list_empty (&ready_list)) return idle_thread; else return list_entry (list_pop_front (&ready_list), struct thread, elem);}▲ CPU를 점유 시 ready_l.. 2023. 12. 17. [PintOS] 핀토스 뽀개기 - Threads 1 - Alarm Clock 틀린 내용은 댓글 부탁드립니다.Alarm clock 정의특정 시간(tick 수)이 지난 후 스레드를 ready 상태로 전환하여 다시 스케줄링하는 기능입니다.운영체제(OS) 또는 커널 수준에서, 현재 시간을 기준으로 지정된 시간이 지나기까지 스레드를 잠재웠다가, 시간이 되면 스레드를 다시 실행 가능(ready) 상태로 복귀시키는 메커니즘을 말합니다. 스레드가 바로 실행되지 않고, 특정 시간까지 "대기"해야 하는 경우가 많습니다. (예: 입출력 대기, 타이머 기반 작업 등)busy waiting 방식은 CPU를 낭비하므로, Alarm Clock처럼 block/wakeup 기반으로 효율적으로 대기해야 합니다. 사전 지식 - linux의 timer Linux의 alarm(2)은 seconds 단위로 알람을 .. 2023. 12. 16. [PintOS] 핀토스 뽀개기 - Threads 틀린 내용은 댓글 부탁드립니다. 구현 단계 프로젝트 1의 Threads에서 3 부분의 구현 단계를 거칩니다. 1. Alarm clock https://codeomni.tistory.com/945 2. Priority Scheduling Priority Scheduling https://codeomni.tistory.com/946 [PintOS] 핀토스 뽀개기 - Threads - Priority Scheduling 틀린 내용은 댓글 부탁드립니다. 목표 CPU가 우선순위에 상관없이 ready_list에 들어온 순서대로 쓰레드가 점유하는 라운드 로빈 스케줄링 방식으로 각각의 쓰레드가 할당 신간만큼 할당하고 주어 codeomni.tistory.com Priority Scheduling and Synchroni.. 2023. 12. 16. [Java] 자바 기초 4 - 조건문 이번 포스트는 자바의 조건문입니다. 자바에서 조건문은 조건을 검사하고 조건에 따라 코드 블록을 실행하는 제어 구조입니다. 특정 조건에서 따라 다른 작업이 수행됩니다. 1. if 문 주어진 조건이 참( true )일 경우 코드 블록을 실행합니다. 거짓인 경우에는 해당 코드 블록을 실행하지 않습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Example { public static void main(String[] args) { int num = 17; // 조건이 참인 경우 if (num > 16) { System.out.println("num은 16보다 큽니다."); } // 조건이 거짓인 경우 if (num > 20) { System.out.println("n.. 2023. 12. 1. JDK와 JRE 차이 이번 포스트는 JDK와 JRE 차이입니다. JDK(Java Development Kit)과 JRE(Java Runtime Environment)는 모두 Java로 프로그램을 개발하는데 중요한 요소로 공통점이 있지만 역할이 다릅니다. JDK는 프로그램을 개발에 필요한 도구를 제공하고, JRE는 프로그램을 실행에 필요한 환경을 제공합니다. 또한, 개발자는 JDK로 소스 코드를 작성, 테스트하고, 사용자는 JRE로 자바 애플리케이션을 실행합니다. JDK(Java Development Kit) 자바를 사용해서 소프트웨어를 개발에 필요한 도구와 라이브러리 모음으로 JDK를 사용해서 소스 코드를 작성하고 컴파일한 다음에 배포할 수 있습니다. 자바 컴파일러(javac) - 자바 소스 코드를 바이트 코드로 변환하는 컴.. 2023. 12. 1. [Eclipse] the project cannot be built until build path errors are resolved 오류 처리 이클립스 프로젝트 the project cannot be built until build path errors are resolved 오류 처리입니다. 자바 실행 환경(JRE - Java Runtime Environment)을 찾을 수 없는 문제로 설치된 JDK를 변경해줍니다. Problems창에서 the project cannot be built until build path errors are resolved 에러 메시지가 표시됩니다. 에러가 있는 프로젝트에서 마우스 우클릭합니다. Properties를 클릭합니다. 왼쪽 탭에서 Java Build Path를 클릭한 다음에 Libraries의 탭을 클릭합니다. JRE System Library를 클릭한 다음에 Edit 버튼을 클릭합니다. Workspac.. 2023. 11. 30. [C] 자료구조 - 기본 트리(LCRS Tree - LeftChildRightSibling Tree) 스택과 큐는 데이터의 삽입과 삭제를 한 쪽에서만 한다는 단점을 가지고 있습니다. 양쪽 방향에서 하면 더 효율적이지 않을까요 스택과 큐에서 정했던 Front와 Rear에 모두 데이터의 삽입과 삭제를 해주는 자료 구조가 바로 덱입니다. LCRS 트리 구조체 만들었던 자료 구조들은 모두 노드를 통해 데이터를 처리했습니다. 트리도 마찬가지로 노드와 간선으로 구성되므로 노드 구조체를 만들어 줍니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 트리 데이터 타입 정의 typedef char ElementType; // 트리 노드 구조체 typedef struct LCRSNode { // 왼쪽 자식 노드를 가리키는 포인터 struct LCRSNode* LeftChild; // 오른쪽 형제 노드를 .. 2023. 11. 17. [C] 자료구조 - 연결 리스트 큐 (Linked List Queue) 배열로 작성한 원형 큐는 한 번에 용량을 받아서 생성합니다. 아무리 큐의 Rear와 Front가 연결되어 있다고 해도 큐가 다 차는 경우에는 크기를 변경할 수 없다는 단점을 가지고 있습니다. 큐의 용량의 제한 없이 동적으로 생성할 수 있는 연결 리스트로 구현하는 큐가 필요합니다. 연결 리스트 큐 구조체 데이터를 저장하고 관리하기 위한 노드 구조체를 만듭니다. 1 2 3 4 5 6 7 8 9 // 큐 데이터 타입 정의 typedef int ElementType; // 연결 리스트 큐 노드 구조체 typedef struct Node { ElementType Data; struct Node* NextNode; } Node; 연결 리스트를 사용한 큐는 다음 노드를 가리킬 포인터가 필요합니다. 작성한 노드 구조체.. 2023. 11. 15. [C] 자료구조 - 원형 큐 (Circular Queue) 배열로 만든 선형 큐는 데이터가 나오는 Front가 마지막의 인덱스에 도달할 경우 앞에 데이터를 넣을 수 있지만, 큐가 가득 찼다고 판단합니다. ㅁㅁㅁㅁFront 이런 문제를 해결하기 위해서 배열의 처음과 끝을 연결하면, Rear가 배열의 앞으로 변경되어 데이터를 넣을 수 있습니다. 또한 미리 할당한 메모리만 사용하기 때문에 관리가 간편하며, 동적 할당과 해제에 필요한 오버헤드가 없어집니다. 원형 큐 구조체 데이터를 저장하고 관리하기 위한 노드 구조체를 만듭니다. 1 2 3 4 5 // 노드 구조체 typedef struct Node { ElementType Data; } Node; 배열을 사용한 원형 큐이기 때문에 연결 리스트처럼 다음 노드를 가리킬 포인터가 필요없습니다. 이제 노드를 만들었고 원형 큐.. 2023. 11. 13. [C] 자료구조 - 연결 리스트 스택 (Linked List Stack) 구현한 배열 스택(Array Stack)은 자유 저장소에 동적으로 생성되지만, 한 번에 용량을 전달 받아서 생성하게 됩니다. 전달 받은 용량만큼 스택을 사용할 수 있고, 배열인만큼 크기를 변경할 수 없다는 단점을 가지고 있습니다. 링크드 리스트는 배열의 크기 고정에 대한 단점을 보안합니다. 배열 스택의 단점을 보안하기 위해 연결 리스트를 사용한 링크드 리스트 스택을 구현합니다. 연결 리스트 스택 구조체 배열 스택과 다르게 연결 리스트 스택은 인덱스로 접근하지 않고 노드안의 포인터를 사용합니다. 연결 리스트처럼 스택의 노드 구조체 안에 다음 노드를 가리킬 Next 포인터를 만들어줍니다. 1 2 3 4 5 6 // 스택의 노드 구조체 typedef struct Node { ElementType Data; s.. 2023. 11. 12. [C] 자료구조 - 배열 스택 (Array Stack) 이번 주제는 스택(Stack)입니다. 스택은 선입후출(First In Last Out)의 구조로 먼저 들어간 데이터보다 나중에 들어간 데이터가 먼저 나오는 자료구조입니다. 뒤로 가기와 앞으로 가기의 기능 구현 등을 포함한 우리가 사용하고 있는 여러 프로그램에서 볼 수 있습니다. 스택은 배열과 링크드 리스트로 구현 가능 합니다. 그 중에서 배열은 구현이 쉽다는 장점과 용량을 동적으로 할당할 수 없다는 단점을 가지고 있습니다. 배열 스택 구조체 이전에 구현했던 자료들처럼 스택을 구성하는 노드들을 만듭니다. 1 2 3 4 5 // AS 노드 typedef struct Node { ElementType Data; } Node; 배열 스택을 구성하는 노드 구조체입니다. 연결 리스트처럼 다음 노드의 위치를 저장할 .. 2023. 11. 9. [C] 자료구조 - 원형 연결 리스트(Circular Linked List - CLL) 단일 연결 리스트와 이중 연결 리스트는 원형 연결 리스트는 연결 리스트에서 Tail이 Head를 가리키는 데이터 구조입니다. Head와 Tail의 이동이 간단하고, 다시 탐색할 필요가 없습니다. 노드들이 고리처럼 연결되어 있어 무한 루프를 사용해서 반복적으로 순회할 수 있습니다. 따라서 순환과 반복 작업의 무한 스크롤 인터페이스 등에서 사용할 수 있습니다. 이중 연결 리스트의 노드 구체의 수정없이 구현할 수 있습니다. 단일에서 이중 연결 리스트로 구현에서는 이전 노드의 주소를 저장하고 있는 포인터를 추가했지만, 원형 연결 리스트는 단순히 Head의 Prev 포인터가 NULL이 아니라, Tail을 가리키면 됩니다. 물론 Tail의 Next 포인터는 Head를 가리키면 됩니다. 원형 연결 리스트의 연산 자료.. 2023. 10. 31. [C] 자료구조 - 이중 연결 리스트(Doubly Linked List - DLL) 단일 연결 리스트는 다음 노드를 가리키는 포인터가 1개입니다. 특정 노드를 찾기 위해서 Head부터 Tail까지 순차적으로 탐색해야 한다는 단점이 있습니다. 따라서 현재 노드에서 이전 노드로 돌아갈 수 없고 다시 Head부터 탐색이 필요합니다. 이중 연결 리스트는 노드를 가리키는 포인터를 1개 추가하여 탐색을 보안하였습니다. 다음 노드를 가리키는 포인터뿐만 아니라 이전 노드를 가리키는 포인터를 추가하는 방법입니다. 1 2 3 4 5 6 typedef struct tagNode { int Data; struct tagNode* PrevNode; struct tagNode* NextNode; } Node; ▲ 이전 노드를 가리키는 포인터 변수를 추가해줍니다. 이중 연결 리스트의 연산 자료구조를 사용할 때는 .. 2023. 10. 30. [Coding Test] 시간 복잡도 - 빅오표기법 보호되어 있는 글 입니다. 2023. 10. 29. 이전 1 2 3 4 5 ··· 38 다음 반응형