프로세스란 보조기억 장치 즉 HDD나 SSD에 데이터 형태로 저장된 프로그램을 메모리에 올렸을 때 생겨난다.현재의 우리는 여러 프로그램을 동시에 프로세스로 올려 실행하고 있는데. CPU는 하나이며 메모리 또한 물리적인 크기 즉 자원이 유한하다. 하지만 우리는 수 많은 프로세스를 동시에 돌리고 있으며 메모리의 크기보다 프로세스의 크기가 더 큰 경우에도 컴퓨터에선 잘 돌릴 수 있는데 이러한 일들을 OS에서 관리하고 있기 때문이다.이제부터, 프로세스가 무엇이며 OS가 어떻게 이러한 프로세스와 메모리를 관리하는지 정리해보겠다.1. CPU의 자원을 나눠 가지는 방법.위 사진과 같이 프로세스는 서로 CPU의 자원을 필요로 한다. 이 때 OS에서는 일정 시간 간격으로 ( 타이머 인터럽트 ) CPU의 자원을 나눠줄 수..
위 포스팅은 아래 개발자 강민철씨께서 유튜브로 공개한 내용을 바탕으로 핵심 내용만 정리한 것이다.(https://www.youtube.com/watch?v=isj4sZhoxjk&t=1s)OS란 무엇일까?모든 프로그램은 컴퓨터의 자원을 필요로 한다. 운영체제 또한 하나의 프로그램이기 때문에 위 그림과 같이 메모리에 올라가게 되는데 이 때, OS의 역할은 다른 응용프로그램에게 자원을 올바르게 할당하는 역할을 수행하기 때문에 따로 커널 영역에 올라가게 된다.쉽게 요약하면 사용자가 메모장을 실행하는데 얼마만큼의 RAM과 CPU 하드디스크 등을 사용할지 수작업으로 정하는 경우는 없고 이러한 일을 OS가 한다고 보면 된다. 또한, 우리가 위 사진과 같이 인터넷이던 워드던 메모장이던 응용프로그램을 실행하게 되면 메모..
처음 이 문제를 보았을 땐 set만 이용해서 풀 수 있을거라 생각했다. set에 넣은 값이 있으면 count를 증가시킨 후 maxCount를 최종적으로 리턴하면 해당 3개의 케이스는 풀 수 있었다. #include class Solution { public: int lengthOfLongestSubstring(string s) { set sets; int count = 0; int maxCount = 1; if(s.size() == 0){ return 0; } for(int i = 0 ; i < s.size();i++){ if(sets.find(s[i]) != sets.end()){ maxCount = max(count, maxCount); count = 1; continue; } sets.insert(..
풀이. #include #include #include #include class Solution { public: string longestCommonPrefix(vector& strs) { string answer = ""; size_t shortest_length = strs[0].length(); // 첫 번째 문자열의 길이로 초기화 for (const auto& str : strs) { shortest_length = std::min(shortest_length, str.length()); } for(int i = 0 ; i < shortest_length; i++){ char firstStr = strs[0][i]; for(int j = 1 ; j < strs.size(); j++){ // s..
공유된 자원에 여러 개의 쓰레드가 동시 접근 하는 문제를 해결하기 위해선 여러가지 방법들이 있다. 첫 째로, Lock이 해제 될 때 까지 무한히 기다리는 방법이 있을 것이며 이것이 오늘 설명할 스핀락의 기조다. 둘 째로 콜백 방식이 있을 것이며 셋 째로 특정 시간 뒤에 다시 찾아가는 방식이 있다. 여러 방식 중 오늘은 첫 번째 방식인 스핀락에 대해 설명하고자 한다. 간단히 그림과 같이 2개의 쓰레드가 공유된 자원에 접근 시, Task A가 먼저 접근하였다고 가정하자. Task B는 A가 unlock을 할 때 까지 무한히 대기하다가, unlock이 되면 접근하는 구조다. 문제 사항으로는 당연히, Task B는 쓸대 없이 A가 끝날 때 까지 기다려야 하므로 오버헤드가 발생하고 CPU 점유율에 영향을 미친다...
해당 문제는 연산자 오버로딩에 대한 개념만 있으면 쉽게 풀 수 있다. int N; vector v; void Intput() { cin >> N; for (int i = 0; i > x >> y; v.push_back({ x,y }); } } 입력은 x,y를 받아준다. 순서는 y 오름차순을 기준으로하고 y가 같다면 x값을 비교한 뒤 오름차순 한다. bool operatorVector (const pair& a, const pair& b) { if (a.second == b.second) { return a.first < b.first; } return a.second < b.second; } 정렬 조건으로 만들어줄 비교 함수 하나를 만들어주었다. void ..
해당 문제는 Stack으로 풀면 간단하다. 0이 들어올 때, pop을 해주면 된다. int N; stack s; void Intput() { cin >> N; for (int i = 0; i > data; if (data == 0) s.pop(); else s.push(data); } } 이후 스택에 쌓인 수 만큼 합산 해주고 출력해주면 된다 void Solution() { int sum = 0; while (!s.empty()) { sum += s.top(); s.pop(); } cout > N; for (int i = 0; i > data; if (data == 0) s.pop(); else s.push(..
해당 문제는 그리디 알고리즘 ( 탐욕법 )으로 풀 수 있다. 간단히 해당 알고리즘을 적용하여 풀이 법을 그림으로 살펴보자면 일단 N이 11이라고 가졍했을 때, 5로 먼저 뺄 수 있는지 확인 후 5로 뺄 수 있으면 빼준다. 이후 (11-5)가 다시 5로 먼저 뺄 수 있는지 확인하고 뺄 수 있다면, 또 빼준다. (11-5-5)가 다시 5로 먼저 뺄 수 있는지 살펴본다. 뺄 수 없으니 이제 3으로 뺄 수 있는지 살펴본다. 뺄 수 없으니, 다시 (11-5)로 돌아가서 3으로 뺄 수 있는지 살펴본다. 뺄 수 있으니 (11-5-3)이 5로 뺄 수 있는지 살펴본다. 뺄 수 없으니, 3으로 뺄 수 있는지 살펴본다. 뺄 수 있다. 해당 값이 0이면 위로 타고타고 올라가서, 얼마나 거쳤는지를 알려주면 된다. 코드로 구현해..
1 11 66 286 1001 3003 8008 19448 43758 92378 1 10 55 220 715 2002 5005 11440 24310 48620 1 9 45 165 495 1287 3003 6435 12870 24310 1 8 36 120 330 792 1716 3432 6435 11440 1 7 28 84 210 462 924 1716 3003 5005 1 6 21 56 126 252 462 792 1287 2002 1 5 15 35 70 126 210 330 495 715 1 4 10 20 35 56 84 120 165 220 1 3 6 10 15 21 28 36 45 55 1 2 3 4 5 6 7 8 9 10 문제를 표로 나타내보자면 위와 같다. 맨 아래를 0층에선 아파트에는 0층부터..
이번 문제는 여지껏 배웠던 C++ 지식을 최대한 활용하여 풀어봤다. 우선은, 기존 main에 다 때려박았던 걸 조금 분리 해볼 생각이었다. #pragma once #define interface struct __interface ISol { virtual void Solution() = 0; virtual void Intput() = 0; virtual void Solved() = 0; }; ISOl 인터페이스를 하나 만들어줬고 #pragma once #include "ISol.h" class Sol: public ISol { void Solution() override; void Intput() override; void Solved() override; }; 해당 ISOL 인터페이스를 상속 받도록 S..