8월, 2022의 게시물 표시

220825)함수 포인터, Lambda 함수, thiscall

이미지
함수 포인터 함수의 주소를 가리킬 수 있는 포인터 변수. [ (반환값 자료형) (*포인터명) (매개변수 자료형...) ]의 꼴로 선언할 수 있다. 선언한 포인터의 반환값 과 매개변수 와 같은 자료형 을 가진 함수를 저장할 수 있다. (예시) 함수 포인터 선언: float (*fp)(int, int); 저장할 수 있는 함수: float Func(int a, int b); 함수를 포인터에 저장: fp = Func; 함수 포인터를 통한 호출: fp(3, 5); C++ 11부터는 using을 사용하면 특정 함수 포인터에 대한 별칭을 만들 수 있다. using funcPt = float(*)(int, int); 또한 C++ 11부터 표준 라이브러리 <functional> 헤더를 통해 std::function 을 사용한 함수 포인터의 정의가 가능하다. ---- #include <functional> std::function<float(int, int)> funcPt; funcPt = Func; // float Func(int a, int b)꼴로 선언된 함수; funcPt(3, 5); ---- Lambda 함수 익명의 함수를 정의할 수 있는 방법. 함수가 호출되거나 인수로 사용되는 위치에서 즉석으로 함수를 정의하여 캡슐화하는 데에 사용된다. 람다식은 다음과 같이 정의한다. --- [캡쳐 블록]( 매개변수 목록 ) mutable throw() -> 반환자료형 { 함수 내용 } ※ 기울임체는 생략가능한 코드 --- 자세한 참조:  https://jungwoong.tistory.com/51 함수 호출 규약 - thiscall 함수의 호출 규약은 함수 호출 시 전달된 매개변수를 함수가 종료될 때 정리하는 방법으로서 cdecl, stdcall, fastcall, thiscall 4가지가 존재한다. 이 중 thiscall 은 C++언어의 멤버함수에서 쓰이고 나머지는 C언어에서 사용된다. thiscall은 ecx에 인스턴스의 주...

220823)임계영역, 교착상태

이미지
임계 영역(Critical Section) 두 개 이상의 스레드가 공유자원에 접근할 때, 오직 한번에 하나의 스레드만의 독점을 보장해줘야하는 자원을 일컫는다. 임계 영역은 지정된 시간이 지난 후 종료되며, 어떤 스레드가 임계 영역에 들어가고자 한다면 지정된 시간 만큼 대기해야 한다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 영역에 들어가거나 나올 때는 세마포어 같은 동기화 매커니즘이 사용된다. 참조:  https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD --- 교착 상태 (Dead Lock) 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 뜻한다. 데드락 이 발생하기 위한 조건은 다음과 같다. 상호배제: 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 점유대기: 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다. 비선점: 이미 할당된 자원을 강제로 빼앗을 수 없다. 순환대기: 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다. 위 네 가지를 하나라도 발생하지 않도록 하는 것이 데드락을 예방하는 방법이다. 시스템의 프로세스들이 요청하는 모든 자원을 할당해주면서도 데드락을 발생시키지 않는다면 '안정 상태(safe state)' 에 있다고 말한다. 참조:  https://chanhuiseok.github.io/posts/cs-2/

220822)멀티 프로세싱, 멀티 스레딩, 동기, 비동기

이미지
멀티 프로세싱(Multi Processing) 다수의 프로세서가 여러 작업을 함께 처리하는 것을 뜻한다. ※프로세서: 프로그램을 수행하는 하드웨어 유닛 (프로세스와는 다름) --- 멀티 스레딩(Multi Threading) 일반적으로 하나의 프로세스는 한 개의 스레드를 가지고 작업을 수행한다. 그러나 멀티 스레드를 사용하면 하나의 프로세스 내에서 둘 이상의 스레드를 사용해 작업을 수행할 수 있다. 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유 하기 때문에 시스템 자원의 낭비를 줄일 수 있으며, 여러 스레드가 작업을 보조하기 때문에 사용자와의 응답성이 좋아진다. 참고:  http://www.tcpschool.com/java/java_thread_multi 동기(Synchronous) 요청과 결과가 동시에 일어날 것이라는 약속을 한 상태. 요청을 하면 결과가 반드시 주어져야 한다. 간단하고 직관적 인 방식이지만 결과가 도착할 때 까지 아무것도 안하고 대기해야 한다 는 특징이 있다. --- 비동기(Asynchronous) 요청과 결과가 동시에 일어나지 않는다는 약속을 한 상태. 요청에 따른 결과가 보장되지 않는다. 동기방식보다 복잡하나 , 결과가 도착하는 데에 시간이 걸리더라도 그 동안 다른 작업을 진행할 수 있어 자원을 효율적으로 사용할 수 있다 는 특징이 있다. 참고:  https://private.tistory.com/24

220819) GPGPU (General-Purpose computing on Graphics Processing Units)

 GPGPU(General-Purpose computing on Graphics Processing Units, GPU 상의 범용 계산) GPGPU 는 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치(GPU)를, 전통적으로 중앙 처리 장치(CPU)가 맡았던 응용 프로그램들의 계산에 사용하는 기술 이다. 이를 가능하게 한 것은 프로그램 가능한 층과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 스트림 프로세싱을 사용할 수 있게 된다. GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한 개와 대등하지 않다. 출처 :  https://ko.wikipedia.org/wiki/GPGPU