비동기 파일 입력 출력 c. 용어: 데이터 입출력 동기 및 비동기. 예: 대기 타이머 사용

애플리케이션 프로그래머는 시스템 프로그램이 장치 레지스터와 함께 작동하는 방식과 같은 사항에 대해 생각할 필요가 없습니다. 시스템은 애플리케이션의 장치에 대한 하위 수준 작업 세부정보를 숨깁니다. 그러나 폴링과 인터럽트로 I/O를 구성하는 것의 차이점은 동기 및 비동기 I/O를 위한 함수 형태로 시스템 기능 수준에도 반영됩니다.

기능 실행 동기식 I/O I/O 작업을 시작하고 해당 작업이 완료될 때까지 기다리는 작업이 포함됩니다. I/O가 완료된 후에만 함수는 호출 프로그램으로 제어를 반환합니다.

동기식 I/O는 프로그래머가 장치를 사용하는 가장 친숙한 방법입니다. 표준 프로그래밍 언어 입력/출력 루틴은 이러한 방식으로 작동합니다.

함수 호출 비동기 I/O 해당 작업만 시작한다는 의미입니다. 그런 다음 함수는 작업이 완료될 때까지 기다리지 않고 즉시 호출 프로그램에 제어를 반환합니다.

예를 들어 비동기 데이터 입력을 생각해 보세요. 입력이 완료되었다는 것이 확인될 때까지 프로그램은 데이터에 접근할 수 없다는 것이 분명합니다. 그러나 프로그램이 지금은 유휴 상태로 기다리지 않고 다른 작업을 수행할 수 있는 가능성이 높습니다.

조만간 프로그램은 입력된 데이터로 작업을 시작해야 하지만 먼저 비동기 작업이 이미 완료되었는지 확인하세요. 이를 위해 다양한 운영 체제에서는 세 그룹으로 나눌 수 있는 도구를 제공합니다.

· 작업이 완료되기를 기다리고 있습니다. 이는 "동기 작업의 후반부"와 같습니다. 프로그램은 먼저 작업을 시작한 다음 몇 가지 외부 작업을 수행하고 이제 동기 입력/출력과 마찬가지로 작업이 끝날 때까지 기다립니다.

· 작업 완료를 확인합니다. 이 경우 프로그램은 기다리지 않고 비동기 작업 상태만 확인합니다. 입력/출력이 아직 완료되지 않은 경우 프로그램은 한동안 걸을 수 있는 기회를 갖습니다.

· 완료 절차 지정. 이 경우 비동기 작업을 시작할 때 사용자 프로그램은 작업이 완료된 후 시스템에서 호출해야 하는 사용자 프로시저나 함수의 주소를 시스템에 나타냅니다. 프로그램 자체는 더 이상 입력/출력 진행에 관심이 없을 수 있습니다. 시스템은 적절한 시점에 호출을 통해 이를 알려줍니다. 지정된 기능. 이 방법은 사용자가 완료 절차에서 어떤 작업이든 제공할 수 있으므로 가장 유연합니다.

Windows 애플리케이션에서는 비동기 작업을 완료하는 세 가지 방법을 모두 사용할 수 있습니다. UNIX에는 비동기 I/O 기능이 없지만 추가 프로세스를 실행하여 다른 방법으로 동일한 비동기 효과를 얻을 수 있습니다.

비동기 I/O는 경우에 따라 성능을 향상시키고 추가 기능을 제공할 수 있습니다. 기능성. 그런 것 없이 가장 간단한 형태"기다림 없는 키보드 입력"과 같은 비동기 입력, 수많은 컴퓨터 게임그리고 시뮬레이터. 동시에 비동기 작업을 사용하는 프로그램의 논리는 동기 작업보다 더 복잡합니다.

위에서 언급한 동기/비동기 작업과 이전 단락에서 설명한 입력/출력 구성 방법 사이의 연결은 무엇입니까? 이 질문에 스스로 답해보세요.

다중 스레드를 사용하는 비동기 I/O

중첩 및 확장 I/O를 사용하면 OS가 이 기능을 지원하기 위해 자체 스레드를 생성하더라도 I/O가 단일 스레드 내에서 비동기적으로 수행될 수 있습니다. 어떤 형태로든 이러한 유형의 메서드는 단일 스레드 시스템에서 비동기 작업을 수행하는 제한된 형태를 지원하기 위해 많은 초기 운영 체제에서 자주 사용됩니다.

그러나 Windows에서는 멀티스레딩 지원을 제공하므로 독립적으로 실행되는 여러 스레드에서 동기 I/O 작업을 수행하여 동일한 효과를 얻을 수 있습니다. 이러한 기능은 이전에 다중 스레드 서버와 grepMT 프로그램(7장)을 사용하여 시연되었습니다. 또한 스레드는 비동기 I/O 작업을 수행하는 개념적으로 일관되고 훨씬 간단한 방법을 제공합니다. 프로그램 14.1 및 14.2에 사용된 방법의 대안은 각 스레드에 자체 파일 설명자를 제공하여 각 스레드가 네 번째 레코드를 모두 동기적으로 처리할 수 있도록 하는 것입니다.

이러한 스레드 활용 방법은 atouMT 프로그램에서 시연되는데, 책에는 나오지 않지만 웹사이트에 게시된 자료에는 포함되어 있습니다. atouMT 프로그램은 어떤 사람의 통제 하에서도 실행될 수 있을 뿐만 아니라 윈도우 버전, 그러나 이 경우 리소스 사용을 계산하는 것이 덜 복잡하기 때문에 비동기 I/O 프로그램의 두 버전 중 하나보다 간단합니다. 각 스레드는 단순히 자체 스택에 자체 버퍼를 유지하고 일련의 동기식 읽기, 변환 및 쓰기 작업을 반복합니다. 동시에 프로그램 성능은 상당히 높은 수준으로 유지됩니다.

메모

웹 사이트에 있는 atouMT.c 프로그램에는 여러 스레드가 동일한 파일에 동시에 액세스하도록 허용할 때 발생할 수 있는 몇 가지 함정에 대한 설명이 포함되어 있습니다. 특히, 모든 개별 파일 핸들은 DuplicateHandle 함수가 아닌 CreateHandle 함수를 사용하여 생성되어야 합니다.

개인적으로 저는 비동기 I/O보다는 멀티스레드 파일 처리를 선호합니다. 스레드는 프로그래밍하기가 더 쉽고 대부분의 경우 더 나은 성능을 제공합니다.

이 일반 규칙에는 두 가지 예외가 있습니다. 첫 번째는 이 장의 앞부분에서 설명한 것처럼 처리되지 않은 작업이 하나만 있을 수 있고 파일 설명자를 동기화 목적으로 사용할 수 있는 상황에 관한 것입니다. 두 번째로 더 중요한 예외는 비동기 I/O 완료 포트의 경우 발생하며 이에 대해서는 이 장의 끝 부분에서 설명합니다.

Let's Build a Compiler 책에서 발췌! 크렌쇼 잭

프롤로그 프로그래밍 책에서 저자 Kloksin U.

The C# 2005 프로그래밍 언어 및 .NET 2.0 플랫폼 책에서 발췌. 트로엘센 앤드류

Informix Database Administrator's Guide 책에서 발췌. 저자 쿠스토프 빅토르

Microsoft Visual C++ 및 MFC 책에서 발췌. Windows 95 및 Windows NT용 프로그래밍 작가 프롤로프 알렉산더 뱌체슬라보비치

2.2.3.2 비동기 I/O I/O 작업 속도를 높이기 위해 서버는 자체 AIO(비동기 I/O) 패키지 또는 KAIO(커널 비동기 I/O) 패키지(사용 가능한 경우)를 사용합니다. 사용자 I/O 요청은 비동기적으로 처리됩니다.

객체 지향 프로그래밍의 기초 책에서 메이어 베르트랑

I/O 아시다시피 연산자는<< и >> 교대 근무를 수행하다 수치특정 수의 비트만큼 왼쪽과 오른쪽으로. 우리 책에 있는 프로그램도 이 명령문을 사용하여 키보드로 정보를 입력하고 이를 화면에 표시합니다.

시스템 프로그래밍 책에서 윈도우 환경 하트 존슨 M

입력 및 출력 두 개의 KERNEL 라이브러리 클래스는 기본 입력 및 출력 기능을 제공합니다: FILE 및 STD_FILES FILE 유형의 객체 f에 정의된 작업 중에는 다음이 있습니다: create f.make ("name") -- f를 이름이 지정된 파일과 연결합니다. f.open_write -- 쓰기를 위해 f 열기 f.open_read -- 쓰기를 위해 f 열기

