본문 바로가기

전체 글

(236)
프로세스 동기화, 데드락(교착 상태) 공유 자원, 임계 영역(Critical Section), 경쟁 상태(Race Condition)공유 자원: 여러 스레드가 동시에 접근할 수 있는 자원을 공유 자원이라고 한다.임계 영역: 공유 자원 중 여러 스레드가 동시에 접근했을 때 문제가 생길 수 있는 부분을 임계 영역이라고 한다.경쟁 상태: 둘 이상의 스레드가 공유 자원에 동시 접근했을 때 실행 순서에 따라 결과 값이 달라지는 상황을 의미한다.따라서 경쟁 상태를 방지하고 데이터 일관성을 보장하기 위해 임계 영역에 하나의 스레드만 접근할 수 있도록 제어해야 한다.* Race Condition은 CPU 코어가 1개일 때도 발생할까?결론은 Race Condition은 CPU 코어가 1개일 때도 발생한다. CPU 코어가 1개인 경우에는 동시에 하나의 프로세..
스레드 로컬(ThreadLocal) ThreadLocalThreadLocal은 클래스로, 이 스레드 로컬을 통해 각 스레드 별로 필요한 정보를 저장할 수 있다. 각 스레드는 자신만의 스레드 로컬을 가질 수 있으며, 다른 스레드의 스레드 로컬에는 접근할 수 없다. 각 스레드 별로 별도의 스레드 로컬을 갖기 때문에 멀티스레드 환경에서 공유 자원에 대한 동기화 문제를 피하고, 각 스레드가 자신의 상태를 안전하게 유지할 수 있다.ThreadLocalMapThreadLocalMap은 ThreadLocal의 정적 내부 클래스이다. 모두 private으로 구성되어 있어서 외부에서 접근 가능한 메서드가 없다.  Thread 클래스는 ThreadLocalMap을 멤버로 갖는다. 즉, 각 스레드마다 ThreadLocalMap을 갖는다.public class..
[백준] 10713. 기차 여행 https://www.acmicpc.net/problem/10713 가격 비교  (min(a * k, c + b * k)) 각 철도를 이용하는 총 횟수를 알아내고, 그에 따라 해당 철도를 이용할 때 티켓을 구매하는 방법과 IC 카드를 구매하는 방법 중 가격이 더 작은 방법을 이용하면 된다.철도 이용 횟수 구하기 (누적합)각 철도를 이용하는 횟수를 구해야 하는데, 만약 도시 1번에서 3번으로 이동할 경우, 1번 철도와 2번 철도를 이용한다. 그런데 이런 식으로 카운트하면, 이동 횟수가 m번이고 매 이동마다 가장 먼 도시로 이동한다고 가정했을 때 O(m * n)의 시간 복잡도가 소요되어 시간초과가 날 수 있다.따라서 누적합을 이용해야 한다. 누적합 활용 방식은 다음과 같다.도시 1번에서 5번으로 이동한다고 ..
[백준] 1941. 소문난 칠공주 https://www.acmicpc.net/problem/1941 처음에는 5 X 5 그래프의 각 노드를 시작으로 그래프 탐색을 해서 7명을 모으는 것을 생각했다. 그런데 같은 조합이 여러 번 나올 수 있다. (학생 1 -> 2 -> 3인 조합과 학생 3 -> 2 -> 1의 조합은 같기 때문) 그리고 이때 이미 나온 조합인지 일일이 검사하는 건 매우 비효율적이다. 따라서 25명의 학생 중 7명의 학생 조합을 찾고(백트래킹), 이 조합의 학생들이 모두 연속된 자리인지, 그리고 S 값이 더 많은지 확인(bfs)하면 된다. 그런데 7명의 학생 조합을 찾을 때 중복된 조합을 생성하면 안된다. (ex, 학생 1 + 2, 학생 2 + 1은 같음) 따라서 5 X 5 배열을 숫자 0 ~ 24로 취급한 후, dfs의 s..
[백준] 7570. 줄 세우기 https://www.acmicpc.net/problem/7570 처음에 떠올렸던 풀이는 시간 초과로 불가능했다. 따라서 다른 방법을 떠올려야 하는데, 구글링을 통해 dp로 O(N)의 시간으로 풀 수 있는 방법을 발견했다. (https://mygumi.tistory.com/276#recentEntries)우선 숫자를 제일 앞이나 뒤로 이동시키는 최솟값 = (n - 가장 긴 연속된 숫자의 오름차순 수열의 길이)이다.그리고 가장 긴 연속된 숫자의 오름차순 수열의 길이를 찾기 위해선 다음 점화식이 사용된다.dp[n] = dp[n - 1] + 1혼자 힘으로 떠올리기 힘들고 이렇게 적어도 와닿지 않지만, 예시를 통해 직접 적어가며 생각하면 이해는 된다..import java.io.BufferedReader;imp..
[백준] 2011. 암호코드 https://www.acmicpc.net/problem/2011 쉬운듯하지만 신경쓸게 있고, 구현 과정에서 실수하기 좋은(헷갈리는..) 부분이 많아서 푸는데 시간이 좀 걸렸다. 우선 dp로 풀 수 있는 문제이다. 25114가 주어졌을 때, 먼저 2를 만드는 경우부터 25, 251, ... , 25114를 만드는 경우까지 생각해보자.2 -> dp[1] = 1225 -> dp[2] = 22 + 525251 -> dp[3] = 2 2 + 5 + 125 + 12511 -> dp[4] = 42 + 5 + 1 + 125 + 1 + 12 + 5 + 1125 + 1125114 -> dp[5] = 62 + 5 + 1 + 1 + 425 + 1 + 1 + 42 + 5 + 11 + 425 + 11 + 42 + 5 + 1 +..
도커 네트워크 네트워크에서 IP 주소의 고갈을 막기 위해 사설 IP와 공인 IP를 나누는 NAT이라는 개념이 등장했다. 도커에서도 이와 유사하게 하나의 컴퓨터에서 여러 개의 컨테이너를 구동하는 경우, 각 컨테이너마다 IP 주소가 할당되는데, 이 IP 주소는 도커가 설치된 호스트 내에서만 쓸 수 있는 IP로 외부와의 통신이 불가능하다. 그러면 각 컨테이너는 어떻게 외부와의 네트워크 통신이 가능한 걸까? eth0호스트의 eth0은 실제 우리가 외부와 연결할 때 사용하는 호스트 네트워크 인터페이스이다.컨테이너 안에 eth0은 veth 가상 인터페이스를 통해 외부와 통신할 수 있게 되는 것이다.veth컨테이너가 시작될 때마다 호스트에 veth(virtual eth)라는 가상의 네트워크 인터페이스가 생성된다.컨테이너가 외부와 ..
도커 알아보기 하나의 컴퓨터 위에서 여러가지 응용 프로그램을 실행시키고 싶을 수 있다. 이는 운영체제도 마찬가지이다. 맥 위에서 윈도우를 실행시키고 싶을 수도 있고, 반대로 윈도우 위에서 리눅스를 실행시키고 싶을 수도 있다. 동시에 여러가지를 실행시키는 가장 단순한 방법으로, 하드웨어를 여러 개 사서 하나에 하나씩 돌리는 무식한 방법이 있다. 그러면 하드웨어에 상관없이 하나의 하드웨어 위에 여러 개의 응용 프로그램을 돌리는 방법을 알 수 있다면 모든 것이 해결되지 않을까? 따라서 하나의 컴퓨터 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있도록 하는 가상화 기술이 필요하다.가상화가상화 기술은 하나의 물리적 하드웨어에서 여러 개의 논리적 가상 시스템을 생성하고 관리하는 기술이다. 이를 통해 하나의 물리적 하..