cmd에서 논리적 검색 조건을 설정합니다. if 명령 및 해당 매개변수에 대한 도움말입니다. 날짜 및 시간별로 여러 세대의 아카이브 생성

). 선택할 항목, 설치할 수 있는 항목, 설치할 수 없는 항목, 다양한 유용한 기능 등 대부분 실용적입니다. 그러나 그는 아마도 가장 흥미로운 부분인 메모리가 일반적으로 작동하는 방식과 메모리를 미세 조정하는 방법(및 오버클러킹)에 대해서는 다루지 않았습니다. 매개변수 수 측면에서 보면 RAM은 거의 PC의 가장 복잡한 요소입니다. 사용 중인 프로세서에 대해 스스로 판단하세요. 최선의 시나리오클럭 발생기(FSB, 게다가 지금은 약 15년 ​​동안 100MHz였으며 누구도 건드리지 않음), 승수(그들이 변경하는 것) 및 전압(더 높은 또는 저주파작동 안정성을 위해 전압을 항상 조정할 수 있으며 경우에 따라 전력 소비를 낮출 수 있음) 및 작동 코어 수(멀티스레딩을 끄지 않는 한 일부 작업에서는 부정적인 증가를 줄 수 있기 때문에 거의 건드릴 수 없음) ). 다른 모든 매개변수는 이미 개별적이며 모든 프로세서에 해당 매개변수가 있는 것은 아니므로 자주 건드리지 않습니다. 비디오 카드의 경우 GPU 주파수, 메모리 및 GPU 전압 등 매개 변수가 훨씬 적습니다. 그러나 RAM을 살펴보면 대기 시간, 빈도, 초당 트랜잭션 등 중요한 매개 변수의 바다를 볼 수 있습니다. - 그것이 무엇인지, 메모리 성능 및 안정성과 어떤 관련이 있는지 알아보겠습니다.

메모리 사양

먼저 메모리 사양에서 특정 숫자와 문자가 무엇을 의미하는지 이해해야 합니다. 메모리 자체나 상자 또는 메모리에서 볼 수 있습니다. 특별 프로그램 AIDA64를 입력하세요. 내 기억을 예로 들어보겠습니다. 하지만 여러분도 비슷한 데이터를 갖게 될 것입니다. AIDA64의 스크린샷은 다음과 같습니다.

기억에 관해 우리는 무엇을 볼 수 있습니까? 듀얼 채널 DDR4-3200 SDRAM(16-18-18-36-CR2)이라는 사실입니다. Google에서 칩 자체의 표시를 검색하면 PC4-17000 1.2V라는 좀 더 많은 정보를 찾을 수 있습니다. 순서대로 가보겠습니다. 듀얼 채널은 무엇을 의미합니까(싱글, 트리플 또는 쿼드를 가질 수 있지만 후자가 있다면 그것이 무엇인지 가장 잘 알 것임)? 이는 메모리가 이중 채널 모드(또는 단일 채널, 3채널, 4채널 등)에서 작동한다는 것을 의미합니다. 메모리 스틱이 하나 있으면 단일 채널 모드에서 작동합니다. 즉, 읽기 및 쓰기 특성은 표시된 것과 거의 동일합니다(실제로 모두 메모리 컨트롤러에 따라 다르며 실제로는 값은 아래 10-15%일 수 있습니다). 동일한 특성을 가진 스트립이 두 개 이상 있으면 함께 작동할 수 있습니다. 이 경우 모듈 수에 비례하여 볼륨이 증가하고 속도도 거의 선형적으로 증가합니다. 따라서 만약 당신이 단일 채널 메모리 RAM을 비디오 메모리로 사용하는 통합 그래픽, 영화를 보거나 인터넷을 서핑하는 것보다 PC에서 더 심각한 작업을 수행하는 경우 먼저 다른 RAM 스틱을 구입하여 듀얼 채널 모드로 설정해야 합니다( 이것이 수행되는 방법은 실제 기사에 기록되어 있습니다.) 이를 통해 실제로 RAM 성능이 두 배가 되기 때문입니다(음, 듀얼 채널 메모리 컨트롤러는 90% 최신 프로세서).

더 나아가 보겠습니다 - 문자 조합 DDR SDRAM (Double Data Rate 동기식 동적 랜덤 액세스 메모리 - 동기식 동적 메모리 무작위 액세스및 두 배의 데이터 전송 속도). 여기서 우리는 "데이터 전송 속도가 두 배로 빨라지는" 결말에만 관심이 있습니다. 여기서 중요한 점은 이전 유형에서는 SDRAM 메모리데이터는 상태 "0"에서 상태 "1"로 전환될 때만(신호의 가장자리를 따라) 읽혔습니다. DDR에서는 상태 "1"에서 상태 "0"으로 전환하는 동안(신호가 떨어지면서) 데이터를 읽기로 결정했습니다. 즉, 실제 메모리 주파수가 두 배가 되었습니다. 그러나 하드웨어 관점에서 볼 때 메모리 주파수는 동일하게 유지되므로 예를 들어 동일한 CPU-Z 주파수메모리는 작업 관리자의 절반입니다.


위에서 이미 설명했듯이, 이는 DDR의 특징이므로 두려워할 필요가 없습니다.

다음 - DDR4에서 4는 무엇을 의미합니까? 일반적으로 한 가지만 있습니다. 이것이 4 세대라는 것입니다. DDR 메모리. Wiki에서 모든 유형의 차이점을 볼 수 있습니다. 이것을 다시 작성하는 데 큰 의미가 없지만 주요 증가는 메모리 빈도의 증가에서 비롯된다고 말할 것입니다.