프로그래밍 루비 [언어 이데올로기, 응용 이론 및 실습] 책에서 풀턴 할

14장 비동기 I/O 및 완료 포트 I/O 작업은 본질적으로 다른 유형의 처리보다 느립니다. 이러한 속도 저하의 원인은 다음과 같습니다. 검색에 소요된 시간으로 인한 지연

인공 지능을 위한 프롤로그 프로그래밍 책에서 저자 브라트코 이반

10.1.7. 단순 I/O 여러분은 이미 커널 모듈의 일부 I/O 방법에 익숙합니다. 발신자를 지정하지 않고 전화를 걸었습니다. 여기에는 get 및 puts 기능과 print, printf 및 p가 포함됩니다(후자는 우리가 이해할 수 있는 방식으로 인쇄하기 위해 객체의 검사 메소드를 호출합니다).

개인용 컴퓨터를 위한 C 프로그래밍 언어 책에서 저자 보흐코프 S.O.

예제를 사용한 Linux 프로그래밍 책에서 작가 로빈스 아놀드

6장 입력과 출력 이 장에서는 파일에 데이터를 쓰고 파일에서 데이터를 읽는 데 내장된 몇 가지 기능을 살펴보겠습니다. 이러한 도구는 외부 표현의 원하는 형식을 얻기 위해 프로그램 데이터 개체의 형식을 지정하는 데에도 사용할 수 있습니다.

Java 프로그래밍의 기초 책에서 저자 수호프 S.A.

입력 및 출력 표준 C 라이브러리의 입력 및 출력 기능을 사용하면 파일에서 데이터를 읽거나 입력 장치(예: 키보드)에서 데이터를 수신하고 파일에 데이터를 쓰거나 파일로 출력할 수 있습니다. 다양한 장치(예: 프린터로) 입력/출력 기능

QT 4: C++의 GUI 프로그래밍 책에서 블란쳇 자스민

4.4. 입력 및 출력 모든 Linux I/O 작업은 파일 설명자를 통해 수행됩니다. 이 섹션에서는 파일 설명자를 소개하고, 파일 설명자를 얻고 해제하는 방법과 실행 방법을 설명합니다.

이상적인 프로그래머라는 책에서. 소프트웨어 개발 전문가가 되는 방법 작가 마틴 로버트 S.

작가의 책에서

12장: I/O 거의 모든 응용 프로그램에서는 파일을 읽거나 쓰거나 다른 I/O 작업을 수행해야 합니다. Qt는 읽고 쓸 수 있는 "장치"의 강력한 추상화인 QIODevice를 통해 탁월한 I/O 지원을 제공합니다.

작가의 책에서

입력 및 출력 또한 적절한 "입력"을 통해 결과를 얻는 것이 매우 중요하다는 것을 알았습니다. 글쓰기 프로그램 코드- 창의적인 작품. 나의 창의력은 대개 창의적인 도전에 직면할 때 가장 잘 발휘됩니다.

I/O 작업을 요청한 작업은 슈퍼바이저에 의해 명령된 작업이 완료되기를 기다리는 상태로 배치됩니다. 감독자는 완료 섹션에서 작업이 완료되었다는 메시지를 받으면 작업을 준비 상태로 전환하고 작업을 계속합니다. 이 상황은 동기식 I/O에 해당합니다. 동기식 I/O는 대부분의 운영 체제에서 표준입니다. 애플리케이션 실행 속도를 높이기 위해 필요할 때 비동기 I/O를 사용하는 것이 제안되었습니다.

비동기 출력의 가장 간단한 버전은 소위 외부 장치에 대한 버퍼링된 출력으로, 애플리케이션의 데이터가 I/O 장치로 직접 전송되지 않고 특수 시스템 버퍼로 전송됩니다. 이 경우 논리적으로 애플리케이션에 대한 출력 작업은 즉시 완료된 것으로 간주되며 작업은 장치에 데이터를 전송하는 실제 프로세스가 완료될 때까지 기다리지 않을 수 있습니다. 프로세스 실제 출력 I/O 감독자는 시스템 버퍼의 데이터를 처리합니다. 당연히 I/O 감독자의 지시에 따른 특수 시스템 프로세스가 시스템 메모리 영역에서 버퍼를 할당하는 역할을 담당합니다. 따라서 고려된 경우 출력은 첫째로 I/O 요청이 데이터 버퍼링의 필요성을 나타내는 경우, 둘째로 I/O 장치가 그러한 비동기 작업을 허용하고 이것이 UCB에 기록된 경우 비동기화됩니다. 비동기 데이터 입력을 구성할 수도 있습니다. 그러나 이를 위해서는 장치에서 읽은 데이터를 임시 저장하기 위한 메모리 영역을 할당하고 할당된 버퍼를 작업을 지시한 작업과 연결해야 할 뿐만 아니라 I/O에 대한 요청을 분할해야 합니다. 작업을 두 부분(두 요청)으로 나눕니다. 첫 번째 요청은 동기 I/O에서 수행되는 작업과 유사하게 데이터를 읽는 작업을 지정합니다. 그러나 요청의 유형(코드)은 다르며 요청은 작업이 요청에 대한 응답으로 수신하고 할당된 버퍼를 식별하는 시스템 개체의 이름(코드)이라는 하나 이상의 추가 매개변수를 지정합니다. 버퍼의 이름을 수신하면(다른 운영 체제에서도 이를 지정하기 위해 다른 용어(예: 클래스)를 사용하지만 일반적으로 이 시스템 개체를 이런 방식으로 호출합니다) 작업은 작업을 계속합니다. 비동기식 데이터 입력 요청의 결과로 태스크는 I/O 감독자에 의해 I/O 작업이 완료될 때까지 기다리는 상태가 아니라 실행 중 또는 실행 중인 상태로 유지된다는 점을 여기서 강조하는 것이 매우 중요합니다. 실행 준비 상태. 잠시 후 프로그래머가 정의한 필수 코드를 실행한 후 태스크는 I/O 작업을 완료하기 위해 두 번째 요청을 발행합니다. 물론 코드(또는 요청 이름)가 다른 동일한 장치에 대한 이 두 번째 요청에서 작업은 시스템 개체(비동기 데이터 입력을 위한 버퍼)의 이름을 지정하고, 데이터 읽기 작업이 성공하면 즉시 시스템 버퍼에서 받습니다. 데이터가 아직 외부 장치에서 시스템 버퍼로 완전히 전송되지 않은 경우 I/O 감독자는 작업을 I/O 작업 완료를 기다리는 상태로 전환하며 모든 것이 일반적인 동기 데이터 입력과 유사합니다.

일반적으로 비동기 I/O는 대부분의 다중 프로그래밍 OS에서 제공되며, 특히 OS가 스레드 메커니즘을 사용하여 멀티태스킹을 지원하는 경우 더욱 그렇습니다. 그러나 명시적인 비동기 입출력이 없는 경우 데이터 출력을 위한 독립적인 스레드를 구성하여 아이디어를 직접 구현할 수 있습니다.

