C# winform을 기반으로 한 운영 체제 코스 설계 : 스풀링 스풀링 된 입력 및 출력 기술 시뮬레이션.
스풀링 출력 프로세스와 스풀링 출력 서비스 프로그램뿐만 아니라 스풀링 출력 프로세스와 출력을 요청하는 두 가지 사용자 프로세스를 설계해야합니다. 출력을 요청하는 사용자 프로세스가 일련의 정보를 출력하기를 원할 때 출력 서비스 프로그램이 호출되고 출력 서비스 프로그램은 정보를 출력으로 잘 보냅니다. 출력 엔드 플래그가 발생하면 프로세스의 출력 파일 출력이 완료되었음을 나타냅니다. 그런 다음 출력 요청 블록이 적용됩니다 (출력 요청 출력의 이름, 출력의 잘 알려져있는 정보의 위치, 출력 정보의 길이 등) 스풀링 프로세스가 출력 될 때까지 기다립니다.
스풀링 출력 프로세스가 작동하는 경우, 요청 블록에 기록 된 각 프로세스에서 출력 할 정보를 기반으로 프린터 또는 모니터에 실제로 출력됩니다. 여기서 SP00LING 출력 프로세스 및 출력 요청 프로세스는 동시에 실행할 수 있습니다.
프로세스 스케줄링은 프로세스의 출력 정보의 임의성과 일치하는 임의의 알고리즘을 사용합니다. 출력을 요청하는 두 사용자 프로세스의 일정 확률은 각각 45%이며 스풀링 출력 프로세스는 10%이며, 이는 임의 번호 생성기에 의해 생성 된 랜덤 번호의 시뮬레이션에 의해 결정됩니다.
프로세스에는 세 가지 기본 상태, 즉 실행 가능, 대기 및 끝이 있습니다. 실행 가능 상태는 프로세스가 실행 중이거나 스케줄링을 기다리는 상태입니다. 대기 상태는 대기 상태 1, 대기 상태 2 및 대기 상태 3으로 나뉩니다.
상태 변경 조건은 다음과 같습니다.
process 프로세스가 실행되면 "종료"상태로 설정됩니다.
Service 서비스 프로그램이 출력 정보를 출력에 잘 보낼 때 출력이 잘 가득 차면 호출 프로세스가 "대기 상태 1"으로 설정됩니다.
spooling 스풀링 프로세스가 출력되면 출력이 비어 있으면 "대기 상태 2"로 들어갑니다.
스풀링 프로세스가 정보 블록을 출력 한 후에는 정보 블록이 차지하는 출력 우물 공간을 즉시 해제하고 출력을 기다리는 프로세스를 "실행 가능 상태"로 설정해야합니다.
Service 프로그램이 출력을 잘 출력하고 출력 요청 정보 블록을 형성 한 후 스풀링 프로세스가 대기 상태 인 경우 "실행 가능 상태"로 설정됩니다.
⑥ 사용자 프로세스가 출력 블록을 요청하면 사용 가능한 요청 블록이없는 경우 호출 프로세스가 "대기 상태 3"에 들어갑니다.
시스템에 출력을 요청하는 두 가지 사용자 프로세스가 있으며, 두 프로세스의 각각 사용자 프로세스 A와 사용자 프로세스 B로 지정됩니다. 사용자는 둘 이상의 파일을 출력해야 할 수 있으며 파일은 출력 엔드 플래그로 분리됩니다. 이 실험에 사용 된 파일 출력 엔드 플래그는 #입니다.
사용자는 초기화 단계에서 출력을 위해 모든 파일 내용을 입력 한 다음 배열에 저장해야합니다. 사용자 프로세스가 일정되면 다음 세 가지 조건이 충족되면 여전히 출력되지 않은 파일이 있지만 출력의 나머지 공간은 파일을 아래로 내릴 수 있고 사용 가능한 출력 요청 블록이 있으면 파일이 출력으로 전송 된 다음 출력 요청 블록이 적용되고 요청 블록에 추가됩니다.
스풀링 출력 프로세스가 CPU를 차지할 차례 일 때, 스풀링 출력 프로세스는 먼저 요청 블록 대기 대기 큐에 출력 대기 큐에 출력 블록이 있는지 확인하고 대기 상태로 들어갑니다. 그렇지 않으면 출력이 수행 된 다음 출력 우물 공간과 해당 요청 된 출력 블록이 해제되고 사용 가능한 출력 블록이 없기 때문에 수면중인 사용자 프로세스가 해제됩니다.
스풀링 출력 프로세스 및 사용자 프로세스는 동시에 실행될 수 있습니다. 이 기사는 하나의 실행 프로세스 프로세스 (실행 후 프로세스가 반드시 종료되지는 않음)를 함수로 추상화합니다. 특정 상황으로 인해 프로세스가 차단되면 다음 임의 숫자가 생성되고 다른 프로세스가 예정됩니다. 사용자 프로세스 및 스풀링 출력 프로세스는 여러 가지 이유, 즉 동시 실행으로 예정되어 있습니다.
전체 시스템의 기능은 초기화 기능, 일정 기능, 사용자 프로세스 기능 및 스풀링 출력 기능의 다음 부분으로 나뉩니다. 초기화 기능은 사용자 파일의 초기 입력 및 저장을 구현하는 데 사용됩니다. 디스패치 함수는 사용자 프로세스와 스풀링 출력 프로세스 간의 전환을 구현합니다. 사용자 프로세스 기능은 프로세스가 예정된 후에 완료된 일련의 작업을 구현합니다. 스풀링 출력 함수는 출력 작업을 나타냅니다.
시스템 작동의 전체 흐름도는 그림 1에 나와 있습니다.
이 시스템은 먼저 초기화 함수를 사용하여 사용자의 컨텐츠 입력을 초기화 한 다음 0과 1 사이의 임의 숫자 r을 생성하고, 사용자 프로세스를 실행 해야하는지 또는 R의 크기에 따라 출력 프로세스를 실행 해야하는지 판단합니다. 사용자 프로세스 및 출력 프로세스가 실행 된 후 프로그램이 계속 진행됩니다.
사용자는 "인쇄"하려는 콘텐츠를 입력해야합니다. 초기화 함수는 사용자의 컨텐츠 입력을 수용하고 파일 종료 문자에 따라 잘라 내고 파일을 배열에 넣고 사용자 프로세스가 예약 될 때 출력으로 잘 보냅니다.
프로세스 스케줄링은 임의의 알고리즘을 사용하며 출력을 요청하는 두 사용자 프로세스의 스케줄 확률은 45%이며 스풀링 출력 프로세스는 10%입니다. 이 백서는 임의의 숫자를 사용 하여이 요구 사항을 달성합니다. 프로세스 일정을 수행 할 때 0과 1 사이의 소수점이 무작위로 생성됩니다. 숫자가 0.45보다 작거나 같으면 사용자 프로세스 A가 작동합니다. 숫자가 0.45에서 0.9 사이 인 경우 사용자 프로세스 B가 작동합니다. 숫자가 0.9보다 큰 경우 스풀링 출력 프로세스가 작동합니다.
사용자 프로세스 기능은 먼저 현재 프로세스가 세 가지 조건에 충족하는지 확인해야합니다. 파일이 출력이 아니며 출력의 나머지 공간이 파일을 내려 놓을 수 있으며 사용 가능한 출력 요청 블록이 있습니다. 세 가지 조건이 충족되면 파일이 출력으로 전송되고 해당 요청 블록이 적용됩니다.
사용자 프로세스 기능 실행의 흐름도는 그림 2에 나와 있습니다.
사용자 프로세스가 실행되면 파일이 출력 된 것으로 밝혀지면 프로세스가 끝납니다. 그렇지 않으면, 출력에 남아있는 공간이 있는지 여부와 대기 상태가 입력되지 않았는지 결정됩니다. 출력에 잘 남은 공간이 있으면 출력 블록이 있는지 계속 판단하십시오. 하나가 있으면 파일을 출력으로 잘 보내고 출력 블록을 요청하고 잠재적으로 졸린 출력 프로세스를 깨우십시오. 그렇지 않으면 대기 상태 3을 입력하십시오.
스풀링 출력 함수는 출력 요청 블록이 있는지 확인하고 관련 리소스를 출력 및 해제하는 경우 확인합니다. 그렇지 않으면 스풀링 출력 프로세스가 대기됩니다.
스풀링 출력 함수의 흐름도가 그림 3에 나와 있습니다.
PCB의 정의는 다음과 같습니다.
class PCB {
/*
* 进程描述
*/
public int id ; //序号
public int status ; //状态,0表示可执行,123表示三个等待状态,4表示结束
public string [ ] contents = new string [ MaxFileCount ] ; //要输出的内容
public int [ ] flags = new int [ MaxFileCount ] ; //为1表示该文件已经被输出,初始全部为0
public int fileCount ; //用户真实输入的文件个数
}사용자 프로세스에는 일련 번호 ID, 프로세스 상태 상태, 출력 컨텐츠, 파일 출력 플래그 및 실제 파일 카운트가 포함됩니다.
그 중에서, 사용자 프로세스가 존재할 수있는 가능한 프로세스 상태는 다음을 포함한다.
OutputReqBlock은 다음과 같이 정의됩니다.
class OutputReqBlock {
/*
* 输出请求块
*/
public int id ; //要求进行输出的进程的id
public int start ; //文件在输出井中的起始位置
public int length ; //文件长度
public int fileIndex ; //要输出文件的序号
public OutputReqBlock ( int id , int start , int length , int fileIndex ) {
this . id = id ;
this . start = start ;
this . length = length ;
this . fileIndex = fileIndex ;
}
}요청 출력 블록에는 요청 블록의 프로세스 ID, 출력 우물에서 파일의 시작 위치, 파일 길이의 길이 및 모든 사용자 파일에서 출력 할 파일의 시퀀스 번호가 포함됩니다.
OutputWell의 정의는 다음과 같습니다.
class OutputWell {
/*
* 输出井
*/
public char [ ] buffer = new char [ MaxWellLen ] ; //输出缓冲区
public int begin = 0 ; //当前可用位置
public int restSize = MaxWellLen ; //剩余容量
}출력 우물의 매개 변수는 다음과 같습니다. 버퍼 버퍼, 사용자가 배치 한 데이터를 저장하는 데 사용됩니다. 현재 사용 가능한 위치가 시작되고 파일은 출력이 잘 순서대로 저장되며 시작은 항상 현재 사용 가능한 버퍼의 시작 위치를 가리 킵니다. 나머지 용량은 버퍼의 나머지 용량이며, 처음에는 버퍼 길이 MaxWelllen입니다.
사용자는 텍스트 상자에서 "인쇄"로 정보를 입력 한 다음 출력 내용이 (A 또는 B)에 속하는 처리를 선택합니다. 마지막으로 초기화 버튼을 클릭하여 초기화 기능을 시작하십시오. 초기화 함수는 먼저 문자열 객체를 사용하여 사용자가 컨텐츠 입력을 저장합니다. 그런 다음 사용자가 입력 한 컨텐츠가 # 번호로 끝나는 지 확인한 다음 합법적이지 않은 경우 사용자에게 다시 들어가라고 메시지를 표시하십시오. 입력이 합법적 인 후에 사용자가 입력 한 내용은 # 번호에 따라 절단되고 문자열은 여러 문자열로 절단됩니다. 마지막으로, PCB 객체는 생성 된 정보를 사용하여 초기화되고 대기 큐 Waitqueue에 배치됩니다.
사용자는 초기화 버튼을 여러 번 클릭 할 수 있으므로 각 클릭 전에 현재 프로세스가 초기화되었는지 여부를 결정해야합니다. 사용자가 이미 초기화를 완료했지만 초기화 버튼을 다시 클릭 한 경우 원래 콘텐츠를 덮어 씁니다.
시스템 인터페이스가로드되면 출력 우물이 자동으로 초기화됩니다.
초기화 기능 코드가 건너 뜁니다!
임의성을 달성하기 위해, 예약을 원할 때마다 C#의 임의 함수를 사용하여 0과 1 사이의 임의 숫자가 생성됩니다. 임의의 숫자가 0.45보다 작거나 같으면 사용자 프로세스 A가 다음에 예약 될 것임을 의미합니다. 임의의 숫자가 0.45에서 0.9 사이 인 경우 사용자 프로세스 B가 다음에 예약 될 것임을 의미합니다. 임의의 숫자가 0.9보다 큰 경우 스풀링 출력 프로세스가 다음에 예약 될 것임을 의미합니다.
스케줄러 함수의 구현은 다음과 같습니다.
private int dispatch ( ) {
/*
* 进程调度
*/
double res = rd . NextDouble ( ) ; //产生一个01之间的小数
if ( res <= 0.45 ) {
return 0 ;
} else if ( res <= 0.9 ) {
return 1 ;
} else {
return 2 ; //012分别表示两个进程和SPOOLing输出进程
}
} 사용자 프로세스가 실행될 때 수행되는 일련의 작업을 구현하는 데 사용됩니다.
사용자 프로세스가 예약되면 먼저 출력으로 전송되지 않은 파일이 여전히 있는지 확인하십시오. 없으면 현재 사용자 프로세스가 최종 상태로 설정되고 함수가 반환됩니다.
사용자 프로세스는 아직 종료되지 않았으므로 출력으로 전송되지 않은 파일이 여전히 남아 있음을 의미합니다. 루프는 출력이없는 파일 블록을 찾기 위해 (해당 플래그는 1입니다), 출력의 나머지 공간이 여전히이 파일 블록을 넣을 수 있는지 여부를 쿼리합니다. 그렇지 않은 경우 프로세스 상태가 상태 1을 대기하도록 설정하면 함수가 반환됩니다. 여전히 남은 공간이있는 경우 아직 사용 가능한 요청 출력 블록이 있는지 확인하십시오. 프로세스가 상태 3을 대기하도록 설정되지 않으면 함수가 반환됩니다. 그렇지 않으면 파일 블록이 출력 우물로 전송되고 출력의 관련 매개 변수가 수정됩니다. 그런 다음 출력 대기열 프린트 Queue에 요청 출력 블록이 적용되고 스풀링 출력 프로세스가 예약 될 때 인쇄 출력이 인쇄됩니다. 마지막으로 스풀링 출력 프로세스가 대기 상태에 있으면 사용자 프로세스가이를 깨우야합니다.
사용자 프로세스 기능 실행 중 다양한 상황은 최종 결과 표시 목록을 통해 저장됩니다. 목록에는 현재 스케줄링 시퀀스 번호, 프로세스 번호, 프로세스 상태, 출력 우물 상태, 사용 가능한 요청 블록 수, 파일 시퀀스 번호 및 파일 길이가 포함됩니다.
사용자 프로세스 기능 코드가 건너 뜁니다!
출력 함수의 기능은 요청 출력 블록을 선택한 다음 내용을 출력 한 다음 최종적으로 해당 리소스를 해제하는 것입니다.
먼저 출력이 비어 있는지 확인하십시오. 빈 출력 프로세스가 상태 2를 대기하도록 설정된 경우 함수가 반환됩니다. 그렇지 않으면 출력이 필요한 요청 출력 큐에 요청 출력 블록이 있는지 확인하십시오. 그렇지 않으면, 큐 헤드의 요청 출력 블록이 요청 출력 큐에서 가져온 다음 요청 블록이 출력되고 해당 출력 우물 공간 및 요청 블록이 해제됩니다.
출력 기능을 출력 할 때 출력 컨텐츠를 파일 출력 영역에 표시해야합니다.
출력 기능 코드가 건너 뜁니다!
사용자는 "프로그램 실행"버튼을 클릭하고 기본 기능 실행을 시작합니다. 실행 프로세스는 현재 상황에 따라 동적으로 조정됩니다.
주요 함수는 먼저 두 사용자 프로세스가 초기화되었는지 여부를 결정하고 초기화 후에 만 실행할 수 있습니다. 그렇지 않으면 오류 가보고됩니다.
초기화 후 "프로그램 실행"버튼을 다시 클릭하십시오. 최종 상태에 있지 않은 프로세스가 있거나 요청 블록이 출력되지 않은 한 계속해서 일정을 잡으십시오. 예약 할 때 현재 프로세스가 종료되었는지 여부를 결정하고 완료되면 관련 상태를 출력해야합니다.
기본 기능 코드가 건너 뜁니다!
실험에 사용 된 다양한 매개 변수에 대한 설명은 표 1에 나와 있습니다.
| 매개 변수 이름 | 맥스웰 렌 | MaxFileCount | 블록 카운트 |
|---|---|---|---|
| 매개 변수 설명 | 출력 우물 길이 | 사용자가 출력 할 수있는 최대 파일 수입니다 | 요청 된 블록 수 |
| 매개 변수 값 | 15 | 10 | 3 |
시스템 인터페이스는 그림 4에 나와 있습니다.
시스템 인터페이스는 초기화, 예약 프로세스 및 파일 출력 영역의 세 가지 섹션으로 나뉩니다. 초기화 섹션에는 텍스트 상자, 선택 상자 및 버튼이 포함되어 있습니다. 사용자는 텍스트 상자에 인쇄 할 파일을 입력 한 다음 초기화합니다. 스케줄링 프로세스 섹션은 주로 세부 프로세스 스케줄링 프로세스를 표시하는 테이블입니다. 파일 출력 섹션은 모든 파일의 인쇄 프로세스를 표시하는 데 사용됩니다.
사용자는 먼저 프로세스를 선택하고 초기 기본값은 A이며, 파일을 초기화 섹션의 텍스트 상자에 넣은 다음 초기화 버튼을 클릭합니다. 그림 5와 같이 초기화가 성공적입니다.
프로세스 B의 경우 그림 6과 같이 위의 작업을 수행합니다.
두 사용자 프로세스의 초기화가 완료되면 프로그램 실행 버튼을 클릭하면 결과가 그림 7 및 그림 8에 표시됩니다.
다음은 그림 9의 내용에 대한 간단한 분석입니다.
출력이 현재 비어 있기 때문에 출력 프로세스가 처음으로 예정되었으므로 출력 프로세스 상태는 대기 상태 2이고 사용 가능한 요청 블록의 수는 3입니다. 두 번째로 프로세스 A가 예약됩니다. 프로세스 A 상태 A는 실행 가능입니다. 사용 가능한 요청 블록의 수는 3입니다. A는 파일 0을 출력에 잘 보냅니다. 파일 0 ( "ABCD")의 길이는 4입니다. 출력 프로세스는 세 번째로 예정되어 있습니다. 출력 우물의 사용 가능한 공간은 15-4 = 11이고, 사용 가능한 요청 블록의 수는 2가되고, 프로세스 A의 파일 0은 파일 출력 영역에 표시된대로 출력이며 관련 공간이 해제됩니다.