이제 전체 디자인인 DDR4-3200을 살펴보겠습니다. 많은 사람들이 3200 이후에 MHz에 서명합니다. 일반적으로 이는 완전히 정확하지 않습니다. 이것이 실제로 의미하는 것은 MT/s, 즉 초당 메가트랜잭션입니다. 이 값은 무엇입니까? 메모리에서 초당 몇 개의 연산을 수행할 수 있는지를 나타내는 값이다. DDR4 버스 너비가 64비트(또는 8바이트)라는 점을 고려하면 속도를 MB/s 단위로 얻을 수 있습니다. 이를 위해서는 3200MT/s * 8 B = 25600MB/s가 필요합니다. 그리고 여기서는 이 수치가 이미 메모리 자체에 기록되는 경우가 많다고 말해야 합니다. 제 경우에는 PC4-17000입니다. 당신은 말할 것입니다 - 17000은 25600과 같지 않습니다. 맞습니다. 제 경우에는 메모리가 오버클럭되었습니다. 실제 속도 2133MT/s에서는 17000MB/s를 얻게 됩니다. 음, PC4는 이 경우- DDR4와 동일합니다. 즉, 보시다시피 DDR4-2133과 PC4-17000은 동등한 레코드이므로 어떤 메모리를 가지고 있는지 이해하려면 둘 중 하나만 알면 충분합니다.

이제 16-18-18-36-CR2 디자인이 나옵니다. 이 수치를 설명하려면 최신 DDR 메모리가 무엇인지 살펴봐야 합니다. 본질적으로 정보를 저장하는 셀 집합입니다. 각 셀은 내부에 트랜지스터와 커패시터를 갖고 있으며, 2차원 배열다른 세포와 함께. 작동 원리는 간단합니다. 단위 비트가 셀에 기록되면 커패시터가 충전되고 0 비트가 기록되면 방전됩니다. 그런데 여기서 문제가 발생합니다. 커패시터 방전과 정보 손실을 방지하려면 지속적으로 충전해야 합니다. 따라서 PC 전원이 꺼지면 RAM의 모든 정보가 지워집니다.

RAM 작업 시 가장 큰 문제는 메모리 셀에 액세스할 때의 대기 시간입니다. 지연이 낮을수록 읽기/쓰기 속도가 빨라지고 프로세서가 RAM의 응답을 기다리는 유휴 상태가 줄어들수록 성능이 빨라지는 것이 논리적입니다. 어떤 지연이 발생하고 어떤 책임이 있는지 살펴보겠습니다.

물론 각 셀에는 고유한 "주소"가 있습니다. 대략적으로 말하면 이는 동일한 셀의 행과 열에 있는 번호입니다. 2차원 배열. 차례로, 더 많은 셀이 함께 결합됩니다. 빠른 접근그들에게는 그러한 그룹을 은행이라고합니다. 이제 메모리 컨트롤러가 무언가를 쓰려고 할 때 무슨 일이 일어나는지 봅시다. 특정 셀. 우선 행 주소를 사용하여 jar에 연결합니다. 이 신호를 RAS(Row Address Strobe)라고 합니다. 따라서 액세스 시간(대기 시간)을 RAS 대기 시간이라고 하지만 이 매개변수는 정보가 없으며 거의 ​​기록되지 않습니다. 그러나 RAS to CAS 지연 매개변수가 중요합니다. 이는 메모리 뱅크에서 원하는 라인을 검색하는 프로세스입니다. 이 매개변수는 이미 필요하며 해당 지연이 두 번째로 기록됩니다. 즉, 제 경우에는 18클럭 사이클입니다(1클럭 사이클은 메모리 버스를 따라 데이터를 전송하는 1회입니다). 좋습니다. 단 18마디만으로 올바른 선을 찾았습니다. 그러나 열도 필요합니다. 또 다른 신호인 CAS가 이를 담당하고 해당 지연이 먼저 기록됩니다. 제 경우에는 16클럭 주기입니다. 그것은 것 같습니다 - 그게 다입니다. 우리는 셀의 정확한 위치를 얻었습니다. 왜 두 개의 숫자가 더 있습니까?


모든 것이 그렇게 간단하지는 않습니다. 컨트롤러가 동일한 행의 다른 셀에 액세스해야 하는 경우가 종종 있습니다. 하지만 이렇게 하려면 먼저 문을 닫아야 합니다. 이전 세션요청(동일한 행의 다른 셀에 동시에 액세스할 수 없음) - 이 역시 시간이 걸리며 이 지연을 RAS 사전 충전이라고 합니다. 이는 행을 닫고 다시 활성화하는 시간을 나타냅니다. 세 번째로 쓰여 있는데 제 경우에는 다시 18마디입니다. 마지막 매개변수인 Cycle Time은 다음 작업에 필요한 시간을 담당합니다. 완전 개방전체 뱅크를 닫는 것, 즉 이것이 전체 메모리의 성능입니다. 네 번째로 쓰여 있는데 나에게는 36마디이다.

남은 마지막 매개변수- CR(명령 속도), 1 또는 2일 수 있습니다. 이 매개변수는 메모리 활성화와 작동 능력 사이에 통과해야 하는 시간에 해당합니다. 이는 1 또는 2 클럭 사이클입니다. 물론 1클럭 주기가 더 좋지만 이는 메모리 운에 따라 달라집니다.