I/O 하드웨어는 컬렉션으로 간주될 수 있습니다. 하드웨어 프로세서, 서로에 대해 병렬로 작업할 수 있을 뿐만 아니라 중앙 프로세서(프로세서)에 대해 상대적으로 작업할 수도 있습니다. 이러한 "프로세서"에서는 소위 외부 프로세스.예를 들어, 외부 장치(입/출력 장치)의 경우 외부 프로세스는 프린트 헤드 이동, 용지 한 위치 전진, 잉크 색상 변경, 일부 문자 인쇄 등의 작업 집합일 수 있습니다. 입출력 하드웨어를 사용하는 외부 프로세스는 서로 상호 작용하고 중앙 프로세서에서 실행되는 일반적인 "소프트웨어" 프로세스와도 상호 작용합니다. 중요한 사실은 외부 프로세스의 실행 속도가 기존 프로세스의 실행 속도(“ 내부") 프로세스. 정상적인 작동을 위해서는 외부 프로세스와 내부 프로세스를 동기화해야 합니다. 내부 프로세스와 외부 프로세스 간의 강한 속도 불일치 효과를 완화하기 위해 위에서 언급한 버퍼링이 사용됩니다. 따라서 우리는 병렬 상호작용 프로세스 시스템에 대해 이야기할 수 있습니다(6장 참조).

버퍼는 병렬 개발 중에 정보적으로 상호 작용하는 내부(소프트웨어) 및 외부 프로세스와 관련된 중요한 리소스입니다. 버퍼를 통해 데이터는 일부 프로세스에서 주소 지정이 가능한 외부 프로세스로 전송되거나(외부 장치로의 데이터 출력 작업) 외부 프로세스에서 일부 소프트웨어 프로세스로 전송됩니다(데이터 읽기 작업). 정보 상호 작용의 수단으로 버퍼링을 도입하면 이러한 시스템 버퍼를 관리하는 문제가 발생하며 이는 OS의 감독 부분을 통해 해결됩니다. 이 경우 감독자는 시스템 메모리 영역에 버퍼를 할당하고 해제하는 것뿐만 아니라 작업 상태에 따라 프로세스를 동기화하여 버퍼를 채우거나 해제하고 여유 공간이 없는 경우 대기하는 임무도 맡습니다. 사용 가능한 버퍼가 있고 입력 요청/출력에 버퍼링이 필요합니다. 일반적으로 I/O 감독자는 나열된 작업을 해결하기 위해 해당 OS에 채택된 표준 동기화 도구를 사용합니다. 따라서 OS가 상호 작용하는 애플리케이션 및 작업의 병렬 실행 문제를 해결하기 위한 도구를 개발한 경우 일반적으로 비동기 입력/출력도 구현합니다.

동기식 모델입출력. read(2) , write(2) 시스템 호출 및 해당 유사체는 데이터를 이미 읽거나 쓴 후에만 제어를 반환합니다. 이로 인해 스레드가 차단되는 경우가 많습니다.

메모

실제로는 그렇게 간단하지 않습니다. read(2)는 데이터가 장치에서 물리적으로 읽힐 때까지 기다려야 하지만 write(2)는 기본적으로 쓰기 지연 모드로 작동합니다. 데이터가 시스템 버퍼로 전송된 후 반환되지만 일반적으로 데이터는 물리적으로 장치로 전송됩니다. 이는 일반적으로 관찰된 프로그램 성능을 크게 향상시키고 write(2)가 반환된 직후 데이터의 메모리를 다른 목적으로 사용할 수 있도록 합니다. 그러나 지연 녹화에는 심각한 단점도 있습니다. 가장 중요한 점은 write(2) 의 반환 코드를 통해 즉시 물리적 작업의 결과를 학습하는 것이 아니라 반환 후 일정 시간이 지나서야 일반적으로 다음 write(2) 호출의 반환 코드를 통해 학습하게 된다는 것입니다. 일부 애플리케이션(트랜잭션 모니터, 많은 실시간 프로그램 등)의 경우 이는 허용되지 않으며 강제로 지연 녹음을 꺼야 합니다. 이는 파일이 열리고 변경될 때 설정될 수 있는 O_SYNC 플래그에 의해 수행됩니다. 파일 열기 fcntl(2) 을 호출하여.

개별 쓰기의 동기화는 fsync(2) 를 호출하여 보장할 수 있습니다. 여러 장치 및/또는 네트워크 연결을 포함하는 다양한 애플리케이션용 동기식 모델불편한. 폴링 모드에서 작업하는 것도 항상 허용되는 것은 아닙니다. 사실 select(3C)와 poll(2)은 데이터가 물리적으로 버퍼에 나타난 후에만 파일 설명자를 읽을 준비가 된 것으로 간주합니다. 그러나 일부 장치는 명시적으로 요청한 후에만 데이터를 보내기 시작합니다.

또한 일부 애플리케이션, 특히 실시간 애플리케이션의 경우 데이터가 도착하기 시작하는 정확한 순간을 아는 것이 중요합니다. 그러한 응용 프로그램의 경우 select(3C) 및 poll(2)이 고려하는 것도 허용되지 않을 수 있습니다. 일반 파일항상 읽고 쓸 준비가 되어 있습니다. 정말, 파일 시스템디스크에서 읽고 대부분의 것보다 훨씬 빠르게 작동하지만 네트워크 연결, 하지만 계속 액세스하면 약간의 지연이 발생합니다. 하드 실시간 애플리케이션의 경우 이러한 지연은 허용되지 않을 수 있지만 명시적인 읽기 요청이 없으면 파일 시스템데이터를 제공하지 않습니다!

하드 실시간 애플리케이션의 경우 I/O 문제의 또 다른 측면이 중요할 수 있습니다. 사실 하드 RT 애플리케이션은 커널보다 우선순위가 높기 때문에 비차단 애플리케이션이라도 시스템 호출을 실행합니다! - 다음으로 이어질 수 있다 우선순위 반전.

이러한 문제에 대한 해결책은 오랫동안 알려져 왔으며 비동기식 입출력이라고 합니다. 이 모드에서 I/O 시스템 호출은 장치 드라이버에 요청이 이루어진 직후, 일반적으로 데이터가 시스템 버퍼에 복사되기 전이라도 제어를 반환합니다. 요청 형성은 항목(IRP, 입력/출력 요청 패킷, 입력/출력 요청 패킷)을 대기열에 배치하는 것으로 구성됩니다. 이렇게 하려면 큐의 "꼬리"를 보호하는 뮤텍스만 간략하게 캡처하면 되므로 우선순위 역전 문제를 쉽게 극복할 수 있습니다. 통화가 종료되었는지, 종료되었는지, 데이터가 저장된 메모리를 정확히 어떻게 사용할 수 있는지 확인하기 위해 특수 API가 제공됩니다(그림 8.1 참조).


쌀. 8.1.

비동기식 모델 DEC RT-11, DEC RSX-11, VAX/VMS, OpenVMS와 같은 운영 체제의 주요 I/O 모델이었습니다. 거의 모든 사람이 어떤 형태로든 이 모델을 지원합니다. 실시간 OS. Unix 시스템은 1980년대 후반부터 비동기 I/O를 위해 호환되지 않는 여러 API를 사용해 왔습니다. 1993년에 ANSI/IEEE는 이 섹션의 뒷부분에서 살펴볼 표준화된 API를 설명하는 POSIX 1003.1b를 채택했습니다.

Solaris 10에는 비동기 I/O 기능이 libaio.so 라이브러리에 포함되어 있습니다. 이러한 기능을 사용하는 프로그램을 작성하려면 -laio 스위치를 사용해야 합니다. 비동기 I/O에 대한 요청을 생성하려면 aio_read(3AIO), aio_write(3AIO) 및 lio_listio(3AIO) 함수가 사용됩니다.

aio_read(3AIO) 및 aio_write(3AIO) 함수에는 단일 매개변수 structaiocb *aiocbp가 있습니다. aiocb 구조는 파일에 정의되어 있습니다.< aio.h>다음 필드를 포함합니다.

  • int aio_fildes - 파일 설명자
  • off_t aio_offset - 쓰기 또는 읽기가 시작되는 파일의 오프셋
  • 휘발성 void* aio_buf - 데이터를 읽어야 하거나 쓸 데이터가 있는 버퍼입니다.
  • size_t aio_nbytes - 버퍼 크기. 전통적인 read(2) 와 마찬가지로 aio_read(3AIO)는 요청된 것보다 적은 양의 데이터를 읽을 수 있지만 더 이상 읽지는 않습니다.
  • int aio_reqprio - 요청 우선순위
  • struct sigevent aio_sigevent - 요청이 완료되었음을 알리는 방법(이 섹션의 뒷부분에서 설명)
  • int aio_lio_opcode - aio_read(3AIO) 및 aio_write(3AIO)에는 사용되지 않으며 lio_listio 함수에서만 사용됩니다.

lio_listio(3AIO) 함수를 사용하면 한 번의 시스템 호출로 여러 I/O 요청을 생성할 수 있습니다. 이 함수에는 4개의 매개변수가 있습니다.

  • int 모드 - LIO_WAIT(함수는 모든 요청이 완료될 때까지 기다림) 및 LIO_NOWAIT(함수는 모든 요청이 생성된 후 즉시 제어를 반환함) 값을 사용할 수 있습니다.
  • struct aiocb *list - 요청 설명이 포함된 aiocb 구조에 대한 포인터 목록입니다.

    요청은 읽거나 쓸 수 있으며 이는 aio_lio_opcode 필드에 의해 결정됩니다. 단일 설명자에 대한 요청은 목록 배열에 나열된 순서대로 실행됩니다.

  • int nent - 목록 배열의 항목 수입니다.
  • struct sigevent *sig - 모든 요청이 완료되었음을 알리는 방법입니다. mode==LIO_WAIT인 경우 이 매개변수는 무시됩니다.

POSIX AIO 라이브러리는 요청이 완료되었음을 프로그램에 알리는 두 가지 방법(동기식 및 비동기식)을 제공합니다. 먼저 동기식 방법을 살펴보겠습니다. aio_return(3AIO) 함수는 요청 상태를 반환합니다. 요청이 이미 완료되어 성공적으로 완료된 경우 읽거나 쓴 데이터의 크기를 바이트 단위로 반환합니다. 전통적인 read(2)와 마찬가지로 aio_return(3AIO)은 파일 끝의 경우 0바이트를 반환합니다. 요청이 실패했거나 아직 완료되지 않은 경우 -1이 반환되고 errno가 설정됩니다. 요청이 아직 완료되지 않은 경우 오류 코드는 EINPROGRESS입니다.

aio_return(3AIO) 함수는 파괴적입니다. 완료된 요청에 대해 호출되면 요청 상태에 대한 정보를 저장하는 시스템 개체가 삭제됩니다. 따라서 동일한 요청에 대해 aio_return(3AIO)을 여러 번 호출하는 것은 불가능합니다.

aio_error(3AIO) 함수는 요청과 관련된 오류 코드를 반환합니다. 요청이 성공적으로 완료되면 0이 반환되고, 오류가 발생하면 오류 코드, 불완전한 요청의 경우 EINPROGRESS가 반환됩니다.

aio_suspens(3AIO) 함수는 지정된 비동기 I/O 요청 중 하나가 완료될 때까지 또는 지정된 기간 동안 스레드를 차단합니다. 이 함수에는 세 가지 매개변수가 있습니다.

  • const 구조체 aiocb *const 목록- 쿼리 설명자에 대한 포인터 배열입니다.
  • int nent - 목록 배열의 요소 수입니다.
  • const 구조체 timespec *시간 초과- 나노초 단위의 정확한 타임아웃(실제로는 해상도까지 정확함) 시스템 타이머).

