개발/컴퓨터사이언스
-
Blocking/Non-Blocking Sync/Async개발/컴퓨터사이언스 2023. 1. 26. 17:28
Blocking/Non-Blocking Blocking, Non-Blocking은 제어권을 처리하는 방법론이다. Blocking은 현재의 작업이 모두 끝난후에 다음 작업에게 제어권을 넘겨준다. 예를 들어 Blocking 방식으로 CPU가 I/O 작업을 처리한다면 CPU는 I/O 작업이 완료 될 때까지 다른 업무를 하지 않는다. Non Blocking은 이와 반대다. 현재 작업이 모두 끝나지 않더라도 다른 작업에게 제어권을 건네줄 수 있다. CPU가 I/O 작업을 모두 처리하지 않더라도 다른 작업에게 제어권을 넘겨준다면 Non-Blocking이다. Sync/Async 작업의 결과값을 신경 쓰느냐 쓰지 않느냐와 관련 있다. Sync는 호출된 함수의 결과를 호출한 함수가 신경 쓴다. 함수의 리턴 값이 필요한 ..
-
멀티쓰레드 동시성개발/컴퓨터사이언스 2021. 6. 5. 14:06
멀티 쓰레드 환경은 하나의 프로세스 내에 여러 개의 쓰레드가 동작할 수 있는 환경을 말한다. 쓰레드는 고유의 작업을 하면서 쓰레드 내에서 할당된 변수 뿐만 아니라 프로세스 내에 있는 변수에도 접근 할 수 있는데 이때 여러 개의 쓰레드가 같은 데이터에 접근하는 경우 경우에 따라 동시성 문제가 발생할 수 있다. 위 그림은 스레드A, B가 프로세스 내에 상주한 정수형 변수 a에 접근하는 경우다. 둘다 read 명령으로 접근 하기 때문에 변수의 값이 변할 염려가 없다. 쓰레드 A, B 모두 변수의 값을 3으로 읽어오기 때문에 예상하지 못한 값을 읽어오게 되는 경우는 없다. 이 경우에는 동시성 문제가 발생하지 않는다. 그런데 위 그림에선 쓰레드 A가 a의 값을 1만큼 더해주는 작업을 하는데 이때는 접근 순서에 따..
-
프로스세와 스레드개발/컴퓨터사이언스 2021. 6. 5. 13:42
프로세스 (Process) 프로세스는 운영체제에서 프로그램을 구성하는 기본 단위다. 현재 글을 쓰고 있는 크롬 웹브라우저, 스마트폰에서 사용중인 넷플릭스, 카카오 앱도 모두 운영체제내에선 프로세스 단위로 이뤄진다. 특정 프로그램의 경우 두개 이상의 프로세스로 이뤄지는 경우도 있으나 하나의 프로세스로 이뤄진 경우가 일반적이다. 프로세스는 운영체제 고유 스케줄링에 관리를 받는다. 우리가 스마트폰에서 구글 뮤직 앱으로 음악을 들으면서 카톡을 할 수 있는 것도 구글 뮤직 앱 프로세스와 카톡 프로세스가 운영체제 스케줄링에 의해 관리되기 때문이다. 프로그램이 프로세스의 형태로 이뤄진 것도 어찌보면 운영체제 내에서 동작을 관리하기 위함으로 생각할 수도 있다. 쓰레드 (Thread) 프로세스내에서 실행되는 작업 단위다..
-
스핀락, 뮤텍스, 세마포어개발/컴퓨터사이언스 2018. 11. 7. 20:40
여러 개의 프로세스가 동시에 실행 할 수 있는 멀티 코어 환경은 사용자의 시스템 전반의 성능을 향상 시켜 주었지만 개발자들에게는 '프로세스간 공유 자원 접근 관리'라는 골치아픈 숙제를 남겼다. 다수의 컴포넌트가 공유중인 자원을 동시에 읽거나 수정할 때 생기는 문제들을 포괄해서 '동기화 문제'라고 하며 대부분의 소프트웨어는 스핀락, 뮤텍스, 세마포어라는 자료구조들을 이용해 해결 한다. 이번 포스트에서는 각 자료구조들의 작동 원리와 차이점에 대해서 정리해보려고한다. 스핀락 (spinlock) 특정한 자료구조를 획득(lock) 또는 해제(unlock) 함으로서 공유 데이터에 대한 접근 권한을 관리하는 방법이다. 권한을 획득하기 전까지 CPU는 무의미한 코드를 수행하는 busy waiting 상태로 대기하고 있..
-
RCU (Read-Copy Update)개발/컴퓨터사이언스 2018. 10. 30. 21:41
공유중인 값을 읽는 쓰레드와 업데이트하는 쓰레의 개수가 각각 하나인 경우에는 경우에는 spin_lock을 이용해도 별 어려움 없이 동기화 작업을 수행 할 수 있다. 그런데 값을 읽는 프로세스가 두개 이상이 될 때부터는 동기화 작업이 골치가 아파진다. 아래의 코드처럼 두개 이상의 쓰레드가 공유중인 val 값을 읽으려고 하고 한개의 쓰레드가 값을 업데이트 하고 있다고 해보자. 본래의 목적은 reader를 호출하는 thd[0]와 thd[1] 쓰레드가 writer를 호출하는 thd[2] 쓰레드가 업데이트 하는 값을 동일하게 읽는 것이었다. reader 두개를 writer보다 앞서서 생성한 덕분에 초반에는 어느 정도 동기화가 유지가 되겠지만 시간이 지나면서 쓰레드의 priority 값이 달라지게되고 어떤 기점에서..
-
Cgroup (Control Group)개발/컴퓨터사이언스 2018. 9. 15. 13:37
Cgroup (Control Group) Cgroup은 CPU, Network, Memory 등 하드웨어 자원을 그룹별로 관리 할 수 있는 리눅스의 모듈이다. 하나 또는 복수의 장치를 묶어서 하나의 그룹을 만들 수 있으며 개별 그룹은 시스템에서 설정한 값만큼 하드웨어를 사용할 수 있다. 설정하는 값은 예를 들면 이런 것들이다.어떤 그룹이 CPU를 더 많이 차지 할 것인지?그룹이 얼마만큼 메모리를 사용 할 수 있는지?네트워크 우선순위를 얼만큼 줄 것인가.시스템에 생성된 프로세스들은 장치 별로 특정한 cgroup에 속하며 프로세스가 사용하는 하드웨어 자원의 총량은 속한 cgroup의 통제를 받게 된다. 이말은 곧 프로세스가 아무리 효율적으로 동작하도록 만들어져 있어도 cpu 점유율이 낮은 cgroup에 속해..
-
CPU pinning과 taskset개발/컴퓨터사이언스 2018. 8. 27. 22:49
Big/Little로 이루어진 멀티코어 하드웨어 환경에서는 소프트웨어의 성능을 높이기 위해 하드웨어적인 트릭을 사용하는데 이중 가장 대표적인 것이 프로세스를 처리할 수 있는 CPU 종류를 설정하는 CPU pinning 방법이다. CPU affinity라고도 부른다. 기본적으로 스케줄러는 큐에 대기중인 프로세스를 하드웨어상에서 idle 상태에 있는 CPU에 최우선적으로 작업을 할당한다. 그런데 idle 상태에 있는 CPU가 Little라면 처리하는 속도가 Big Core에 비해서 확연히 차이가 날 수 있다. 칩에 따라서 다르지만 일반적으로 Big Core와 Little Core의 성능은 1.5배정도 차이가 난다. 만약 오래 걸리는 작업이라면 Little Core에 할당하는 것보다 Big Core가 idle..
-
스핀락개발/컴퓨터사이언스 2018. 7. 23. 22:23
멀티프로세서 환경에서는 시스템에서 생성된 프로세스가 하드웨어에 설치된 CPU의 수만큼 동시에 실행된다. CPU에서 동작 중인 프로세스는 메모리 영역에 할당된 데이터중 연산이 필요한 값을 읽고 쓰는 작업을 수행하게 되는데 이때 여러 개의 프로세스가 같은 데이터 영역을 공유하게 되는 경우가 있다. 여러 개의 프로세스가 공통된 전역 변수의 값을 읽는 경우가 대표적인 예다. 데이터 값이 고정되고 모든 프로세스가 고정된 값을 읽기만 하면 별 다른 문제는 없다. 그런데 누군가가 쓰게 되는 경우부터 싱크 문제가 생긴다. A랑 B 프로세스가 있다고 해보자. A 프로세스는 C와 D의 데이터 값을 수정하게 되어있고, B 프로세스는 A프로세스보다 조금 늦게 생성되어 A 프로세스가 수정한 값을 읽도록 짜여져 있다. 싱글코어에..