물론, 클록 주기와 같은 매개변수는 그다지 명확하지 않습니다. 결과를 나노초 단위로 아는 것이 더 흥미롭습니다. 이를 위해 우리는 하나의 클록 사이클에 걸리는 시간을 알아냅니다. 이는 1/1200MHz = 0.83ns입니다(물론 실제 메모리 주파수를 사용합니다). 메모리의 사이클 타임은 36클럭 사이클, 즉 지연은 0.83ns * 36 = 30ns입니다. 그렇다면 AIDA64는 왜 약 48ns의 결과를 보일까요? 간단합니다. 프로세서 자체는 작지만 매우 짧은 시간 간격(10억분의 1초)으로 인해 신호가 내부를 통과하는 데 걸리는 시간을 고려해야 하며, 이로 인해 18ns가 추가됩니다.

기본적으로 그게 전부입니다. 이제 듀얼 채널 DDR4-3200 SDRAM(16-18-18-36-CR2)은 단순한 기호 묶음이 아니라 어떤 종류의 RAM인지 매우 정확하게 이해할 수 있는 완전히 의미 있는 매개 변수 세트입니다. 당신 앞에 있습니다.

오버클러킹 RAM

주의 깊은 독자라면 무엇이 더 중요하고 더 중요한지에 대한 질문을 가질 수도 있습니다. 고주파메모리 또는 더 낮은 타이밍(대기 시간)? 결국, 한편으로는 주파수가 높을수록 더 빠른 성능메모리와 시스템 전체. 반면, 타이밍이 낮을수록 메모리 액세스 속도가 빨라지고 유휴 상태인 CPU가 적어집니다. 즉, PC 작동 속도가 빨라집니다. 주파수가 높을수록 타이밍이 높아지는 점을 고려하면 여기서 균형을 유지해야 합니다. 아아, 모든 사람에게는 고유한 메모리가 있으므로 메모리 오버클러킹은 다양한 타이밍, 전압 및 주파수를 설정하고 시스템의 RAM 속도를 테스트하는 다소 힘든 작업입니다. 물론 모든 사람이 무차별 공격을 원하는 것은 아니기 때문에 DOCP 및 XMP 프로필을 지원하는 메모리가 판매되고 있습니다. 이는 이미 메모리에 내장된 자동 오버클럭 프로필로, 메모리 작동이 보장되는 전압, 주파수 및 타이밍이 지정됩니다. UEFI에서 원하는 프로필을 선택하기만 하면 됩니다. 이 방법의 장점은 분명합니다. 한 번의 클릭으로 오버클러킹이 가능합니다. 단점도 있습니다. 첫째, 이러한 메모리는 더 비싸고 보장된 주파수가 높을수록 더 많은 가격. 둘째, 프로필이 이상적이지 않으며 타이밍을 조정하면 성능의 5~10%를 추가로 짜낼 수 있는 경우가 많습니다.

글쎄, 마지막으로 예상되는 질문은 RAM을 오버클럭할 가치가 있습니까? 이는 모두 작업과 프로세서에 따라 다릅니다(예: 6코어 및 8코어). AMD 라이젠두 개의 프로세서 칩을 직접 연결하는 버스의 주파수는 RAM의 주파수에 따라 달라지므로 오버클러킹은 "필수"입니다. 게임에서는 상위 시스템에서만 메모리 오버클럭을 통해 상당한 성능 향상을 기대할 수 있으며, 이는 110fps와 120fps의 차이가 될 것입니다. 좋은 보너스, 반면에 그 차이는 여전히 눈에 눈에 띄지 않습니다. 글쎄요, 오버클러킹은 RAM과 밀접하게 관련된 작업(예: 프로세서에 캐시가 충분하지 않고 메모리에 자주 액세스해야 하는 보관 작업)에서 가장 두드러집니다.

랜덤 액세스 메모리: 개발 역사 및 작동 원리

본격적으로 이야기를 시작하기 전에 랜덤 액세스 메모리, 개발 및 유형을 이해하려면 그것이 무엇을 위한 것인지, 그리고 왜 현대 컴퓨터의 일부인지 이해해야 합니다.

개발의 역사를 연구하는 전문가 컴퓨터 기술, 컴퓨터의 출현과 발전이라는 험난한 길의 첫 번째 이정표는 1834년 런던에서 영국인 Charles Babbage가 분석 엔진을 개발한 것이라고 생각해 보세요. 자금 조달 문제와 기계 제작에 필요한 기술 부족으로 인해 당시에는 제작이 불가능했습니다. 이러한 사실에도 불구하고 분석 엔진은 인간의 정신이 최초로 만든 것으로 간주됩니다. 자동 장치수학적 정보를 저장하고 처리하는 최초의 컴퓨터.


배비지의 아들이 사망한 후 조립한 분석 기관의 요소 중 하나(사진: Andrew Dunn)

분석 엔진(및 최신 컴퓨터)을 구성하는 주요 구성 요소 및 요소 집합을 컴퓨터 아키텍처라고 합니다. 장치를 개발할 때 Babbage는 몇 가지 주요 부품을 확인했습니다. 첫 번째는 정보를 처리하는 "공장"입니다(현대 프로세서와 유사). 두 번째는 처리를 위해 데이터를 입력하고 그 결과를 가져오는 입출력 장치입니다. 세 번째는 중간 계산 결과가 저장되는 "창고"입니다. 네 번째는 분석 엔진의 다른 노드 간에 데이터를 전송하도록 설계된 제어 요소입니다.