목록에 나열된 작업 중 하나 이상이 완료되면 함수는 0을 반환합니다. 함수가 실패하면 -1을 반환하고 errno를 설정합니다. 함수가 시간 초과되면 -1 및 errno==EINPROGRESS 도 반환합니다.

동기 요청 상태 확인과 함께 비동기 I/O를 사용하는 예가 예제 8.3에 나와 있습니다.

Const char req="GET / HTTP/1.0\r\n\r\n"; int main() ( int s; static struct aiocb readrq; static const struct aiocb *readrqv=(&readrq, NULL); /* 소켓 열기 [...] */ memset(&readrq, 0, sizeof readrq); readrq.aio_fildes=s ; readrq.aio_buf=buf; readrq.aio_nbytes=sizeof buf; if (aio_read(&readrq)) ( /* ... */ ) write(s, req, (sizeof req)-1); while(1) ( aio_sunset (readrqv , 1, NULL); size=aio_return(&readrq); if (size>0) ( write(1, buf, size); aio_read(&readrq); ) else if (size==0) ( break; ) else if ( errno!=EINPROGRESS) ( perror("소켓에서 읽는 중"); ) ) ) 8.3. 요청 상태를 동기식으로 확인하는 비동기식 I/O입니다. 코드가 단축되고 소켓 열기 및 오류 처리가 제외됩니다.

작업 완료에 대한 애플리케이션의 비동기 알림은 다음으로 구성됩니다. 신호 생성작업이 완료되면. 이렇게 하려면 요청 설명자의 aio_sigevent 필드에 적절한 설정을 지정해야 합니다. aio_sigevent 필드는 struct sigevent 유형입니다. 이 구조는 다음에 정의되어 있습니다. 다음 필드를 포함합니다.

  • int sigev_notify - 알림 모드. 유효한 값은 SIGEV_NONE(승인을 보내지 않음), SIGEV_SIGNAL(요청 완료 시 신호 생성), SIGEV_THREAD(요청 완료 시 별도의 스레드에서 지정된 함수 실행)입니다. Solaris 10은 또한 이 장의 부록에서 설명하는 SIGEV_PORT 경고 유형을 지원합니다.
  • int sigev_signo - SIGEV_SIGNAL을 사용할 때 생성될 신호 수.
  • Union sigval sigev_value - 신호 처리기 또는 처리 함수에 전달될 매개변수입니다. 비동기 I/O에 사용되는 경우 이는 일반적으로 요청에 대한 포인터입니다.

    SIGEV_PORT를 사용할 때 이는 포트 번호와 추가 데이터를 포함하는 port_event_t 포인터 구조여야 합니다.

  • 무효 (*sigev_notify_function)(union sigval) SIGEV_THREAD가 사용될 때 호출될 함수입니다.
  • pthread_attr_t *sigev_notify_attributes- 실행될 스레드의 속성
  • SIGEV_THREAD 사용 시 sigev_notify_function.

모든 libaio 구현이 SIGEV_THREAD 알림을 지원하는 것은 아닙니다. 일부 Unix 시스템은 대신 비표준 SIGEV_CALLBACK 경고를 사용합니다. 이 강의의 뒷부분에서는 신호 알림에 대해서만 논의하겠습니다.

일부 응용 프로그램은 SIGIO 또는 SIGPOLL을 신호 번호로 사용합니다(Unix SVR4에서는 동일한 신호임). SIGUSR1 또는 SIGUSR2도 자주 사용됩니다. 이는 다른 이유로 유사한 신호가 발생하지 않도록 하기 때문에 편리합니다.

실시간 애플리케이션은 SIGRTMIN에서 SIGRTMAX까지의 신호 번호도 사용합니다. 일부 구현에서는 이 목적을 위해 특수 신호 번호 SIGAIO 또는 SIGASYNCIO를 할당하지만 Solaris 10에는 그러한 신호가 없습니다.

물론 신호로 통지된 비동기 요청을 실행하기 전에 이 신호에 대한 핸들러를 설치해야 합니다. 알림을 위해서는 SA_SIGINFO 모드에서 처리된 신호를 사용해야 합니다. signal(2) 및 sigset(2) 시스템 호출을 사용하여 이러한 핸들러를 설치하는 것은 불가능합니다. sigaction(2) 을 사용해야 합니다. sigaction을 사용하여 핸들러 설치

I/O 제어.

블록 지향장치 및 바이트 지향

주요 아이디어

열쇠원칙은 장치 독립성

· 인터럽트 처리,

· 장치 드라이버,

다양한 이유로 인해 다양한 중단이 가능하다는 것은 분명해 보입니다. 따라서 번호는 중단(소위 중단 번호)과 연결됩니다.

이 숫자는 특정 이벤트에 고유하게 해당합니다. 시스템은 인터럽트를 인식할 수 있으며, 인터럽트가 발생하면 인터럽트 번호에 해당하는 프로시저를 시작합니다.

일부 인터럽트(숫자순으로 처음 5개)는 사용을 위해 예약되어 있습니다. 중앙 프로세서 0으로 나누기 시도, 오버플로 등과 같은 특별한 이벤트가 발생한 경우(이것이 실제 내부 인터럽트 J입니다).

하드웨어 인터럽트는 실행 중인 프로그램과 관련하여 항상 비동기적으로 발생합니다. 또한 여러 가지 중단이 동시에 발생할 수 있습니다!

어떤 인터럽트를 먼저 처리할지 결정할 때 시스템이 혼동하지 않도록 하기 위해 특별한 우선순위 체계가 있습니다. 각 인터럽트에는 고유한 우선순위가 할당됩니다. 여러 인터럽트가 동시에 발생하는 경우 시스템은 우선 순위가 가장 높은 인터럽트에 우선 순위를 부여하고 나머지 인터럽트 처리를 잠시 연기합니다.

우선 순위 시스템은 두 개의 Intel 8259(또는 유사한) 칩에서 구현됩니다. 각 칩은 인터럽트 컨트롤러이며 최대 8개의 우선 순위를 제공합니다. 칩을 결합(계단식 연결)하여 시스템의 우선순위 수준 수를 높일 수 있습니다.

우선순위 레벨은 IRQ0 - IRQ15로 축약됩니다.


24. I/O 제어. 동기식 및 비동기식 I/O.

OS의 주요 기능 중 하나는 컴퓨터의 모든 입출력 장치를 관리하는 것입니다. OS는 장치에 명령을 보내고, 인터럽트를 차단하고, 오류를 처리해야 합니다. 또한 장치와 시스템의 나머지 부분 사이에 인터페이스를 제공해야 합니다. 개발 목적을 위해 인터페이스는 모든 장치 유형에 대해 동일해야 합니다(장치 독립성). IV 조절에 관한 추가 정보, 질문 23.

