분류 전체보기
-
스택, 힙, 코드, 데이터영역개발/기술 2018. 11. 10. 14:20
OS에서 프로세스가 바라보는 메모리 영역은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(stack) 영역으로 나뉘어진다. Code 영역 프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간이다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다. Data 영역 코드에서 선언한 전역변수 또는 static 변수 등등이 저장된 공간이다. 전역변수/static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다. 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다. 단, 초기화 되지 않는 전역 변수는 BSS 영역에 할당된다. Stack 영역 자료구조로 많이 알려진 Stack은 프로..
-
스핀락, 뮤텍스, 세마포어개발/컴퓨터사이언스 2018. 11. 7. 20:40
여러 개의 프로세스가 동시에 실행 할 수 있는 멀티 코어 환경은 사용자의 시스템 전반의 성능을 향상 시켜 주었지만 개발자들에게는 '프로세스간 공유 자원 접근 관리'라는 골치아픈 숙제를 남겼다. 다수의 컴포넌트가 공유중인 자원을 동시에 읽거나 수정할 때 생기는 문제들을 포괄해서 '동기화 문제'라고 하며 대부분의 소프트웨어는 스핀락, 뮤텍스, 세마포어라는 자료구조들을 이용해 해결 한다. 이번 포스트에서는 각 자료구조들의 작동 원리와 차이점에 대해서 정리해보려고한다. 스핀락 (spinlock) 특정한 자료구조를 획득(lock) 또는 해제(unlock) 함으로서 공유 데이터에 대한 접근 권한을 관리하는 방법이다. 권한을 획득하기 전까지 CPU는 무의미한 코드를 수행하는 busy waiting 상태로 대기하고 있..
-
FFmpeg개발/오픈소스 2018. 10. 31. 20:40
FFmpeg는 동영상업계에 종사하는 사람들이라면 아주 유명하고 지대한 영향력을 쥐고 있는 오픈소스 프로젝트다. FFmpeg의 영향력이 얼마나 막강한지 나무위키에서는 FFmpeg를 '마이크로소프트+애플 정도의 영향력을 가지고 있는 멀티미디어계의 최종 보스이며 갑자기 유료화를 시전한다면 내일부터 전세계 동영상 시청이 불가할지도 모른다'고 표현할 정도이니 FFmpeg을 접해보지 못한 개발자라면 오픈소스계에서 리눅스 커널과 거의 맞먹는 위상을 가지고 있다고 짐작해볼 수 있다. 실제로 사용해보면 FFmpeg가 왜 이렇게 막강한 영향력을 가지고 있는지 어느정도 짐작해볼 수 있다. 동영상에 간단히 수정할 일이 생겼다고 해보자. 평소 같으면 다음 팟플레이어, 곰인코더를 설치해서 깔고 버벅거리는 로딩바를 보며 힘겹게 작..
-
gcc로 pthread API 컴파일하기개발/삽질 기록 2018. 10. 30. 21:59
왠만한 C 코드들은 'gcc 파일명' 명령어로 빌드가 가능한데 코드 안에서 pthread API를 사용하고 컴파일을 하면 아래와 같은 에러 메시지가 나온다. kwony@kwony:~$ gcc thread.c thread.c:(.text+0x79): undefined reference to `pthread_create' thread.c:(.text+0xa9): undefined reference to `pthread_join' collect2: error: ld returned 1 exit status gcc 컴파일 스크립트에 디폴트로 pthread 라이브러리가 포함되지 않아서 발생하는 에러다. `-lpthread` 를 옵션으로 줘서 pthread 라이브러리를 포함시켜 빌드하면 해결 할 수 있다. gcc ..
-
RCU (Read-Copy Update)개발/컴퓨터사이언스 2018. 10. 30. 21:41
공유중인 값을 읽는 쓰레드와 업데이트하는 쓰레의 개수가 각각 하나인 경우에는 경우에는 spin_lock을 이용해도 별 어려움 없이 동기화 작업을 수행 할 수 있다. 그런데 값을 읽는 프로세스가 두개 이상이 될 때부터는 동기화 작업이 골치가 아파진다. 아래의 코드처럼 두개 이상의 쓰레드가 공유중인 val 값을 읽으려고 하고 한개의 쓰레드가 값을 업데이트 하고 있다고 해보자. 본래의 목적은 reader를 호출하는 thd[0]와 thd[1] 쓰레드가 writer를 호출하는 thd[2] 쓰레드가 업데이트 하는 값을 동일하게 읽는 것이었다. reader 두개를 writer보다 앞서서 생성한 덕분에 초반에는 어느 정도 동기화가 유지가 되겠지만 시간이 지나면서 쓰레드의 priority 값이 달라지게되고 어떤 기점에서..
-
Github 페이지를 이용해서 이력서 만들기개발/삽질 기록 2018. 9. 27. 21:31
이력서를 웹사이트에 공개하는 방법으로 LinkedIn을 사용하는 것이 가장 간단하고 대중적이지만 포맷이 정해져 있어 심심하고 다른 사람들과 차별화를 줄 포인트가 없다는 것이 단점이다. 그래서 일부 개발자들은 자신의 이력서를 HTML 형태로 이쁘게 디자인하고 호스팅을 해서 다른 사용자가 쉽게 볼 수 있게끔 만든다. 링크드인 보다 덜 식상한 것 같다 그런데 이력서 한 장 띄우자고 유료 웹 호스팅 서비스를 이용하는 건 부담스러운 일이라 개발자들은 Github에서 저장소 별로 제공하는 페이지 기능을 활용해서 이력서를 만든다. 깃허브 페이지 기능이 궁금하신 분들은 이 사이트에서 친절히 설명하는 영상이 있으니 참고하길 바란다. 자세한 사용 방법은 알려주지 않는 것 같다. 사실 페이지 기능을 사용하는 법을 몰라도 이..
-
Cgroup (Control Group)개발/컴퓨터사이언스 2018. 9. 15. 13:37
Cgroup (Control Group) Cgroup은 CPU, Network, Memory 등 하드웨어 자원을 그룹별로 관리 할 수 있는 리눅스의 모듈이다. 하나 또는 복수의 장치를 묶어서 하나의 그룹을 만들 수 있으며 개별 그룹은 시스템에서 설정한 값만큼 하드웨어를 사용할 수 있다. 설정하는 값은 예를 들면 이런 것들이다.어떤 그룹이 CPU를 더 많이 차지 할 것인지?그룹이 얼마만큼 메모리를 사용 할 수 있는지?네트워크 우선순위를 얼만큼 줄 것인가.시스템에 생성된 프로세스들은 장치 별로 특정한 cgroup에 속하며 프로세스가 사용하는 하드웨어 자원의 총량은 속한 cgroup의 통제를 받게 된다. 이말은 곧 프로세스가 아무리 효율적으로 동작하도록 만들어져 있어도 cpu 점유율이 낮은 cgroup에 속해..
-
VNC와 RDP개발/기술 2018. 9. 12. 22:10
원격 데스크톱을 연결하는 프로토콜은 여러 가지가 존재하는데 이중 대표적인 방법이 VNC와 RDP다. 두 프로토콜 모두 단순히 커맨드 라인 창만 띄우는 ssh를 넘어서서 원격 PC의 그래픽 인터페이스까지 연결해준다는 점은 동일하지만 둘의 세부 동작 방식과 주 사용 용도는 조금 다르다. 이번 포스트에서는 VNC와 RDP의 원리를 분석하고 각각의 차이점을 간단히 정리해보고자 한다. VNC (Virtual Network Computing) VNC는 RFB(Remote Frame Buffer)프로토콜 방식을 이용해 서버에서 보낸 화면 정보를 클라이언트에 설치된 그래픽 라이브러리를 이용해 그리는 방식이다. 사용하기 위해선 원격으로 접속하려는 PC에서는 지속적으로 화면 정보를 RFB의 형태로 변환해 전송하는 서버가 ..