모두 비슷한 아키텍처를 가지고 있습니다. 현대 컴퓨터, 산술 논리 장치(ALU), 데이터 버스, RAM 및 입출력 장치로 구성됩니다. 이러한 요소의 상호 작용은 다음 다이어그램을 사용하여 단순화된 방식으로 설명할 수 있습니다.

컴퓨터 아키텍처

모든 요소의 목적은 Babbage의 분석 엔진 구성 요소의 목적과 정확히 일치합니다. 영국 자동차의 "창고"와 같은 RAM은 들어오고 나가는 데이터와 중간 데이터가 포함된 정보의 임시 저장과 이를 처리하는 프로그램 및 알고리즘을 담당합니다.

컴퓨터 과학에서 RAM은 일반적으로 RAM(Random Access Memory)이라고도 하는데, 이는 컴퓨터의 이 요소의 본질을 더 정확하게 반영합니다.

RAM의 물리적 구현 다른 단계개발

배비지의 기계에서 운영 스토리지정보 단위의 하나 또는 다른 값에 해당하는 위치의 샤프트 및 기어의 복잡한 배열에 대한 정보가 제공됩니다. 이 접근 방식은 사소한 변경을 가한 후 꽤 오랫동안 지속되었습니다. 컴퓨팅 기계순전히 기계 장치였습니다.

전기 기계 컴퓨터와 최초의 전자 컴퓨터(컴퓨터)의 출현으로 더 빠르고 안정적인 정보 저장 방법이 탄생했습니다. 처음에는 여러 연구 센터에서 디자인과 디자인에 관해 꽤 폭넓게 실험을 했습니다. 물리적 원리저장 장치의 작동. 전기 기계 계전기, 전자기 스위치, 정전기관 및 음극선관에서 작동하는 RAM이 만들어졌습니다. 그러다가 왔어 다양한 옵션자기 저장 장치 - 자기 디스크그리고 드럼을 치는 동안 장기 보관정보는 자기 테이프에 기록되었습니다. 디스크와 드럼은 테이프에 비해 각 데이터 셀에 대한 액세스 시간이 훨씬 더 빠릅니다. 그리고 RAM의 주요 요구 사항 중 하나는 오늘날에도 고성능이었습니다.

자기 드럼(사진 출처: Wikipedia)

자기디스크나 드럼 외에도 오랫동안 빠른 기억력강자성 코어의 배열이 사용되었으며 이는 매우 고속입장. 이러한 어레이의 가장 큰 단점은 에너지 소비가 높고 크기가 매우 크다는 것입니다. 치수램.

K. Olsen이 설계한 자기 코어의 메모리 요소(1964)

보시다시피, 새로운 유형의 메모리 개발의 주요 추세는 저장된 정보의 용량을 늘리고 에너지 소비를 줄이며 각 셀과 메모리의 성능을 향상시키는 데 필요한 메모리 요소의 점진적인 소형화였으며 앞으로도 그럴 것입니다. 모듈 전체.

컴퓨터 발전의 가장 큰 원동력은 LSI(대형)의 탄생에서 비롯되었습니다. 집적 회로), 구성 큰 숫자하나의 하우징에 내장된 반도체 트랜지스터. 정보 처리 속도가 너무 빨라서 당시 존재했던 RAM의 속도로는 정보 처리 속도가 너무 부족했습니다. 정상 작동일반적으로 컴퓨터. 오늘날 우리가 여전히 사용하고 있는 근본적으로 새로운 정보 저장 방법을 개발할 필요가 있었습니다.

최신 RAM의 작동 구조 및 원리

현대 메모리 칩에서는 정보를 저장하는 두 가지 방법이 가장 널리 사용됩니다. 첫 번째는 축적된 전하를 충분히 유지하는 커패시터의 잘 알려진 특성을 기반으로 합니다. 장기, 정보 단위의 단기 저장에 사용할 수 있습니다. 두 번째는 단일 트랜지스터 트리거를 사용하여 각 정보 비트를 저장하는 것입니다. 두 가지 방법을 더 자세히 살펴보겠습니다.

동적 메모리

커패시터 셀에 정보를 기록하는 것은 이 커패시터를 논리 0 또는 1에 해당하는 레벨로 충전함으로써 수행됩니다. 제어 신호의 영향으로 열리는 커패시터에 연결된 트랜지스터는 원하는 수준의 충전을 보장합니다. 각 정보 비트 저장 셀은 한 쌍의 트랜지스터와 커패시터로 구성됩니다.

동적 메모리 셀의 개략도

가장 큰 장점은 생산 비용이 저렴하고 각 셀의 크기가 작다는 것입니다. 현대적인 요소 기반을 통해 각각에 대해 수백만 개의 유사한 쌍을 수용할 수 있습니다. 제곱밀리미터메모리 칩.

이 정보 저장 방법의 주요 단점은 커패시터의 물리적 특성으로 인한 결과입니다. 아시다시피 모든 커패시터는 아무리 철저하게 설계하고 제조하더라도 누설 전류와 같은 불쾌한 매개변수를 갖습니다. 그리고 상대 가치이 전류는 요소의 기하학적 치수에 반비례합니다. 따라서 커패시터가 방전되는 시간이 짧을수록 커패시터 자체는 작아진다. 메모리 칩에서는 각각의 크기가 용량성 소자수십 나노미터 단위로 측정되며 자체 방전 시간은 밀리초입니다. 메모리 셀에 기록된 정보가 처리에 충분한 시간 동안 저장되기 위해서는 커패시터의 자체 방전으로 인한 손실을 제거하는 빈도로 업데이트되어야 한다는 것은 매우 분명합니다. 따라서 커패시터 셀을 기반으로 한 메모리 칩에는 지속적인 프로세스저장된 정보를 업데이트합니다. 이 프로세스를 재생이라고 하며 이를 수행하기 위해 메모리 모듈에 특수 컨트롤러가 제공됩니다.