보호 원칙

UNIX OS는 처음부터 다중 사용자 운영 체제로 생각되었기 때문에 파일 시스템의 파일에 대한 여러 사용자의 액세스 권한을 부여하는 문제는 항상 관련이 있었습니다. 액세스 승인이란 액세스를 허용하거나 거부하는 시스템 작업을 의미합니다. 주어진 사용자에게 이 파일파일에 대해 설정된 사용자의 액세스 권한 및 액세스 제한에 따라 달라집니다. UNIX OS에서 사용되는 액세스 권한 부여 체계는 매우 간단하고 편리하며 동시에 매우 강력하여 (다단계 보안 시스템인 척하지 않는) 현대 운영 체제의 사실상 표준이 되었습니다.

파일 보호

다중 사용자 운영 체제의 관례와 마찬가지로 UNIX는 파일 및 파일 시스템 디렉터리에 대해 통일된 액세스 제어 메커니즘을 유지합니다. 파일에 대해 지정된 액세스 권한이 프로세스의 기능과 일치하는 경우에만 모든 프로세스가 파일에 액세스할 수 있습니다.

UNIX에서 무단 액세스로부터 파일을 보호하는 것은 세 가지 사실에 기초합니다. 첫째, 파일(또는 디렉터리)을 생성하는 모든 프로세스는 시스템에서 고유한 일부 사용자 식별자(UID - 사용자 식별자) 이는 새로 생성된 파일의 소유자 식별자로 해석될 수 있습니다. 둘째, 파일에 대한 액세스 권한을 얻으려고 시도하는 각 프로세스에는 이와 관련된 한 쌍의 식별자(현재 사용자 및 그룹 식별자)가 있습니다. 셋째, 각 파일은 해당 설명자(i-node)와 고유하게 연결됩니다.

마지막 사실은 더 자세히 살펴볼 가치가 있습니다. 파일 이름과 파일 자체는 동일하지 않다는 점을 이해하는 것이 중요합니다. 특히, 동일한 파일에 대한 하드 링크가 여러 개 있는 경우 여러 파일 이름은 실제로 동일한 파일을 나타내며 동일한 i-노드와 연결됩니다. 파일 시스템에 사용되는 모든 i-노드는 항상 하나의 파일에만 고유하게 해당합니다. I-노드에는 다양한 정보가 포함되어 있으며(대부분의 정보는 stat 및 fstat 시스템 호출을 통해 사용자가 사용할 수 있음), 이 정보 중에는 파일 시스템이 특정 프로세스에 액세스할 수 있는 권한을 평가할 수 있는 부분이 있습니다. 필수 모드에서 주어진 파일.

일반 원칙보호는 모든 기존 버전의 시스템에 대해 동일합니다. i-노드 정보에는 파일의 현재 소유자의 UID 및 GID가 포함됩니다(파일이 생성된 직후 현재 소유자의 식별자가 해당 유효한 식별자로 설정됨). 생성자 프로세스에 속하지만 나중에 chown 및 chgrp 시스템 호출로 변경될 수 있습니다). 또한 파일의 i-노드는 사용자(소유자)가 파일로 무엇을 할 수 있는지, 소유자와 동일한 사용자 그룹에 속한 사용자가 파일로 무엇을 할 수 있는지, 다른 사용자가 무엇을 할 수 있는지를 나타내는 척도를 저장합니다. 파일로 사용자. 작은 구현 세부 사항 다양한 옵션시스템은 다양합니다.

28. Windows NT에서 파일에 대한 액세스를 관리합니다. 접근 권한 목록입니다.

Windows NT의 액세스 제어 시스템은 액세스 작업의 세분성뿐만 아니라 다양한 액세스 주체 및 개체로 인해 달성되는 높은 수준의 유연성을 특징으로 합니다.

파일 액세스 제어

Windows NT의 공유 리소스의 경우 허용된 작업 집합, 소유자 식별자 및 액세스 제어 목록과 같은 보안 특성을 포함하는 공통 개체 모델이 사용됩니다.

Windows NT의 개체는 파일, 디렉터리, 장치, 메모리 섹션, 프로세스 등의 리소스가 공유되거나 공유될 때 생성됩니다. Windows NT의 개체 특성은 개체 유형에 따라 구성이 결정되지 않는 일반 부분과 개체 유형에 따라 결정되는 개별 부분의 두 부분으로 나뉩니다.
모든 객체는 트리 구조로 저장됩니다. 계층 구조, 요소는 분기 개체(디렉터리)와 리프 개체(파일)입니다. 파일 시스템 개체의 경우 이 관계 체계는 디렉터리와 파일의 계층 구조를 직접 반영합니다. 다른 유형의 개체의 경우 계층 관계 다이어그램에는 자체 콘텐츠가 있습니다. 예를 들어 프로세스의 경우 상위-하위 관계를 반영하고 장치의 경우 특정 유형의 장치에 대한 멤버십과 장치와 다른 장치의 연결을 반영합니다. 예를 들어 디스크가 있는 SCSI 컨트롤러입니다.

모든 유형의 개체에 대한 액세스 권한 확인은 권한 모드에서 실행되는 보안 참조 모니터를 사용하여 중앙에서 수행됩니다.

시스템용 윈도우 보안 NT는 개별 사용자와 그룹 모두 사전 정의된(내장된) 액세스 주체가 많이 존재한다는 특징이 있습니다. 따라서 시스템에는 항상 Adininistrator, 시스템 및 게스트와 같은 사용자뿐만 아니라 사용자, Adiniiiistrators, 계정 운영자, 서버 운영자, 모든 사람 및 기타 그룹이 있습니다. 이러한 기본 제공 사용자 및 그룹의 요점은 특정 권한이 부여되어 관리자가 효과적인 액세스 제어 시스템을 더 쉽게 만들 수 있다는 것입니다. 새 사용자를 추가할 때 관리자는 이 사용자를 할당할 그룹만 결정할 수 있습니다. 물론 관리자는 새 그룹을 생성할 수 있을 뿐만 아니라 기본 제공 그룹에 권한을 추가하여 자신의 보안 정책을 구현할 수도 있지만 대부분의 경우 기본 제공 그룹만으로도 충분합니다.

Windows NT는 세 가지 클래스의 액세스 작업을 지원하며 이러한 작업과 관련된 주체 및 개체 유형이 다릅니다.

□ 권한은 파일, 디렉터리, 프린터, 메모리 섹션 등 모든 유형의 개체와 관련하여 모든 유형의 주제에 대해 정의할 수 있는 작업 집합입니다. 해당 목적의 권한은 QC UNIX의 파일 및 디렉터리에 대한 액세스 권한에 해당합니다. .

□ 권한(사용자 권한) - 특정 시스템 작업(시스템 시간 설정, 파일 보관, 컴퓨터 끄기 등)을 수행하기 위해 그룹 유형의 주체에 대해 정의됩니다. 이러한 작업에는 운영 체제 전체인 특수 액세스 개체가 포함됩니다. .

하나의 기본 제공 사용자 그룹을 다른 사용자 그룹과 구별하는 것은 기본적으로 권한이 아니라 권한입니다. 기본 제공 그룹에 대한 일부 권한도 기본 제공되므로 이 그룹에서 제거할 수 없습니다. 기본 제공 그룹의 다른 권한은 삭제(또는 일반 권한 목록에서 추가)될 수 있습니다.

□ 사용자 능력은 개별 사용자가 자신의 운영 환경 형성과 관련된 작업을 수행할 수 있도록 결정됩니다(예: 기본 프로그램 메뉴 구성 변경, 실행 메뉴 항목 사용 기능 등). 기본적으로 사용자가 사용할 수 있는 환경), 관리자는 사용자가 가장 적합하다고 생각하는 운영 환경에서 작업하도록 강제할 수 있으며 발생할 수 있는 오류로부터 사용자를 보호할 수 있습니다.

그룹에 부여된 권한은 해당 구성원에게 자동으로 부여되므로 관리자는 다수의 사용자를 하나의 회계정보 단위로 취급하여 이들의 행위를 최소화할 수 있습니다.

사용자가 시스템에 로그인하면 사용자 ID와 사용자가 속한 모든 그룹의 ID를 포함하는 소위 액세스 토큰이 생성됩니다. 토큰에는 권한으로 구성되고 프로세스에서 생성된 개체에 적용되는 기본 액세스 제어 목록(ACL)도 포함됩니다. 시스템 작업을 수행할 수 있는 사용자 권한 목록입니다.

