묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Windows 시스템 프로그래밍 - 기본
64 bit 운영체제라면 가상메모리가
2 ^ 64 = 16 엑사바이트 (EB)로 나오는데32비트 운영체제와 비교했을 때 크기가 너무 차이가 나서 어색합니다..찾아보니 전부다 사용하는 게 아니라 일정 부분만 사용한다고 하는데 64 비트 운영체제의 가상메모리 크기와, 유저모드, 커널모드 크기가 어떻게 되는지 알 수 있을까요
-
해결됨Windows 시스템 프로그래밍 - 기본
alertable Wait 상태 질문있습니다
Overlapped IO에서 SleepEX 같은 함수로 Alertable Wait상태로 진입할 수 있잖아요? IOCP 같은 경우 GetQueuedCompletionStatus 상태로 콜백함수를 호출할 수 있는 환경을 만들어주면 그 상태도 Alertable Wait 상태라고 할 수 있을까요?
-
해결됨Windows 시스템 프로그래밍 - 기본
GetCurrentDirectory 관련 질문
강의에서 GetCurrentDirectory를 사용하여 얻은 경로가실행파일의 경로가 아닐 수 있다라고 하셨는데,정확하게 무슨 의미인가요?vs 내에서 디버그로 실행하면 Debug 디렉토리 내의 실행파일의 경로가 나오니까 실행파일의 경로가 아닌가요?
-
해결됨Windows 시스템 프로그래밍 - 기본
세마포어 예제중 형변환에 대한 질문
ThreadSemaphore의 매개변수는 LPVOID인데이것은 void*를 의미 한다고 알고 있습니다. 어떻게 int로 변환이 가능한 것인가요?? 추측은 데이터 값이 가지고 있는 비트 그 자체를 형식만 주소로 변경된 데이터 값을 다루는 것 같은데 맞게 이해 했는지 모르겠습니다!
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 dll 지연로딩 관련하여 질문 드립니다
강의 내용을 기반으로 제프리 리처 <Windows via C/C++> 을 읽으며 생긴 질문이 있어서 여쭤봅니다.5판 번역본 기준 730p 입니다. /DelayLoad:MyDll.dll <- 지연로딩할 dll을 사용하면 링커에게 "실행 모듈의 임포트 섹션으로부터 MyDll.dll 파일을 제거하여 프로세스를 초기화할 때 해당 DLL 을 암시적으로 로드하지 못하도록 한다. 라고 되어 있습니다. (730페이지 상단) 이후에 지연로드 된 함수가 호출되었을 때 해당 함수를 익스포트하고 있는 DLL 이 존재하지 않으면 __delayLoadHelper2() 는 exception 을 던진다고 나와있습니다. (730페이지 3번째 문단) 궁금한 점은 "임포트 섹션에서 MyDll.dll 제거할 때 해당하는 dll 이 없으면 링크타임이나 로드할 때 에러를 발생시키면 되는데 왜 굳이 런타임에 exception 을 던지는지?" 궁금합니다. 항상 유익한 강의 감사합니다 😄
-
해결됨Windows 시스템 프로그래밍 - 기본
선장님 , _beginThreadEx() 함수 원리는 어디서 정보를 얻을 수 있을까요?
_beginthreadEx() 이 친구가 Thread safe하지 않은 함수가 있을 때, 해당 함수들을 문제없게끔(?) 부르도록 Thread를 create하는 것 까지는 이해가 됬는데, 원리가 궁금해집니다. 내부적으로 Lock을 하거나, 임계영역을 설정하는 등의 동기화 기법을 자동으로 하는 건가요? 아니면, 혹시 관련된 자료를 어디서 얻을 수 있을까요.. 구글링을 열심히 해봤지만 관련자료가 안나와서 선장님께 질문드려봅니다.
-
미해결리눅스 시스템 프로그래밍
네트워크 환경설정 오류
안녕하세요. 네트워크 환경 설정에서"vi etc/network/interfaces"를 입력했을때 파란 물결과 함께 Edit 창만 뜨고 강의와 같은 화면이 보이질 않네요.. ubuntu-24.04 버전인데요 구글링 해봐도 마땅히 해결책을 찾질 못해서.. 이후에 어떻게 진행해야하는지 알 수 있을까요? 감사합니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
메모리 맵 강의 예제의 결과가 이상합니다.
과제로 내주신 memcpy 문제는 압축도 풀리고 파일도 제대로 열립니다.그런데 예제의 strcpy_s()의 경우는 MYFILE.TXT를 열어보면 문자가 다깨지고 길이도 이상합니다.디버그 모드로 메모리를 보면 값이 제대로 들어가는게 보입니다만...해결방법을 찾지 못하겠습니다. 해결법이 있을까요?
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 파일입출력(Callback함수)와 관련하여 질문 드립니다.
강의 내용중 비동기 입출력 CALLBACK 함수 사용 부분에서 OVERLAPPED 구조체와 BUFFER 를 동적할당 해야 한다고 하셨는데.하지만 비동기 I/O를 하고 있는 스레드가 마지막 부분에서 SleepEx(1, TRUE) 로 대기하고 있습니다. 즉 스레드는 해당 CALL 함수 종료 후에도 계속 존재하기 때문에 스래드의 로컬변수로 선언해서 전달해도 CALLBACK 함수에서 사용하는데는 문제가 없는거 아닌지요? (이벤트로 처리하는 부분은 스레드 변수로 처리)왜 동적변수로 할당해야 하는지 이해가 되지 않아서요?실제로 제가 스레드내의 로컬 변수로 선언하고 동작 시켜도 정상적으로 동작을 해서요.
-
해결됨Windows 시스템 프로그래밍 - 기본
dll 명시적 링크 오류 (원인 및 해결 방법이 필요 합니다)
DLL 명시적 링크에서 파일 오류가 생기는데 해결이 안됩니다.구글 검색이랑 여기저기 다 해봤는데 나오는 게 없어서 질문 합니다.일단 코드 입니다. 질문 내용은 코드 밑에 다가 적어 두겠습니다.DLL 파일 이름 = Dll1.dllmain 파일 이름 = dlltest.cpp경로는 강의와 동일 합니다. main() 파일#include <iostream>#include <Windows.h>#include <tchar.h>using namespace std;//void WINAPI DllTestFunction(int pParam);int main(){ HINSTANCE Hin = ::LoadLibraryA("..\\x64\\Debug\\Dll1.dll"); DWORD Error1 = ::GetLastError(); if (Hin == NULL) { printf("falied LOADLIBARARY"); } DWORD(WINAPI * dllfun)(void) = NULL; dllfun = (DWORD (WINAPI*)(void)) ::GetProcAddress(Hin, "DllFunction"); Error1 = ::GetLastError(); std::cout << Error1 << std::endl; dllfun(); if (dllfun == NULL) { std::cout<<"failed dllfun()"<<std::endl; wprintf(_T("falied dllfun()")); return 0; } std::cout << "ddd" << std::endl; FreeLibrary(Hin); return 0;} DLL 파일 #include "pch.h"#include<stdio.h>#include<Windows.h>#include<iostream>#include<tchar.h>#pragma onceextern "C" __declspec(dllexport) DWORD WINAPI DllFunction(void);DWORD WINAPI DllFunction(void);BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}DWORD WINAPI DllFunction(void){ wprintf(_T("DLL TEST: DllTestFunction(param:)")); std::cout << "failed DLLfun dllfun()" << std::endl; return 0;} 현재 증상dllfun(GetProcAddress로 얻은 함수 주소)가 자꾸 NULL로 나와서 실행이 안됩니다. 현재까지 확인된 내용 Hin(LoadLibraryA) 모듈 핸들을 얻었는 데 NULL은 안 뜨나 디버깅을 했더니 This Program cannot be run in Dos mode 라고 나옵니다.dllfun(GetProcAddress로 얻은 함수 주소)은 NULL이 확실합니다. 밑에 코드 몇번 변경하면서 확인 됬습니다.GetLastError()을 dllfun()에 127(지정된 프로시저를 찾을 수 없습니다."라는 오류가 생성됩니다.)이 나옵니다 현재까지 시도경로 조정 절대경로, 상대 경로 다해봤습니다.함수 이름 변경extern "C" ~ 이것도 파일 양쪽에 다 넣어보고 한쪽에도 넣어보고 했습니다.구글 검색해도 원하는 내용이 안나옵니다.Hin의 자료 형을 HMODULE, HINSTANCE 다해봤습니다.환경변수 조정v3에 걸려서 꺼보고 실행exe 파일위치를 기준으로 경로 조정빌드도 해봤는데 안됩니다.대략 이 정도 입니다.원인이랑 해결방법이 궁금 합니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
static 영역의 rw 가능한 곳은 어떤 데이터가 담기는지 궁금합니다.
안녕하세요! 프로세스 파트 마지막 강의를 듣다가 궁금한 점이 있어 질문 남겨봅니다!static 파트는 r 와 rw가 가능한 곳으로 나뉜다고 말씀해주셨고 보통 r만 가능한 영역은 문자열이 담기게 된다고 이해했습니다. rw 가 가능한 영역은 어떤 데이터기 담기는 지 알 수 있을끼요??
-
해결됨Windows 시스템 프로그래밍 - 기본
TerminanteProcess 와 관련하여 질문 드립니다.
TerminateProcess가 ExitProcess 대신 사용되는 경우 DLL(동적 연결 라이브러리)에서 유지 관리하는 글로벌 데이터의 상태가 손상될 수 있다. ===> 이 부분에 대한 설명 부탁드릴 수 있는지요?
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 스레드 관련 질문 드립니다.
for(int i = 0; i < n ; ++i) 문 안에 스레드 생성시 매개변수로 &i를 주고 스레드를 생성할 경우 i 값이 변경되어 스레드에 +1 된 값이 전달되는 현상을 방지하려면 어떻게 해야 할 까요? 아마도 주소값을 주기 때문에 스레드 생성후에 i값이 변경되면서 발생한 거 같은데 해결 방법을 모르겠습니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 메뉴얼 중 이것도 궁금해서 여쭤봅니다.
TerminateProcess가 ExitProcess 대신 사용되는 경우 DLL(동적 연결 라이브러리)에서 유지 관리하는 글로벌 데이터의 상태가 손상될 수 있다. ====> 어떤 내용인지 설명해 주실 수 있는지요?
-
미해결Windows 시스템 프로그래밍 - 기본
강사님 프로세스의 IPC에서 굳이 MUTEX 가 필요할까 하는 생각이 듭니다.
강사님이 주신 예제의 뮤텍스를 보면 읽기/쓰기 동작에서는 쓰기가 먼저 일어나고 읽기가 일어나야 하기 때문에 이를 위해서는 뮤텍스 단독으로는 이러한 처리가 불가능하다고 보여지며 반드시 이벤트와 결합되어야 이러한 동작이 가능할 거 같이 보여집니다. 아울러 이벤트를 써서 구현하면 굳이 뮤텍스는 필요 없을 거 같다는 생각이 드는데 강사님 의견 부탁드립니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 ExitProcess 와 TerminateProcess 에 대해 질문드립니다.
ExitProcess 관련 메뉴얼에프로세스에서 종료된 스레드 중 하나에 잠금이 있고 로드된 DLL 중 하나의 DLL 분리 코드가 동일한 잠금을 획득하려고 하면 ExitProcess 를 호출하면 교착 상태가 발생한다. 라고 되어 있는데 중요한 애기 인거 같은데 무슨 애기인지 알 수 있는지 해서요?DLL에서 ExitProcess 를 호출하면 예기치 않은 애플리케이션 또는 시스템 오류가 발생할 수 있다. DLL을 로드할 애플리케이션 또는 시스템 구성 요소와 이 컨텍스트에서 ExitProcess 를 호출하는 것이 안전한 경우에만 DLL에서 ExitProcess 를 호출해야 한다. 라고 되어 있는데 설명 부탁드릴 수 있느지요?아울러 ExitProcess 와 TerminateProcess 의 경우 프로그램이 할당한 메모리 등 자원 및 오픈한 handle 에 대한 처리는 어떻게 되는지요? 부탁드려 봅니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 질문이 너무 많아 죄송합니다.
메모리를 내부적으로 64KB 와 4KB 로 관리하는 내역이 뭔지 좀 자세한 설명 부탁드릴 수 있는지요?4KB 는 시스템에서 한번에 이동하는 즉 PAGE 단위라는 것은 알고 있는데 64KB 의 의미는 정확히 이해가 좀 안가서요....또한 4Kb 를 넘어가는 메모리 요청은 한페이지를 넘어가는데 이 경우 메모리의 주소 관리 등은 어떻게 이루어 지는지 궁금합니다. 아울러 한가지만 더 여쭤보면 만약 스레드를 생성하고 대기하기도 전에 스레드가 종료되어 버리면 WaitForSingleObject는 어떻게 동작하나요?또한 SetEvent() 를 호출하여 이벤트가 signalled 상태로 변경하면 WaitForSingleObject() 를 호출하는 모든 스레드는몇번이고 Event 가 non-signalled 로 전환되기 전까지는 몇번이고 WaitForSingleObject() 를 통해 Event 를 받을 수 있게 되는 건가요?
-
해결됨Windows 시스템 프로그래밍 - 기본
비즈니스 코드는 프로세스간에 공유가 되는건지요?
개발자가 작성한 프로그램을 여러개의 프로세스로 기동할 때실행코드는 모든 프로세스가 공유하는 건지요? 만약 그렇다면 사용자 코드는 사용자 메모리에 어떻게 올라가서 어떤식으로 모든 프로세스가 공유할 수 있는건지 궁금합니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
강사님 질문 드립니다.
게임개발자가 되려면 MFC 를 어느정도 알아야 하나요?게임개발자가 되려면 반드시 MFC 를 공부해야 하는지 궁금해서요...강사님의 조언 부탁드립니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
동기와 비동기
다중 코어 환경에서는 os가 스레드를 처리할때 동시성과 병렬성을 무조건 다써서 처리하나요? 친화력 조절을 안한다면..1번이 그렇다라면 코어가 4개(스레드 4개)인 컴퓨터에서하나의 프로세스에서 3개의 스레드가 추가로 실행되어 총 4개의 스레드가 존재할때 추가된 3개의 쓰레드가 각각 2초짜리 입력 요청을 하나의 파일에 요청한다고 할때cpu (idle~적당히)동기 : 최소 2초 ~ 최대 6초 (block)비동기 : 최소 2초 ~ 최대 6초가 맞을까요?이렇게 볼때 비동기가 동기보다 좋은 이유가 block 되지않고 코드를 더 실행하는것 하나 뿐인가요? 이후에 다른 작업들이 더 많아지면서 비동기가 빛을 발하게 되는건가요?