이러한 유형의 메모리를 동적이라고 합니다. 지속적인 재작성 과정으로 인해 에너지 소비가 증가하고 미세 회로가 추가로 가열될 뿐만 아니라 이러한 성능이 저하됩니다. 중요한 매개변수, 응답 시간으로.

커패시터의 또 다른 불쾌한 특성은 전기적 관성입니다. 커패시턴스를 변경하는 것은 즉각적인 과정이 아닙니다. 따라서 정보 단위를 읽고 다시 쓰는 데는 전하의 축적 또는 방출에 필요한 시간이 걸립니다.

정적 메모리

트리거 메모리 시스템에서 각 정보 비트는 실제로 6~8개의 트랜지스터 그룹인 단일 플립플롭에 저장됩니다. 트리거 상태는 제어 신호의 존재에만 의존하고 시간이 지나도(공급 전압이 있는 한) 변하지 않기 때문에 이러한 유형의 메모리를 정적 메모리라고 합니다. 정적 RAM의 가장 큰 장점은 해당 제어 신호가 요소의 입력에 적용될 때 트리거가 거의 즉시 전환되기 때문에 매우 높은 성능입니다.

단점도 꽤 뚜렷합니다. 첫 번째는 훨씬 더 많습니다. 높은 가격동적 메모리와 비교. 실리콘 조각에 6개의 트랜지스터 그룹을 만드는 것은 한 쌍의 커패시터와 트랜지스터를 만드는 것보다 훨씬 더 어렵고 비용도 많이 듭니다.

두 번째 단점은 크게 큰 사이즈이는 각 메모리 셀의 크기를 크게 증가시킵니다.

출력 대신

오늘은 정적 및 동적 유형램. 기존 메모리 모듈은 더 저렴한 동적 요소를 기반으로 구축되었습니다. 모습이는 열린 컴퓨터를 본 사람이라면 누구에게나 친숙할 것입니다. 정적 메모리는 비용과 크기를 절약하는 것보다 고성능이 더 중요한 곳에서 주로 사용됩니다. 이는 주로 프로세서 캐시 메모리입니다. 캐시 속도는 최신 프로세서의 전체 속도를 크게 결정하며, 이는 더 비싸고 빠른 RAM의 사용을 결정합니다.

현대 RAM의 또 다른 특징은 바로 변동성입니다. 커패시터 회로와 플립플롭 모두 공급 전압이 꺼질 때까지 기록된 정보를 저장합니다. 전원이 꺼지면 모든 정보는 흔적도 없이 지워집니다. 이것이 컴퓨터가 꺼진 후 오랫동안 운영 체제, 모든 서비스 및 상주 프로그램을 시작하는 데 사용되는 주된 이유입니다. 꽤 오랫동안 대규모 연구에서 센터가 온다기록된 정보를 전원 공급 없이 장기간 저장하는 비휘발성 랜덤 액세스 메모리 개발. 작동하는 프로토타입이 이미 존재하지만 대량 사용하기에는 여전히 너무 비싸고 신뢰할 수 없습니다.

매년 컴퓨터는 더욱 강력해지고 RAM은 더욱 빠르고 안정적이 됩니다. RAM 칩이 안정적으로 작동할 수 있는 빈도가 증가하고 있으며, 각 칩의 메모리 양도 빠르게 증가하고 있습니다. 각 제조업체는 최소한 어떤 면에서는 경쟁사보다 앞서려고 노력하며 이는 빠른 개발로 이어집니다. 요소 베이스그리고 오늘날 시장에 나와 있는 메모리 모듈 유형과 모델의 수가 점점 늘어나고 있습니다.

다음 기사 중 하나에서 자세히 살펴볼 것입니다. 현대 시장 RAM, 우리는 RAM의 주요 유형을 이해하고 별도로 이야기하려고 노력할 것입니다 최대 제조업체초소형 회로 및 메모리 모듈.

이 기사에서는:

  • 변수 정의
  • 변수 명령줄(bat 파일을 호출하기 위한 매개변수)
  • IF 조건 연산자
  • 기능
  • 반환 값 사용(종료 코드 처리)

변수 정의

세트<Имяпеременной>=<Значениепеременной>

SET 연산자는 매개변수 작업 기능의 확장입니다. 운영 체제. 해당 이름이 백분율 기호 사이에 사용될 때마다 해당 이름을 값으로 대체하는 변수를 지정합니다. 따라서 설정하면(많은 게임에서 사용하는 변수) 사운드 카드컴퓨터):

블래스터 설정=A220 I5 D1 P330

그런 다음 배치 파일에서 다음 구성을 사용할 때:

에코 %블라스터%

"A220 I5 D1 P330"이 화면에 표시됩니다. SET 문을 사용하여 정의된 변수를 호출합니다. 환경 변수실행 후 DOS가 다시 시작될 때까지 표시됩니다(메모리에서 수동으로 변경하지 않는 한). 즉, 다른 배치 파일이나 프로그램에서 지정한 후 하나의 배치 파일이나 프로그램에서 사용할 수 있습니다. 가장 유명한 것은 PATH 변수입니다. 빠른 탐색파일. 이는 autoexec.bat 파일에 설정되어 있습니다.

