본문 바로가기

전체 글380

iOS coreaudio 재생 예제 - mac OS iOS coreaudio 재생 예제 - mac OS 1.오디오 재생을 위한 구조체를 선언한다. #import #import //1.오디오 큐 버퍼는 3개로 정의한다. (재생용/대기용/채우는용) static const int kNumberBuffers = 3; struct MyPlayer { //2.AudioStreamBasicDescription는 오디오 스트림의 광범위한 특성를 정의하는 구조체이다. AudioStreamBasicDescription mDataFormat; //3.재생 오디오 큐 AudioQueueRef mQueue; //4.오디오 큐 버퍼 포인트의 리스트 AudioQueueBufferRef mBuffers[kNumberBuffers]; //5.오디오 파일 객체 AudioFileID mA.. 2021. 1. 21.
12.프로세스 환경 변수 프로세스 환경 변수 프로세스별로 메모리 블록이 있다. 부모프로세스는 자신의 환경변수를 자식프로세스에게 상속시켜줄수 있다. 핸들 테이블 생성 순서 프로세스가 메일 슬롯을 생성하면 메일슬롯의 정보가 들어있는 커널오브젝트가 생성이 된다. os는 메일 슬롯 커널 오브젝트의 핸들값과 주소값을 프로세스의 핸들 테이블에 넘겨준다. 부모프로세스의 핸들테이블의 정보가 자식 프로세스에게 상속가능하다. 이때, 자식 프로세스에게 상속이 될려면, 핸들의 상속여부가 Y여야 한다. 핸들의 상속여부 Y 예제 핸들의 상속과 UC 부모의 핸들값을 자식에게 상속하고, 자식이 상속 받으면 부모 프로세스의 핸들 커널 오브젝트의 UC는 1씩 증가한다. 예제 0x1700번지에 메일슬롯을 연결하기 위한 커넥터 커널 오브젝트가 생성이 되었고, 이 .. 2021. 1. 20.
11.프로세스간 통신 IPC 프로세스간 통신 IPC 프로세스간 통신은 메모리 공유다. 왜냐면, a 프로세스가 공유되는 메모리에 데이터를 올려놓고 b프로세스가 가져가는 메커니즘이다. 이런 매커니즘을 통신이라고도 한다. 하지만 운영체제에서 커널이 아래 그림 처럼 두 프로세스의 메모리를 분리해놓는다. 그래서 서로 접근이 불가능하다.(안정성 문제) 어떻게 공유 메모리로 접근을 하나? 그 해결책은 os 가 제공해준다. IPC 기법이 그 중 하나다. 메일 슬롯의 동작원리 리시브 프로세스가 데이터를 받고 싶을때, 시스템 콜을 통해서 우체통을 하나 만든다. os가 만든다. 그럼 우체통이 생성되고 우체통 주소가 생성된다. 샌더 프로세스는 우체통 주소를 가지고 우체통에 데이터를 집어 넣는다. (시스템콜 함수를 통해서 os가 넣어준다.) 리시브 프로세.. 2021. 1. 20.
10.커널오브젝트와 핸들의 종속관계 커널오브젝트와 핸들의 종속관계 1 “커널 오브젝트는 os에 종속적이다.” 커널 오브젝트는 프로세스에 종속적인것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸 시점은 운영체제에 의해 결정된다. 프로세스 A가 생성되면 프로세스 A의 커널 오브젝트(핸들값 3)가 생성되고 프로세스 A만의 핸들 테이블이 생성된다. 이 핸들 테이블에는 핸들값 3이 등록된다. 이 핸들값 3은 A의 커널 오브젝트를 가리킨다. 그리고 커널 오브젝트의 UC(접근가능한 카운터)는 1이 증가된다. 프로세스 A가 프로세스 B를 생성한다. 프로세스 B의 커널 오브젝트가 생성되고 핸들값 3이 생성된다. 이때 UC는 2가 된다. 프로세스 A에 의해 B가 생성되었기 때문에 프로세스 A 도 프로세스 B에 접근가능하다. 내부적으로는 프로세스.. 2021. 1. 20.
9.커널 오브젝트 커널 오브젝트 커널 오브젝트란 커널에 의해 관리되는 리소스 정보를 담고있는 데이터 블록이다. 여기서 리소스란 운영체제에 의해서 생성 및 관리되고 소멸된다는 것이다. 예) 파일(리소스)에는 읽기전용 쓰기전용이 있는데, 이런 모드는 운영체제에 의해 관리된다. fopen(“test.txt” ,“r”); 위의 함수로 test 파일을 읽기 전용으로 열기를 시도했다. 운영체제는 저 파일을 찾아서 읽어 오려고 하는데 저 파일이 쓰기 전용이다. 그러면 운영체제에 의해서 읽어 오는것이 불가능하게 된다. 프로세스 기반 커널 오브젝트 (우선순위가 있다.) 프로세스가 생성될때 마다 아래 그림처럼 프로세스 관리 구조체 변수가 하나씩 생성되고, 새롭게 생성된 프로세스 정보들로 초기화되는데, 이것이 바로 커널오브젝트의 정체다. 그.. 2021. 1. 19.
8.프로세스와 스케쥴러의 이해 프로세스와 스케쥴러의 이해 프로세스란? 일반적인 정의 : 메인 메모리로 이동하여 실행중인 프로그램 프로세스의 범위는? -메모리 구조 + 레지스터셋 (B프로세스가 실행될때 B 프로세스의 데이터가 전체 레지스터에 채워진다. 이전에 있던 A프로세스는 다른 장소에 저장된다. 컨텍스트 스위칭이라고 한다.) -프로세스 별 독립적인 대상은 프로세스의 범주에 포함시킬 수 있다. 프로세스 스케쥴러란? 소프트웨어적으로 구현되어 있는 프로세스이다. 기능 : 둘 이상의 프로세스가 적절히 실행되도록 컨트롤 한다. 스케쥴링 알고리즘에 따라서 방법이 다양함. 프로세스의 상태 모든 프로세스는 상태 정보를 지니고 있다. Running : CPU에 의해 다른 프로세스가 실행되고 있는 상태. 스케쥴러에의해 Ready상태로 넘어가거나, B.. 2021. 1. 19.
7.Direct 모드와 Indirect 모드 Direct 모드와 Indirect 모드 Direct 모드 명령어 구성의 문제점 변수 b가 담겨 있는 메모리 주소값 0x0100은 source의 8비트 공간에 담길 수 없다. 그래서 LOAD r2 0x0100 명령어는 표현이 불가능하다. (구성불가) 위와 같은 방법을 Direct 모드라고 하는데 , 이방법을 통해서는 메모리의 모든 영역에 대한 접근이 불가능하다. 왜냐면 Direct 모드로 메모리를 접근할 경우, 할당 된 비트 수 안에서 표현 가능한 범위의 메모리 영역만 접근이 가능하기 때문이다. 어떻게 해결해야 하나? Direct 모드와 Indirect 모드 표현 Indirect 모드 는 [ 0x10] 번지에 가서, 거기에 있는 주소값으로 이동해서 그 값을 레지스터 r1 으로로 이동시켜라. 제일 위에서 .. 2021. 1. 19.
6.Load * Store 명령어 디자인 Load * Store 명령어 디자인 레지스터 필요성에 초점을 맞춘다. 지금까지 구조는 모든 피연산자에는 메인 메모리의 주소값이 올 수 없다. (피연산자로 올 수 있는 것을 숫자와 레지스터로 제한 했기 때문에) 때문에 지금까지의 디자인으로 아래와 같은 연산을 할 수 없다. 위에서 마지막 줄 소스는 아래와 같이 바뀐다. ADD c a b = 더해라 / c의 메모리 주소에 저장히라 / a의 메모리 주소와/ b의 메모리주소를 지금까지 설계한 레지스터 구조에서는 위의 명령어가 불가능하다. 메모리 주소가 올 수 있는 공간이 없기 때문이다. 따라서 메인 메모리에 저장된 데이터를 레지스터로 일단 옮겨 놓은 다음에, 덧셈진행을 해야 한다. 그래서 레지스터와 메인 메모리 사이에서 데이터를 전송할 수 있는 명령어가 필요한.. 2021. 1. 18.
5.컴퓨터 구조 컴퓨터 구조 프로그래머 관점 -컴퓨터 구조를 잘 아는 프로그래머도 컴퓨터 디자인에 참여 -컴퓨터 디자인은 레지스터와 명령어 디자인 레지스터 디자인의 핵심 - 레지스터는 몇 비트로 구성할 것인가? 일반적으로 N비트 시스템이라면 레지스터도 N비트다. 예) 32비트 시스템 = 레지스터 32비트 32비트 시스템에서 데이터의 최소 단위가 32비트이다. 그래서 레지스터도 데이터를 동일하게 32비트로 담는다. 예제에서는 16비트로 구성한다. - 몇 개 정도로 레지스터를 구성할 것인가? 많으면 많을 수록 좋다. 하지만 예제에서는 8개로 구성한다. -레지스터 각각을 무슨 용도로 사용할 것인가? 레지스터는 특별한 목적을 가지고 있는 저장장치다. 이처럼 목적과 용도를 정해 두면, 명령어가 단순해지고, 속도도 빨라진다. 예).. 2021. 1. 18.