«   2013/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

'2013/04'에 총 2개의 글이 있습니다.

  1. 2013.04.27SSD 사용시 주의해야 할 점3
  2. 2013.04.03scanf에서 값을 받아들이지 못하고 스킵될 때2

SSD 시장이 많이 활성화 되면서 인터넷에는 SSD 최적화 방법, 기업에서 제공하는 SSD 관리 프로그램 등 많은 유틸리티와 팁들이 올라오고 있습니다.

제가 이번에 알려드리려 하는 것은 다른 글들이 잘 알려주지 않거나 특수 경우라 언급하지 않은 경우에 대한 팁을 알려드리고자 합니다.

흔히 SSD 프리징은 하드웨어 세팅에 의한 것이라고들 하고 Microsoft나 Samsung 또한 그렇게 답변을 합니다.

이 글에서는 하드웨어 문제가 아닌 경우의 프리징의 예를 두가지 들어보겠습니다.


위 스크린샷은 최근 제가 친구로부터 휠을 구해 플레이 중인 유로 트럭 2 입니다.

초기에 제가 이 게임을 하는데 상당히 프리징을 겪었는데요. 

알고보니 게임 세팅이 문제였습니다.

이는 이 게임 뿐만 아니라 다른 CD 게임들, 임시 파일 혹은 개인 프로필 쓰기 작업이 자주 이뤄지는 모든 게임에 공통되는 사항이 아닌가 싶습니다.


저같은 경우 이 게임은 내문서에 프로필과 스크린샷, 모드 파일등을 기록하게 되어 있는 게임입니다.

제가 프리징 걸린 이유중 하나가 바로 이것때문이었습니다.


HDD에 기록된 프로그램이 과하게 SSD에 데이터를 기록하고 참조하거나

SSD에 기록된 프로그램이 과하게 HDD에 데이터를 기록하고 참조하면


프리징에 걸릴 확률이 있습니다.


문서 작업과 같은 프로그램은 과하겍 쓰기/읽기가 발생하지는 않습니다.

일정 주기로 임시 저장하거나 최종 저장시만 저장 매체에 쓰기가 발생하기 때문이죠.


하지만 게임은 수시로 읽기와 쓰기가 이뤄지기 때문에 프리징이 발생합니다.

다른 예로 Adobe Premiere 도 파일을 내보낼 때 SSD로 저장시 그 데이터가 용량이 과하거나 다른 읽기/쓰기 작업시 저장을 시도하면 프로그램이 다운되거나 짧은 프리징이 간헐적으로 발생하는 경우도 생깁니다.


이 게임 또한 정확한 원인분석은 아니지만 HDD에 기록된 프로그램은 HDD의 한계속도 이상의 데이터 처리가 힘든 반면 그에 비교할 수 없는 속도로 데이터가 들어오거나 나가면서 프리징이 발생하는 것이 아닌가 생각합니다.


그렇게 생각하는 이유는 바로 이 부분에 있습니다.

SSD 프리징은 다른 하드웨어 간의 속도차에 의해 프리징이 발생하는 경우가 대다수입니다.

이 점에 착안한다면 서로 다른 속도의 보조 저장 매체의 속도차가 생기지 않게 동등한 디스크에 저장하면 되지 않느냐는 것입니다.

그래서 저는 내 문서에 있는 게임 프로필 파일을 전부 잘라내어 게임 폴더 안에 넣은 뒤(같은 디스크라면 SSD든 HDD든 어디든 상관 없습니다. 환경 파일이 아닌 게임을 옮겨가도 됩니다.) cmd를 열고 아래의 작업을 수행하였습니다.


cmd 실행


C:\Users\nazuna>cd Documents <- 내 문서 이동

C:\Users\nazuna\Documents>rd "Euro Truck Simulator 2" <-기존 게임 디렉토리 삭제(하위 파일들은 미리 옮겨두세요)

C:\Users\nazuna\Documents>mklink /d "Euro Truck Simulator 2" "D:\Program Files (x86)\Euro Truck Simulator 2"

<- 동일한 디렉토리 명으로 실제 이동한 파일이 위치한 디렉토리로 링크


내 문서 위치

XP이하 : C:\Documents and Settings\User name\My Documents

7이상 : C:\Users\User name\Documents


위 작업을 통해 실질적 데이터는 HDD로 옮기고 프로그램이 인지하는 C:\Users\nazuna\Documents\Euro Truck Simulator 2 는 링크화 하여 이동된 파일의 디렉토리를 지정했습니다.

프로그램은 SSD의 위 경로에 파일이 있는 것으로 인지하지만 실질적 파일은 HDD에 있는 거지요.


이렇게 세팅하기전과 후 플레이를 각 5시간, 10시간 씩 테스트를 하였습니다.