파일, 스레드, 이벤트, 심지어 액세스 토큰을 포함한 모든 개체에는 생성 시 보안 설명자가 제공됩니다. 보안 설명자에는 액세스 제어 목록(ACL)이 포함되어 있습니다.

파일 설명자- OS가 프로세스에서 연 파일에 할당한 음수가 아닌 정수입니다.

ACL(영어) 액세스 제어 목록- 액세스 제어 목록(영어로 "ekl"로 발음) - 특정 객체에 누가 또는 무엇이 액세스할 수 있는지, 그리고 이 주체가 객체에 대해 수행하는 것이 허용되거나 금지되는 작업을 결정합니다.

액세스 제어 목록은 선택적 액세스 제어 시스템의 기초입니다. ( 위키)

객체의 소유자(일반적으로 객체를 생성한 사용자)는 객체에 대한 액세스를 선택적으로 제어할 수 있으며 객체의 ACL을 변경하여 다른 사람이 객체에 액세스하는 것을 허용하거나 방지할 수 있습니다. 내장 윈도우 관리자 NT는 UNIX 수퍼유저와 달리 객체에 액세스할 수 있는 일부 권한이 없을 수 있습니다. 이 기능을 구현하기 위해 일반 사용자 ID와 마찬가지로 관리자 및 관리자 그룹 ID를 ACL에 포함할 수 있습니다. 그러나 관리자는 항상 개체의 소유자가 될 수 있고 소유자로서 전체 권한 집합을 받을 수 있으므로 여전히 모든 개체에 대해 모든 작업을 수행할 수 있습니다. 그러나 관리자는 개체의 이전 소유자에게 소유권을 반환할 수 없으므로 사용자는 관리자가 자신의 파일이나 프린터로 작업했다는 사실을 항상 알 수 있습니다.

프로세스가 Windows NT의 개체에 액세스하기 위한 작업을 요청하면 제어는 항상 보안 모니터로 전달됩니다. 보안 모니터는 액세스 토큰의 사용자 및 사용자 그룹 식별자를 개체의 ACL 요소에 저장된 식별자와 비교합니다. UNIX와 달리 Windows NT ACL 요소에는 사용자에게 허용된 작업 목록과 금지된 작업 목록이 모두 포함될 수 있습니다.

Windows NT는 새로 생성된 개체에 ACL을 할당하는 규칙을 명확하게 정의합니다. 객체를 생성할 때 호출 코드가 새로 생성된 객체에 대한 모든 액세스 권한을 명시적으로 지정하는 경우 보안 시스템은 이 ACL을 객체에 할당합니다.

호출 코드가 객체에 ACL을 제공하지 않고 객체에 이름이 있는 경우 권한 상속 원칙이 적용됩니다. 보안 시스템은 새 개체의 이름이 저장된 개체 디렉터리의 ACL을 확인합니다. 객체 디렉터리 ACL 항목 중 일부는 상속 가능으로 표시될 수 있습니다. 이는 이 디렉터리에 생성된 새 개체에 할당될 수 있음을 의미합니다.

프로세스가 생성되는 개체에 대해 ACL을 명시적으로 지정하지 않았고 디렉터리 개체에 상속 가능한 ACL 항목이 없는 경우 프로세스 액세스 토큰의 기본 ACL이 사용됩니다.


29. 자바 프로그래밍 언어. 자바 가상 머신. 자바 기술.

자바 Sun Microsystems에서 개발한 객체지향 프로그래밍 언어입니다. Java 애플리케이션은 일반적으로 컴퓨터 아키텍처에 관계없이 모든 JVM(Java Virtual Machine)에서 실행될 수 있도록 사용자 정의 바이트코드로 컴파일됩니다. Java 프로그램은 실행되는 바이트코드로 변환됩니다. 가상 기기자바( JVM) - 바이트 코드를 처리하고 인터프리터로서 장비에 명령을 전송하는 프로그램이지만, 텍스트와 달리 바이트 코드가 훨씬 빠르게 처리된다는 차이점이 있습니다.

이 프로그램 실행 방법의 장점은 바이트코드가 다른 프로그램으로부터 완전히 독립된다는 것입니다. 운영 체제및 하드웨어를 통해 해당 가상 머신이 존재하는 모든 장치에서 Java 애플리케이션을 실행할 수 있습니다. Java 기술의 또 다른 중요한 특징은 유연한 보안 시스템입니다. 프로그램 실행은 가상 머신에 의해 완전히 제어됩니다.. 프로그램에 설정된 권한을 초과하는 모든 작업(예: 무단으로 데이터에 액세스하거나 다른 컴퓨터에 연결하려는 시도)은 즉시 중단됩니다.

종종 가상 머신 개념의 단점에는 가상 머신에 의한 바이트코드 실행이 Java 언어로 구현된 프로그램 및 알고리즘의 성능을 저하시킬 수 있다는 사실이 포함됩니다.

자바 가상 머신(Java VM으로 약칭함. JVM) - 자바 가상 머신은 소위 JRE(Java Runtime Environment)라고 불리는 자바 런타임 시스템의 주요 부분입니다. Java Virtual Machine은 Java 컴파일러(javac)가 Java 프로그램의 소스 코드에서 미리 생성한 Java 바이트코드를 해석하고 실행합니다. JVM을 사용하여 다른 프로그래밍 언어로 작성된 프로그램을 실행할 수도 있습니다. 예를 들어 Ada 소스 코드는 Java 바이트코드로 컴파일되어 JVM에서 실행될 수 있습니다.

JVM은 Java 플랫폼의 핵심 구성 요소입니다. Java 가상 머신은 다양한 하드웨어에서 사용할 수 있으므로 소프트웨어 플랫폼, Java는 그 자체로 미들웨어이자 플랫폼으로 간주될 수 있으므로 "한 번 작성하면 어디서나 실행" 원칙이 적용됩니다. 여러 플랫폼에서 단일 바이트코드를 사용하면 Java를 "한 번 컴파일하면 어디서나 실행"할 수 있습니다.

런타임 환경

JVM에서 실행하려는 프로그램은 일반적으로 .class 파일로 표시되는 표준화된 이식 가능한 바이너리 형식으로 컴파일되어야 합니다. 프로그램은 서로 다른 파일에 있는 여러 클래스로 구성될 수 있습니다. 대규모 프로그램을 더 쉽게 호스팅할 수 있도록 일부 .class 파일을 소위 .jar 파일(Java Archive의 약어)로 함께 패키지할 수 있습니다.

JVM은 Sun 마이크로시스템의 HotSpot과 같은 JIT(Just-In-Time) 컴파일러를 해석하거나 사용하여 JVM용으로 작성된 명령을 에뮬레이션하여 .class 또는 .jar 파일을 실행합니다. 요즘 JIT 컴파일은 더 빠른 속도를 달성하기 위해 대부분의 JVM에서 사용됩니다.

대부분의 가상 머신과 마찬가지로 Java Virtual Machine은 마이크로컨트롤러 및 마이크로프로세서와 유사한 스택 지향 아키텍처를 가지고 있습니다.

JRE(Java Runtime Environment)의 인스턴스인 JVM은 Java 프로그램이 실행될 때 작동하게 됩니다. 실행이 완료된 후 이 인스턴스는 가비지 수집기에 의해 삭제됩니다. JIT는 애플리케이션 실행 속도를 높이는 데 사용되는 Java Virtual Machine의 일부입니다. JIT는 유사한 기능을 가진 바이트코드 부분을 동시에 컴파일하므로 컴파일에 필요한 시간이 줄어듭니다.

j2se(java 2 표준판) – 표준 라이브러리에는 다음이 포함됩니다.

GUI, NET, 데이터베이스...


30. .NET 플랫폼. 주요 아이디어 및 조항. .NET 프로그래밍 언어.

.넷 프레임 워크 - 소프트웨어 기술일반 프로그램 및 웹 응용 프로그램을 만들도록 설계된 Microsoft의 제품입니다.

Microsoft .NET의 주요 아이디어 중 하나는 다양한 언어로 작성된 다양한 서비스의 상호 운용성입니다. 예를 들어, Microsoft .NET용 C++로 작성된 서비스는 Delphi로 작성된 라이브러리에서 클래스 메서드를 호출할 수 있습니다. C#에서는 다음으로 작성된 클래스에서 상속된 클래스를 작성할 수 있습니다. 비주얼 베이직.NET에서 발생하며 C#으로 작성된 메서드에서 발생한 예외를 Delphi에서 포착하고 처리할 수 있습니다. .NET의 각 라이브러리(어셈블리)에는 해당 버전에 대한 정보가 있으므로 다른 버전어셈블리.