명령줄 변수
(bat 파일을 호출하기 위한 매개변수)

%<цифра 0-9>

다른 언어와 마찬가지로 배치 파일 언어에서도 bat 파일의 매개변수로 전달받은 변수를 사용할 수 있습니다.

총 10개의 독립변수가 동시에 존재할 수 있습니다. 글쓰기를 위해 복잡한 프로그램하지만 이것은 꽤 작습니다. 정규직종종 3-4이면 충분합니다. 변수의 값은 명령줄의 해당 매개변수 값과 같습니다. %0 변수에는 .bat 파일의 이름과 해당 파일의 경로(지정한 경우)가 포함됩니다. 즉, 다음 매개변수를 사용하여 abc.bat 파일을 실행한 경우입니다.

abc.bat a bc def

그러면 변수 %0에는 abc.bat 값이 포함되고, %1에는 a 값이 포함되며, %2에는 bc가 포함되고, %3에는 def가 포함됩니다. 이 속성은 반복 작업을 처리할 때 다양한 배치 파일을 만드는 데 널리 사용됩니다.

명령줄에서 10개 이상의 변수를 가져오려면 SHIFT 명령을 사용할 수 있습니다.

SHIFT 명령을 사용하면 10개 이상의 명령줄 매개변수를 사용할 수 있지만 해당하는 이전 매개변수는 손실됩니다. 즉, SHIFT 명령은 모든 변수 값을 한 단계 왼쪽으로 이동시킵니다. 즉, 변수 %0에는 이전에 변수 %1에 포함된 값이 포함되고, 변수 %1에는 이동 전 변수 %2의 값이 포함됩니다. 하지만, 이 작업즉, 변수를 다시 되돌릴 수 없습니다.

IF 조건 연산자

다행스럽게도, 명령 해석기최신 Windows 2000 이상의 cmd.exe는 분기 구문의 명령 블록을 지원하므로 레이블이 있는 IF를 사용할 필요가 없습니다. 명령 블록은 괄호로 묶입니다. 다음과 같습니다(C/C++ 들여쓰기 스타일 모방).