게임 자체가 HDD에 있는 만큼 그에 따른 약간의 딜레이는 가끔 발생하지만(그래픽 설정을 조금 낮추면 이마저도 안나타 나더군요. 이건 그래픽이 문젠가?) 결과적으로 프리징은 전혀 발생하지 않았습니다.


프리징 최적화를 하고 팁을 보아도 문제 해결이 안되거나 특정 프로그램 구동시에만 프리징이 발생한다면 이와 같이 프로그램이 사용하는 디렉토리들을 점검해 보아야 하지 않나 생각합니다.


컴퓨터 파워가 약해도 프리징은 발생합니다.

제 워크스테이션은 서버로 구동중입니다.

어느날 뜬금없이 프리징이 걸려 로그를 보니 글쎄 파워가 부족으로 인한 시스템 다운이 기록되어져 있네요..

파워가 약할리가 없는데 하고 보니 글쎄 파워가 노후화가 되어 파워공급이 불안정했더군요..

일정 수치 이하로 떨어졌을 때 프리징이 발생했던 거였습니다..


컴퓨터 파워 공급도 프리징의 한 축이 되니 파워도 점검을 해보아야 할 것입니다.

,

출처 : http://itguru.tistory.com/36


게시글 삭제 혹은 블로그 폐쇠 방지를 위해 해당 부분만 스크랩.


 scanf 함수의 고질적인 문제 및 해결책
 

scanf 함수를 사용하다 보면 다음과 같이 입력을 받지 않고 넘어가는 경우가 종종 있다.

    printf("숫자를 입력하세요 : ");
    scanf("%d", &num);

    printf("문자를 입력하세요 : ");
    scanf("%c", &c);

로 하면 "문자를 입력하세요 : " 부분이 실행되지 않고 넘어간다. 
이러한 일이 발생하는 원인과 해결책은 여기를 누르면 알 수 있다. 이 글에 제시된 해결책 보다 조금 높은 수준을 원한다면 * 문자를 활용하면 된다. 앞에서 말했듯이 * 문자는 stdin 에서 입력은 받지만 그 데이터는 버려버리는 특징을 이용하면

scanf("%d", &num);
scanf("%*c%c", &c);

와 같이 하면 된다. 왜냐하면 "%*c%c" 라는 형식 문자열의 의미는 "stdin 에서 한 문자를 얻어오되 그 값은 버리고 (이 경우 \n 이 버려진다), 그 다음에 한 문자를 얻어와 이에 대응되는 인자 (&c) 에 저장한다" 이기 때문이다. 

하지만 이러한 문제를 가장 잘 해결하는 방법은 fgets 함수를 이용하는 것이다. 

  scanf 함수 사용시 주의할 점
 

scanf 함수는 문자열 입력시 입력받을 문자열의 최대 개수를 제한을 두지 않으므로 버퍼 오버플로우가 발생할 여지가 충분히 있다. 이를 해결하기 위해서는 역시 fgets 함수를 이용하거나 폭을 지정해 주면 된다. 예를 들어서

char str[10];
scanf("%9s", str);

와 같이 한다면 우리가 stdin 에 아무리 많이 입력해도 scanf 는 오직 9 문자만을 취하므로 안전하게 입력이 가능하다. (배열의 크기는 10 이지만 NULL 문자를 위해서 9 자만 입력해야 한다) 하지만 이와 같이 할 경우에도 문제가 있는데, 사용자가 9 문자 보다 많이 입력했을 경우 scanf 는 오직 9 문자만을 처리하므로 일부 문자가 버퍼에 남아 있어서 다음번 입력 시 차질이 생긴다. 이는 다음과 같이 해결 할 수 있다.

scanf("%9s%*s", str);

왜냐하면 처음 %9s 를 통해서 9 문자만 입력 받고 stdin 에 남아있는 나머지 문자열들은 %*s 가 날려버리기 때문이다. 

  실행 예제
 

/* 각 형식에 맞는 입력을 받은 뒤 이를 출력한다.*/
#include <stdio.h>
int main()
{
    char str[10];
    char ch;
    int dec, hex, oct;
    float db;

    printf("문자열, 문자, 십진수, 16 진수, 8 진수, 소수를 각각 입력하세요\n");
    scanf("%9s %*s %c %d %x %o %f", str, &ch, &dec, &hex, &oct, &db);

    printf("문자열 : %s \n", str);
    printf("문자 : %c \n", ch);
    printf("십진수 : %d \n", dec);
    printf("16 진수 : %x \n", hex);
    printf("8 진수 : %o \n", oct);
    printf("소수 : %f \n", db);
    return 0;
}

실행 결과


,
1
프로필 이미지
It's the Only NEET Thing to do. written by 나즈나
분류 전체보기 (256)
포트폴리오 (2)
여러가지 (160)
Windows (26)
Linux (1)
Server (5)
컴퓨터 (48)
전자기기 (3)
자격증 (3)
모바일 (1)
공유기 (4)
초소형컴퓨터 (3)