애플리케이션은 텍스트 편집기에서 개발하고 콘솔 컴파일러를 사용할 수도 있습니다.

Java 기술과 마찬가지로 .NET 개발 환경은 가상 머신에서 실행할 바이트코드를 생성합니다. .NET에서 이 컴퓨터의 입력 언어는 MSIL(Microsoft Intermediate Language), CIL(Common Intermediate Language, 이후 버전) 또는 간단히 IL이라고 합니다.

바이트코드를 사용하면 컴파일된 프로젝트 수준에서 크로스 플랫폼 기능을 구현할 수 있습니다(.NET 용어로: 집회), 예를 들어 C와 같은 소스 텍스트 수준에서만이 아닙니다. CLR 런타임에서 어셈블리를 시작하기 전에 바이트코드는 환경에 내장된 JIT 컴파일러에 의해 즉시 변환됩니다. 컴파일)을 대상 프로세서의 기계어 코드로 변환합니다. .NET Framework와 함께 제공되는 NGen.exe 유틸리티를 사용하여 선택한 플랫폼에 대한 네이티브 코드로 어셈블리를 컴파일하는 것도 가능합니다.

번역 절차 중에 프로그램의 소스 코드(SML, C#, Visual Basic, C++ 또는 .NET에서 지원하는 기타 프로그래밍 언어로 작성됨)는 컴파일러에 의해 소위 어셈블리로 변환되고 동적으로 저장됩니다. 링크된 라이브러리 파일(동적 링크), 라이브러리, DLL) 또는 실행 가능 파일(실행 파일, EXE).

당연히 각 컴파일러(C# 언어 컴파일러, csc.exe 또는 Visual Basic, vbc.exe)에 대해 런타임 환경은 CTS 유형에 사용되는 유형과 프로그램 코드를 " 추상 머신” .NET - MSIL(Microsoft Intermediate Language).

결국 소프트웨어 프로젝트배포, 복제 및 재사용을 위한 자급자족 구성 요소인 어셈블리 형태로 구성됩니다. 어셈블리가 식별됩니다. 전자 서명작성자와 고유 버전 번호.

내장 프로그래밍 언어(.NET Framework에 포함):

씨#; 제이#; VB.NET; JScript .NET; C++/CLI - 새 버전 C++(관리).


31. OS의 기능적 구성 요소. 파일 관리

기능적 OS 구성 요소:

독립 실행형 컴퓨터 운영 체제의 기능은 일반적으로 OS가 관리하는 로컬 리소스 유형이나 모든 리소스에 적용되는 특정 작업에 따라 그룹화됩니다. 때때로 이러한 기능 그룹을 하위 시스템이라고 합니다. 가장 중요한 자원 관리 하위 시스템은 프로세스, 메모리, 파일 및 외부 장치 관리 하위 시스템이며 모든 리소스에 공통되는 하위 시스템은 하위 시스템입니다. 사용자 인터페이스, 데이터 보호 및 관리.

파일 관리:

실제 하드웨어의 복잡성을 "보호"하는 OS의 능력은 주요 OS 하위 시스템 중 하나인 파일 시스템에서 매우 명확하게 나타납니다.

파일 시스템은 한쪽의 저장 매체와 다른 쪽의 파일에 액세스하기 위한 API(응용 프로그래밍 인터페이스)를 연결합니다. 응용 프로그램이 파일에 액세스할 때 특정 파일의 정보가 어떻게 위치하는지, 어떤 유형의 물리적 매체(CD, 하드 디스크, 자기 테이프 또는 플래시 메모리 장치)에 기록되어 있는지 전혀 알 수 없습니다. 프로그램이 아는 것은 파일 이름, 크기 및 속성뿐입니다. 파일 시스템 드라이버로부터 이 데이터를 받습니다. 파일이 물리적 미디어(예: 하드 드라이브)에 기록되는 위치와 방법을 결정하는 것은 파일 시스템입니다.

운영 체제의 관점에서 전체 디스크는 크기가 512바이트 이상인 클러스터 모음입니다. 파일 시스템 드라이버는 클러스터를 파일과 디렉터리(실제로 해당 디렉터리의 파일 목록을 포함하는 파일)로 구성합니다. 이러한 동일한 드라이버는 현재 사용 중인 클러스터, 무료 클러스터, 결함이 있는 클러스터를 추적합니다.

그러나 파일 시스템이 반드시 물리적 저장 매체와 직접적으로 연관되어 있는 것은 아닙니다. 원격 컴퓨터에 있는 파일에 액세스하는 방법인 가상 파일 시스템과 네트워크 파일 시스템이 있습니다.

가장 간단한 경우, 특정 디스크의 모든 파일은 하나의 디렉터리에 저장됩니다. 이 단일 수준 체계는 CP/M과 MS-DOS 1.0의 첫 번째 버전에서 사용되었습니다. 중첩된 디렉터리가 있는 계층적 파일 시스템은 Multics에서 처음 등장한 다음 UNIX에서 나타났습니다.

다음에 대한 카탈로그 다른 드라이브 DOS/Windows에서와 같이 여러 개의 개별 트리를 형성하거나 다음과 같이 모든 디스크에 공통된 하나의 트리로 병합할 수 있습니다. UNIX 계열 시스템오.

실제로 DOS/Windows 시스템과 UNIX 계열 시스템에는 "c:", "d:" 등의 하위 디렉터리가 있는 하나의 루트 디렉터리가 있습니다. 하드 디스크 파티션은 이러한 디렉터리에 마운트됩니다. 즉, c:\는 file:///c:/에 대한 링크일 뿐입니다. 그러나 UNIX와 유사한 파일 시스템과 달리 Windows에서는 루트 디렉터리에 대한 쓰기와 해당 내용 보기가 금지됩니다.

UNIX에는 루트 디렉터리가 하나만 있고 다른 모든 파일과 디렉터리는 그 아래에 중첩되어 있습니다. 디스크의 파일과 디렉터리에 액세스하려면 mount 명령을 사용하여 디스크를 마운트해야 합니다. 예를 들어, CD에 있는 파일을 열려면 간단히 말해서 운영 체제에 "이 CD의 파일 시스템을 가져와서 /mnt/cdrom 디렉토리에 표시하십시오."라고 알려야 합니다. CD에 있는 모든 파일과 디렉터리는 마운트 지점이라고 하는 이 /mnt/cdrom 디렉터리에 나타납니다. 대부분의 UNIX 계열 시스템에서 이동식 디스크(플로피 디스크 및 CD), 플래시 드라이브 및 기타 외부 저장 장치는 /mnt, /mount 또는 /media 디렉토리에 마운트됩니다. Unix 및 UNIX 유사 운영 체제에서는 운영 체제가 부팅될 때 디스크가 자동으로 마운트될 수도 있습니다.

파일에서 슬래시 사용에 유의하세요. 윈도우 시스템, UNIX 및 UNIX 유사 운영 체제(Windows에서는 백슬래시 "\"를 사용하고 UNIX 및 UNIX 유사 운영 체제에서는 단순 슬래시 "/"를 사용합니다)

또한 위 시스템을 사용하면 물리적 장치의 파일 시스템뿐만 아니라 개별 디렉터리(--bind 매개변수)도 마운트할 수 있습니다. 예를 들어 다음과 같습니다. ISO 이미지(루프 옵션). FUSE와 같은 추가 기능을 사용하면 FTP의 전체 디렉터리와 매우 다양한 리소스 등을 마운트할 수도 있습니다.

NTFS 및 HFS에서는 훨씬 더 복잡한 구조가 사용됩니다. 이것들 중에서 파일 시스템각 파일은 속성 세트입니다. 속성에는 기존의 읽기 전용 시스템뿐 아니라 파일 이름, 크기, 심지어 내용까지 포함됩니다. 따라서 NTFS 및 HFS의 경우 파일에 저장되는 내용은 해당 속성 중 하나일 뿐입니다.

이 논리에 따라 하나의 파일에 여러 변형 콘텐츠가 포함될 수 있습니다. 따라서 동일한 문서의 여러 버전은 물론 추가 데이터(파일 아이콘, 파일과 연결된 프로그램)도 하나의 파일에 저장할 수 있습니다. 이 구성은 Macintosh의 HFS에 일반적입니다.


32. OS의 기능적 구성 요소. 공정 관리.

공정 관리:

컴퓨터 기능에 직접적인 영향을 미치는 운영 체제의 가장 중요한 부분은 프로세스 제어 하위 시스템입니다. 프로세스(즉, 작업)는 실행 중인 프로그램을 설명하는 추상화입니다. 운영 체제의 경우 프로세스는 작업 단위이며 시스템 리소스를 소비하라는 요청입니다.

멀티태스킹(다중 프로세스) 시스템에서 프로세스는 세 가지 주요 상태 중 하나일 수 있습니다.

RUNNING - 프로세스가 필요한 모든 리소스를 가지며 프로세서에 의해 직접 실행되는 프로세스의 활성 상태입니다.

WAITING - 프로세스의 수동 상태, 프로세스가 차단되어 자체 내부 이유로 실행할 수 없으며 일부 이벤트(예: I/O 작업 완료, 다른 이벤트로부터 메시지 수신)가 발생하기를 기다리고 있습니다. 프로세스 또는 필요한 일부 리소스의 출시

READY는 프로세스의 수동 상태이기도 하지만 이 경우 프로세스는 외부 상황으로 인해 차단됩니다. 프로세스에 필요한 모든 리소스가 있고 실행할 준비가 되었지만 프로세서는 다른 프로세스를 실행 중입니다.

동안 수명주기각 프로세스는 주어진 운영 체제에서 구현된 프로세스 스케줄링 알고리즘에 따라 한 상태에서 다른 상태로 이동합니다.

CP/M 표준

마이크로컴퓨터용 운영체제의 탄생은 OS SR/M으로 시작되었습니다. 1974년에 개발된 후 많은 8비트 컴퓨터에 설치되었습니다. 이 운영 체제의 프레임워크 내에서 BASIC, Pascal, C, Fortran, Cobol, Lisp, Ada 및 기타 여러 텍스트 언어의 번역기를 포함하여 상당한 양의 소프트웨어가 생성되었습니다. 타자기를 사용하는 것보다 훨씬 빠르고 편리하게 문서를 준비할 수 있습니다.

MSX 표준

이 표준은 OS뿐만 아니라 학교 PC용 하드웨어의 특성도 결정했습니다. MSX 표준에 따르면 자동차는 최소 16K의 볼륨, BASIC 언어 해석기가 내장된 32K의 영구 메모리, 256x192 픽셀의 해상도와 16색의 컬러 그래픽 디스플레이, 3채널 8옥타브 사운드 생성기, 병렬 포트 외부에 연결된 외부 드라이브를 제어하기 위한 프린터와 컨트롤러를 연결하기 위한 것입니다.

이러한 시스템의 운영 체제는 다음과 같은 속성을 가져야 합니다: 필요한 메모리 - 16K 이하, 시스템 호출 수준에서 CP/M과의 호환성, 파일 형식의 DOS와의 호환성 외장 드라이브플로피 자기 디스크를 기반으로 하며 BASIC, C, Fortran 및 Lisp 언어 번역기를 지원합니다.

Pi-시스템

초기 개발 기간 동안 개인용 컴퓨터 USCD p-시스템 운영 체제가 만들어졌습니다. 이 시스템의 기초는 소위 P-머신(가설적인 유니버설을 모방하는 프로그램)이었습니다. 컴퓨터. P-머신은 P-코드라는 특수 명령을 실행하여 프로세서, 메모리 및 외부 장치의 작동을 시뮬레이션합니다. 소프트웨어 구성요소 Pi 시스템(컴파일러 포함)은 P 코드로 컴파일되고, 응용 프로그램도 P 코드로 컴파일됩니다. 따라서 주요 구별되는 특징시스템은 PC 장비의 기능에 최소한으로 의존했습니다. 이것이 Pi 시스템의 이식성을 보장한 것입니다. 다양한 방식자동차 P 코드의 컴팩트함과 편리하게 구현된 페이징 메커니즘 덕분에 작은 RAM이 있는 PC에서 상대적으로 큰 프로그램을 실행할 수 있었습니다.

I/O 제어.

I/O 장치는 두 가지 유형으로 구분됩니다. 블록 지향장치 및 바이트 지향장치. 블록 지향 장치는 고정된 크기의 블록에 정보를 저장하며 각 블록에는 자체 주소가 있습니다. 가장 일반적인 블록 지향 장치는 디스크입니다. 바이트 지향 장치는 주소 지정이 불가능하고 검색 작업을 허용하지 않으며 바이트 시퀀스를 생성하거나 소비합니다. 예로는 터미널, 라인 프린터, 네트워크 어댑터. 전자 부품을 장치 컨트롤러 또는 어댑터라고 합니다. 운영 체제는 컨트롤러를 처리합니다. 컨트롤러는 간단한 기능을 수행하고 오류를 모니터링하고 수정합니다. 각 컨트롤러에는 중앙 프로세서와 통신하는 데 사용되는 여러 레지스터가 있습니다. OS는 컨트롤러 레지스터에 명령을 작성하여 I/O를 수행합니다. IBM PC 플로피 디스크 컨트롤러는 READ, WRITE, SEEK, FORMAT 등과 같은 15개의 명령을 허용합니다. 명령이 수락되면 프로세서는 컨트롤러를 떠나 다른 작업을 수행합니다. 명령이 완료되면 컨트롤러는 인터럽트를 발행하여 프로세서 제어권을 운영 체제로 전달합니다. 운영 체제는 작업 결과를 확인해야 합니다. 프로세서는 컨트롤러 레지스터에서 정보를 읽어 장치의 결과와 상태를 얻습니다.

주요 아이디어 I/O 소프트웨어 구성여러 레벨로 나누어 구성되며, 하위 레벨은 상위 레벨의 장비 기능을 보호합니다. 사용자 친화적 인 인터페이스사용자를 위해.

열쇠원칙은 장치 독립성. 프로그램 유형은 플로피 디스크에서 데이터를 읽는지 아니면 플로피 디스크에서 데이터를 읽는지에 따라 달라져서는 안 됩니다. 하드 드라이브. I/O 소프트웨어의 또 다른 중요한 문제는 오류 처리입니다. 일반적으로 오류는 가능한 한 하드웨어에 가깝게 처리되어야 합니다. 컨트롤러가 읽기 오류를 감지하면 이를 수정하려고 시도해야 합니다. 실패하면 장치 드라이버가 오류를 수정해야 합니다. 그리고 하위 레벨에서 오류를 처리할 수 없는 경우에만 상위 레벨에 오류를 보고합니다.

또 다른 주요 문제는 차단(동기) 및 비차단(비동기) 전송을 사용하는 것입니다. 대부분의 물리적 I/O 작업은 비동기식으로 수행됩니다. 즉, 프로세서는 전송을 시작하고 인터럽트가 발생할 때까지 다른 작업으로 이동합니다. I/O 작업이 차단되어야 합니다. READ 명령 후에 프로그램은 데이터가 프로그램 버퍼에 도달할 때까지 자동으로 일시 중지됩니다.

마지막 문제는 일부 장치는 공유되는 반면(디스크: 여러 사용자가 동시에 디스크에 액세스하는 것은 문제가 되지 않음) 다른 장치는 전용으로 사용된다는 것(프린터: 다른 사용자가 인쇄한 라인을 혼합할 수 없음)입니다.

이러한 문제를 해결하려면 I/O 소프트웨어를 4개 계층으로 나누는 것이 좋습니다(그림 2.30).

· 인터럽트 처리,

· 장치 드라이버,

· 운영 체제의 장치 독립적인 계층,

· 맞춤형 소프트웨어 계층.

하드웨어 인터럽트의 개념과 처리.

비동기식 또는 외부(하드웨어) 인터럽트는 외부 소스(예: 주변기기) 임의의 순간에 발생할 수 있습니다: 타이머의 신호, 네트워크 카드또는 디스크 드라이브, 키보드 키 누르기, 마우스 이동; 즉각적인 반응(처리)이 필요합니다.

컴퓨터의 거의 모든 입출력 시스템은 인터럽트를 사용하여 작동합니다. 특히 키를 누르거나 마우스를 클릭하면 하드웨어가 인터럽트를 생성합니다. 그에 따라 시스템은 누른 키의 코드를 읽거나 마우스 커서의 좌표를 기억합니다. 인터럽트는 디스크 컨트롤러, 어댑터에 의해 생성됩니다. 지역 네트워크, 직렬 포트, 오디오 어댑터 및 기타 장치.