강사님이 주신 예제의 뮤텍스를 보면 읽기/쓰기 동작에서는 쓰기가 먼저 일어나고 읽기가 일어나야 하기 때문에 이를 위해서는 뮤텍스 단독으로는 이러한 처리가 불가능하다고 보여지며 반드시 이벤트와 결합되어야 이러한 동작이 가능할 거 같이 보여집니다. 아울러 이벤트를 써서 구현하면 굳이 뮤텍스는 필요 없을 거 같다는 생각이 드는데 강사님 의견 부탁드립니다.
ExitProcess 관련 메뉴얼에 프로세스에서 종료된 스레드 중 하나에 잠금이 있고 로드된 DLL 중 하나의 DLL 분리 코드가 동일한 잠금을 획득하려고 하면 ExitProcess 를 호출하면 교착 상태가 발생한다. 라고 되어 있는데 중요한 애기 인거 같은데 무슨 애기인지 알 수 있는지 해서요? DLL에서 ExitProcess 를 호출하면 예기치 않은 애플리케이션 또는 시스템 오류가 발생할 수 있다. DLL을 로드할 애플리케이션 또는 시스템 구성 요소와 이 컨텍스트에서 ExitProcess 를 호출하는 것이 안전한 경우에만 DLL에서 ExitProcess 를 호출해야 한다. 라고 되어 있는데 설명 부탁드릴 수 있느지요? 아울러 ExitProcess 와 TerminateProcess 의 경우 프로그램이 할당한 메모리 등 자원 및 오픈한 handle 에 대한 처리는 어떻게 되는지요? 부탁드려 봅니다.
메모리를 내부적으로 64KB 와 4KB 로 관리하는 내역이 뭔지 좀 자세한 설명 부탁드릴 수 있는지요? 4KB 는 시스템에서 한번에 이동하는 즉 PAGE 단위라는 것은 알고 있는데 64KB 의 의미는 정확히 이해가 좀 안가서요.... 또한 4Kb 를 넘어가는 메모리 요청은 한페이지를 넘어가는데 이 경우 메모리의 주소 관리 등은 어떻게 이루어 지는지 궁금합니다. 아울러 한가지만 더 여쭤보면 만약 스레드를 생성하고 대기하기도 전에 스레드가 종료되어 버리면 WaitForSingleObject는 어떻게 동작하나요? 또한 SetEvent() 를 호출하여 이벤트가 signalled 상태로 변경하면 WaitForSingleObject() 를 호출하는 모든 스레드는몇번이고 Event 가 non-signalled 로 전환되기 전까지는 몇번이고 WaitForSingleObject() 를 통해 Event 를 받을 수 있게 되는 건가요?
다중 코어 환경에서는 os가 스레드를 처리할때 동시성과 병렬성을 무조건 다써서 처리하나요? 친화력 조절을 안한다면.. 1번이 그렇다라면 코어가 4개(스레드 4개)인 컴퓨터에서 하나의 프로세스에서 3개의 스레드가 추가로 실행되어 총 4개의 스레드가 존재할때 추가된 3개의 쓰레드가 각각 2초짜리 입력 요청을 하나의 파일에 요청한다고 할때 cpu (idle~적당히) 동기 : 최소 2초 ~ 최대 6초 (block) 비동기 : 최소 2초 ~ 최대 6초가 맞을까요? 이렇게 볼때 비동기가 동기보다 좋은 이유가 block 되지않고 코드를 더 실행하는것 하나 뿐인가요? 이후에 다른 작업들이 더 많아지면서 비동기가 빛을 발하게 되는건가요?
시스템 프로그램 함수 매개변수에 NULL을 사용할때 c식으로 코딩하려면 NULL이고 c++식으로 코딩하면 nullptr로 써두는게 협업에서 도움이 되나요? 시스템 프로그래밍이나 소켓프로그래밍에서 scanf와 printf문,char배열을 쓰는것보다 cout,cin,endl,string을 쓰는게 성능 차이가 많이 나나요?
안녕하세요 선생님, 동기 파일 입출력을 설명해주시면서 64KB 단위로 파일을 읽어오는 이유에 대해 말씀해주셨는데, OS가 Page들을 할당한 후에 그 Page들을 묶어서 관리하는 크기의 단위가 64KB이어서 파일에서 읽어온 데이터를 저장할 버퍼가 특정 Page의 시작 주소부터 16개의 Page에 연속 되도록 데이터를 저장하기 위함으로 이해하면 될까요?
게임 서버 프로그래머 지망생에게 이 강의를 추천 하신다기에 수강하게 되었는데요. 아직 강의 초반이지만 winapi에서 쓰이는 구조체나 함수들이 계속 등장하는 것 같은데 해당 지식들이 실제로 게임 업계 실무에서 사용되는 지식들인가요? 그렇다면 강의에 나오는 내용을 꼼꼼히 머릿속에 넣어야 하겠지만 지엽적인 개념보다 큰 틀(os와 관련된 지식들)이 중요한 것이라면 직접적인 winapi 사용법 보다는 os 관련된 지식을 중점으로 공부하려고 하는데 어떤 방법을 추천하시나요?
예시로 보여주신 부분 중에 명시적으로 main thread 에서 dll을 로딩하고 추가적인 thread를 생성했을 때 dllmain의 thread attach 이벤트가 호출되는데 얘기해주시는 설명에서는 thread 마다 dll을 명시적으로 로딩하고 프리해줘야 사용할 수 있다고 해주셔서요 추가적으로 만든 thread에서 dll 명시적 로딩을 하지 않음에도 main thread에서 명시적 로딩한 dll의 dllmain의 thread attach 가 호출되는 부분이 궁금합니다 다른 thread에서 main thread 에서 명시적 로딩한 dll의 hmodule과 함수포인터를 얻어와 바로 사용해도 되는걸까요? 강의 감사합니다!
C#을 통해 WinAPI, DLLImport를 통해 타사 어플리케이션을 조작하고 내용을 얻어오는 프로그램을 만들고 있습니다. 개발을 하면서 각종 오류 (SystemMemoryViolation 등)을 만나는 등 MSDN에서 읽는 것만으로는 해결이 안되고 벽을 느끼는 경우가 있는데 이 강의를 들으면 제가 만들려는 프로그램을 만드는 데 도움이 될까요? 도움이 안되더라도 어쨌든 컴퓨터 분야에서 많은 걸 넓게 알고 싶기에 계속 강의를 볼 계획이긴 합니다.
안녕하세요. 시스템 프로그래밍 수업을 듣고 있는 수강생입니다. "임계영역 기반 동기화" 에서 질문이 있습니다. 해당 예제 코드는 ThreadFunc1과 ThreadFunc2가 경쟁적으로 SetString, GetString 하는 것을 CRITICAL_SECTION 으로 해결해보려는 예제로 인지했습니다. 그런데 main함수 초반에 hHandle에 ThreadFunc1쓰레드를 실행(_beginthreadex)하고 ::CloseHandle(hThread);를 했습니다. 저는 그래서 ThreadFunc1쓰레드가 종료되었다 생각하여 ThreadFunc1을 출력할 일이 없을거라 생각했습니다. 하지만 실행결과는 ThreadFunc1과 ThreadFunc2이 랜덤으로 5번 출력되는데 왜 ThreadFunc1이 출력되는지 궁금합니다. 혹시 제가 간과한 개념이 있을까요??
안녕하십니까, 윈도우 시스템 프로그래밍 강의 듣고 있는 학생입니다. 메모리 맵 강의에서 소개해주신 숙제를 수행하던 중에 접근 모드를 설정하는 부분에 사소한 의문이 있어서 질문드립니다. 작성한 코드의 흐름은 대략 다음과 같습니다. CreateFile() src파일과 dst파일의 핸들을 획득. GetFileSizeEx() src파일의 크기를 획득 SetFilePointer() dst파일의 크기를 설정, 2번의 값을 활용 CreateFileMapping() 각 파일의 매핑 객체 생성 MapViewOfFile() 각 파일 매핑 객체에 대한 포인터를 획득 memcpy() 각 파일에 대한 매핑 객체의 포인터와 파일의 크기로 파일의 복사 첫 시도에서 다음과 같이 1번과 4번을 수행했습니다. <실패> // 1번. dst 파일 생성 HANDLE hDst = CreateFile( TEXT("복사 대상 파일의 절대 경로"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); HANDLE hDstMap = CreateFileMapping(hDst, NULL, PAGE_WRITECOPY, 0, llFileSize.LowPart, NULL); if (hDstMap == NULL) { wprintf(L"Failed to create Dst file mapping obj [ERROR CODE: %d]\n", ::GetLastError()); CloseHandle(hSrcMap); CloseHandle(hSrc); CloseHandle(hDst); return 0; } 수행 결과, Dst파일에 대한 맵뷰 객체를 생성하는데 실패했고, ERROR_ACCESS_DENIED 에러 코드를 받았습니다. MSDN에서 CreateFileMapping()에 대해서 찾아본 결과, PAGE_WRITECOPY플래그가 PAGE_READONLY와 동일하다는 점을 확인하고 다음과 같이 수정하여 실행에 성공했습니다. <성공> HANDLE hDst = CreateFile( TEXT("복사 대상 파일의 절대 경로"), GENERIC_WRITE | GENERIC_READ, // 왜 GENERIC_WRITE만 설정하면 ERROR_ACCESS_DENIED인가요? 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); HANDLE hDstMap = CreateFileMapping(hDst, NULL, PAGE_READWRITE, 0, llFileSize.LowPart, NULL); if (hDstMap == NULL) { wprintf(L"Failed to create Dst file mapping obj [ERROR CODE: %d]\n", ::GetLastError()); CloseHandle(hSrcMap); CloseHandle(hSrc); CloseHandle(hDst); return 0; } MSDN에서 문제를 해결했지만, dst 파일에는 복사한 내용을 써넣기만 하는데 왜 dst파일에 대한 READ가 필요한지 의문이 들어서 이에 질문드립니다. 긴 글 읽어주셔서 감사드립니다.