프로그래밍

이 글에서는 컴퓨터에서 발생하는 데드락(deadlock)에 대해서 알아본다. 여기저기서 글을 읽고 나름대로 정리한 것이므로 개념이 100% 정확하다고 할 수는 없겠지만 이해에는 도움이 될 것이다... 데드락 데드락은 교착 상태라고 부르기도 한다. 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있어, 결과적으로 아무것도 완료되지 못하는 상태를 말한다. 그렇다면 데드락은 왜 생겨나게 되었을까? 특히 멀티스레드 환경에서 자주 발생하는 문제이기 때문에 이를 중심으로 설명하겠다. (단, 아래 사진에서 볼 수 있듯이 멀티스레드 외에도 조건을 만족하는 비슷한 상황에서 발생할 수 있는 문제이다.) 배경 먼저 Multi-Programming(프로그램을 여러 개 돌리는 것, 다중 프로그래밍이라고 번역할 ..
개요 이 글에서는 C++에서의 값에 의한 전달과 참조에 의한 전달을 알아본다. 전에 포인터 관련 글을 작성하면서 배경지식 또한 미리 설명을 했기 때문에, 특정 상황에서 값에 의한 전달과 참조에 의한 전달의 장단점을 알아보겠다. [C/C++] 포인터를 사용하는 이유 포인터를 사용하는 이유 포인터가 왜 필요할까? 포인터를 왜 쓸까? 포인터를 왜 사용할까? 에 대해서 생각해보기 전에... 포인터에 대해서 잘 모른다면 아래 '포인터란 무엇인가'부터 읽어보자. upbo.tistory.com 값에 의한 전달 vs 참조에 의한 전달 값으로 전달되면 객체의 새로운 사본이 생성되어 함수에 전달된다. 이 전달 방식은 굉장히 큰 객체를 전달하는 경우 사본을 생성하는 데 비용이 많이 든다. (낭비된다.) 그래서 복사 생성자를..
개요 이 글에서는 서로 다른 아키텍처에서 바이트를 주고 받을 때 신경 써야 하는 바이트 배열 방법, 엔디안에 대해서 알아볼 것이다. 엔디안 엔디안(Endian)은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻한다. 특히 컴퓨터에서 바이트를 메모리에 나열할 때 두 가지 방법이 있다. 하나는 빅 엔디안(Big endian)이고 하나는 리틀 엔디안(Little endian)이다. 빅 엔디안과 리틀 엔디안 빅 엔디안은 우리가 바이트 숫자를 쓸 때와 똑같다. 최상위 비트(Most Significant Bit, MSB)를 메모리의 가장 낮은 주소에 배치시켜 나머지를 쭉 나열시킨다. 말그대로 제일 큰 값을 먼저 나열시키는 방법이다. 사람이 숫자를 읽고 쓰는 방법과 똑같기 때문에 디버깅 과정에서 메모리의..
문제 https://www.acmicpc.net/problem/2096 2096번: 내려가기 첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다. www.acmicpc.net 풀이 방법 이전 위치 + 현재 위치의 정보를 바탕으로 다음 줄로 계속해서 내려갔을 때 최소 점수와 최대 점수를 구하는 문제다. DP를 이용해서 풀어야한다는 것을 알 수 있지만, 모든 줄의 정보를 저장하면 메모리 초과가 발생한다. 처음엔 int dp[2][100001][3]으로 했었는데 메모리 초과가 발생했다. 단순히 계산해보면 2 * 3 * 100,001 + 3 * 100,001 = 대략 900,000개의..
virtus
'프로그래밍' 카테고리의 글 목록