if 조건 (

'then' 분기의 Rem 명령

렘...

) 또 다른 (

'else' 분기의 Rem 명령

렘...

구체적인 예용도:

@에코 꺼짐

빌드모드=%1로 설정

if "%BUILDMODE%" == "" (

에코 실패: 인수가 필요합니다 ^(--debug, --release^)

종료 /b 1

rem 처리를 단순화하기 위해 인수에서 모든 하이픈을 제거합니다.

BUILDMODE=%BUILDMODE:-=% 설정

if "%BUILDMODE%" == "디버그"(

CCFLAGS=/Od /MDd /Z7로 설정

) 또 다른 (

CCFLAGS=/O2 /MD를 설정합니다.

제 생각에는 이것이 함께 사는 것이 가능하다고 생각합니다. 하지만 늘 그렇듯이 인생은 생각만큼 단순하지 않습니다. 한 가지 문제가 있습니다. then 및 else 블록에 사용된 변수는 실행 중이 아니라 블록 실행이 시작되기 전에 확장됩니다. 위의 예에서는 문제가 발생하지 않지만 다음에서는 문제가 발생합니다.

if "%BUILDMODE%" == "디버그"(

Echo INFO: 디버그 환경 모드 설정

OPTFLAGS=/Od 설정

CCFLAGS=%OPTFLAGS% /MDd /Z7 설정

) 또 다른 (

Echo INFO: 환경 해제 모드 설정

OPTFLAGS=/O2 설정

CCFLAGS=%OPTFLAGS% /MD 설정

문제는 두 블록 모두 해당 블록 실행 중에 OPTFLAGS 변수가 변경되기 전에 대체가 발생한다는 것입니다. 따라서 CCFLAGS는 이 if 블록이 실행될 당시 OPTFLAGS가 가지고 있던 값으로 채워질 것입니다.

이 문제는 지연된 변수 확장을 사용하여 해결됩니다. !…에 포함된 변수 %...% 대신 직접 사용하는 순간에만 그 의미가 드러납니다. 이 모드기본적으로 비활성화되어 있습니다. cmd.exe를 호출할 때 /V:ON 스위치를 사용하거나 다음 명령을 사용하여 활성화할 수 있습니다.

bat 파일 자체의 텍스트에 있습니다. 나에게는 두 번째 방법이 더 편리한 것 같습니다. 누군가에게 특정 매개변수를 사용하여 스크립트를 실행하도록 요구하는 것은 그다지 멋진 일이 아닙니다.

그렇다면 이전의 "잘못된" 예는 다음과 같이 수정될 수 있습니다.

setlocal 활성화 지연확장

if "%BUILDMODE%" == "디버그"(

Echo INFO: 디버그 모드 환경 설정

OPTFLAGS=/Od 설정

CCFLAGS=!OPTFLAGS를 설정하세요! /MDd /Z7

) 또 다른 (

Echo INFO: 릴리즈 모드 환경 설정

OPTFLAGS=/O2 설정

CCFLAGS=!OPTFLAGS를 설정하세요! /MD

이제 이것은 거의 완전한 if-then-else 블록입니다. 거의, echo 명령 중 하나에서 닫는 괄호를 만나면 ^ 문자로 이스케이프해야 하기 때문입니다. 그렇지 않으면 파서가 혼란스러워질 것입니다...

그러나 어쨌든 이것은 엄청난 수의 태그와 전환보다 훨씬 낫습니다.

기능

bat 파일에 함수를 만들 수 있나요? 그래 넌 할수있어. 더욱이 때로는 필요할 때도 있습니다. 사실, 조건부로 함수라고 부를 수 있습니다.

call 명령에 대한 특별한 구문이 있는데, 이를 통해 이 호출이 이루어진 위치를 기억하면서 동일한 bat 파일의 표시로 이동할 수 있습니다.

호출:레이블 인수

함수는 다음 명령과 함께 반환됩니다.

종료 /b [선택적 반환 코드]

여기서 /b 키는 매우 중요합니다. 이 키가 없으면 함수가 종료되지 않고 일반적으로 스크립트가 종료됩니다.

자세한 내용을 보려면 명령줄에 다음을 입력하세요.

부르다/?

출구 /?

흥미롭게도 이 구문을 사용하는 call 명령은 다음을 사용한 재귀 호출을 지원합니다. 자동 생성가변 인수 %0-%9에 대한 새 프레임. 때로는 이것이 유용할 수 있습니다. 여기 전형적인 예명령 언어에서 계승의 재귀 계산:

@에코 꺼짐

호출:계속 %1

%RESULT% 에코

출구

rem 계승값을 계산하는 함수

렘 로그인:

rem % 1 계승을 계산하려는 숫자입니다

렘 출력:

rem %RESULT% 계승값

:계승

%1 == 0(

결과=1로 설정

/b 종료

%1 == 1(

결과=1로 설정

/b 종료

/a PARAM=%1 - 1로 설정

호출:팩토리얼 %PARAM%

/a 결과=%1 * %RESULT% 설정

종료 /b

작업 예:

> 팩토리얼.bat 10

3628800

반환 값 사용
(처리 프로그램 종료 코드)

프로그램이 작업을 완료하면 종료 코드를 운영 체제에 반환합니다. 성공적으로 완료되면 0을 반환하고, 그렇지 않으면 오류 코드를 반환하는 것이 일반적입니다. 때때로 또는 오히려 자주 프로그램은 해당 작업의 일부 세부 사항을 배치 파일에서 "학습"할 수 있도록 "의도적으로" 0이 아닌 값을 반환합니다. 예를 들어 프로그램은 누른 키의 코드를 반환하고 .bat 파일은 이를 기반으로 다양한 작업을 수행합니다.

배치 파일은 실행된 프로그램의 종료 코드를 어떻게 찾을 수 있습니까? 이 목적을 위해 ERRORLEVEL 키 변수가 제공됩니다.

오류 수준이 있는 배치 파일의 예:

@에코 꺼짐

REM prg1.exe 프로그램을 실행합니다.

PRG1.EXE

REM 완성 코드 분석

오류 수준 2가 파일을 찾을 수 없는 경우

오류 수준 1이 WRITEERROR로 이동하는 경우

오류 수준이 0이면 종료하세요.

ONEXIT로 이동

:파일을 찾을 수 없습니다

에코 오류! 파일을 찾을 수 없습니다!

ONEXIT로 이동

:작성자 오류

ECHO 녹음 오류입니다!

ONEXIT로 이동

:EXITOK

ECHO 프로그램이 성공적으로 완료되었습니다.

ONEXIT로 이동

:ONEXIT

종료 코드 분석은 0부터 시작되지 않고 가능한 최대값부터 시작됩니다. 사실 이러한 검사는 "오류 수준이 해당 값보다 크거나 같으면..."을 의미합니다. 즉, 0부터 시작하여 확인하면 첫 번째 줄의 모든 값이 true가 되며 이는 잘못된 것입니다.

이는 이러한 종류의 프로그램에서 가장 흔히 발생하는 오류입니다.

아니요 표준 방법대부분의 작성자와 유지 관리 담당자가 프로그래밍 개념을 이해하지 못하거나 배치 파일에 적용되지 않는다고 믿기 때문에 배치 파일을 만듭니다.

하지만 저는 프로그래머입니다. 저는 컴파일에 익숙하고 디버거에도 익숙합니다. 배치 파일컴파일되지 않았고 디버거를 통해 실행할 수 없기 때문에 불안해집니다. 나는 당신이 생각하는 대로 그것이 이루어질 것이라는 확신을 가질 수 있도록 당신이 쓰는 내용에 대해 좀 더 엄격해질 것을 제안합니다.

다음과 같은 몇 가지 코딩 표준이 있습니다. if 문을 작성하는 경우 다음을 사용해야 합니다. 바지 멜빵, else 절이 없더라도 마찬가지입니다. 미묘하고 디버깅하기 어려운 문제를 방지하고 명확하게 읽을 수 있습니다. 이 추론을 배치 파일에 적용할 수 없는 이유는 없습니다.

코드를보세요.

존재하는 경우 somefile.txt 존재하는 경우 someotherfile.txt SET var=somefile.txt,someotherfile.txt

HELP IF 명령의 if 구문은 다음과 같습니다.

IF ERRORLEVEL 번호 명령 IF string1==string2 명령 IF EXISTS 파일 이름 명령 ... IF EXIST 파일 이름(명령) ELSE(기타 명령)

따라서 if를 명령으로 연결합니다.

위에서 언급한 표준 표준 인코딩 규칙을 사용하는 경우 항상 괄호를 사용하고 싶을 것입니다. 예제 코드에 대해 이를 수행하는 방법은 다음과 같습니다.

존재하는 경우 "somefile.txt" (존재하는 경우 "someotherfile.txt" (SET var="somefile.txt,someotherfile.txt"))

형식을 명확하게 지정하고 들여쓰기 형식을 제공해야 합니다. 코드에서 수행하고 배치 스크립트에서 수행해야 합니다.

또한 항상 파일 이름을 참조하고 인용 권한을 얻는 습관을 들여야 합니다. HELP FOR 및 HELP SET에는 문자열을 다시 인용할 때 불필요한 따옴표를 제거하는 데 도움이 되는 여러 단어가 있습니다.

귀하의 의견을 듣고 원래 질문을 다시 읽으면 존재하는 파일의 쉼표로 구분된 목록을 생성하려는 것 같습니다. 이 경우 if / else 문을 여러 개 사용할 수 있지만 이로 인해 논리가 중복되어 파일이 세 개 이상 있으면 정리되지 않습니다.

가장 좋은 방법은 단일 파일의 존재를 확인하고 다음과 같은 경우 변수에 추가하는 서브루틴을 작성하는 것입니다. 지정된 파일그런 다음 확인하려는 각 파일에 대해 이 루틴을 호출하면 됩니다.

이 기사에서 우리는 살펴볼 것입니다 조건부 연산자명령줄(CMD)인 경우. 다른 프로그래밍 언어와 마찬가지로 조건문은 주어진 조건을 테스트하고 결과에 따라 하나 또는 다른 작업을 수행하는 데 사용됩니다.

조건부 cmd if 문에는 VBScript(“” 항목 참조) 및 Jscript(“” 항목 참조) 스크립트 서버 언어의 유사한 구문과 거의 동일한 구문이 포함되어 있습니다.

if 문 명령줄

if 조건(문1)

처음에는 확인 중조건이 만족되면 연산자 1의 실행으로 전환되고, 그렇지 않으면 연산자 2의 실행으로 전환됩니다. 이후라면 예어등록하면 그렇지 않다(그렇지 않다면), 그런 다음: 조건을 확인하고, 충족되지 않으면 연산자 1로 이동하고, 조건이 충족되면 연산자 2로 이동합니다. 괄호 사용은 선택 사항이지만, 조건을 확인한 후 여러 개의 cmd if 문을 한 번에 실행해야 하는 경우에는 괄호가 필요합니다.

열어보자 메모장 편집기++ 그 안에 다음 코드를 작성합니다.

여기서는 이전과 마찬가지로 스크립트에 전달된 매개변수를 확인하고 값이 1이면 세 가지 명령이 순차적으로 실행됩니다.

  • 호스트 이름– 컴퓨터 이름을 표시합니다
  • 버전– OS 버전을 표시합니다
  • IP구성 /모두– 네트워크 설정을 표시합니다

을 위한 순차적 실행명령에서는 연결 기호 "&"를 사용했습니다. 조건이 충족되지 않으면 유틸리티가 호출됩니다. netstat.

변수의 존재를 확인하기 위해 연산자가 사용됩니다. 정의된 경우(변수가 존재하는 경우) 및 정의되지 않은 경우(변수가 존재하지 않는 경우):

@ echo off set Var1 =100 정의된 경우 Var1(echo % Var1% ) set Var1 = 정의되지 않은 경우 Var1(echo NOT EXIST!!! Var1)

당신이 실행하는 경우 이 코드을 클릭하면 명령줄 창에 두 줄이 표시됩니다.

100
존재하지 않습니다!!! Var1

먼저 스크립트는 Var1 변수를 생성하고 여기에 값 100을 할당한 다음 확인합니다. Var1 변수가 존재하면 해당 값을 인쇄합니다. 그런 다음 변수를 삭제하고 다시 검사를 실행합니다. 변수 Var1이 존재하지 않으면 NOT EXIST!!! 줄을 인쇄합니다. Var1.

우리는 조건부 if 문을 중첩된 문으로 사용할 권리가 있습니다.

@ echo off if "%1" =="1" (@ if "%2" =="2" (호스트 이름 & 버전) else (버전) ) else (호스트 이름 & 버전 & netstat -a)

이 예에서 첫 번째 명령줄 문은 첫 번째 인수가 1인지 확인하고, 그렇다면 두 번째 조건문이 실행되고 다른 인수의 값이 확인됩니다.

메모!!! 모든 변수는 문자열로 정의됩니다. 조건을 테스트할 때 변수 및 값 이름을 큰따옴표, 매개변수나 인수에 공백이 포함될 수 있거나 변수에 값이 전혀 없을 수 있으므로 오류를 방지합니다.

이제 이 예를 살펴보겠습니다.

이 경우 SLOVO, slovo, SloVo 등의 문자열을 전달하고 대소문자 구분이 비활성화되므로 "slovo"라는 문자열이 콘솔 화면에 표시됩니다.

If 문 명령줄, 비교 연산자

비교 연산자 “==” 외에도 다른 연산자를 사용하여 조건을 확인할 수 있습니다.

  • 에퀴"같음". 값이 같으면 True를 반환합니다.
  • 네크"같지 않음". 값이 동일하지 않으면 True를 반환합니다.
  • ㅋㅋㅋ"더 적은". value1이 value2보다 작으면 True를 반환합니다.
  • LCQ"작거나 같음". value1이 value2보다 작거나 같으면 True를 반환합니다.
  • gtr"더". value1이 value2보다 크면 True를 반환합니다.
  • 게크"더 많거나 같음". value1이 value2보다 크거나 같으면 True를 반환합니다.

이번 글에서는 if 명령줄 조건문을 살펴보았습니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: