Valutazione attuale:  / 0
ScarsoOttimo 

Il sort/merge

Questo programma ha sempre fatto parte del software di base fornito dalla IBM ed è stato disponibile fin dall'era del 7070; il suo compito era di ordinare i records di un file secondo una chiave o anche di effettuare delle "fusioni" tra files già ordinati (si occupava di questo la parte merge).

La necessità di ordinare files (si diceva selezionare files) era particolarmente sentita quando le macchine potevano consentire soltanto elaborazioni sequenziali; infatti come illustrato nel capitolo "Le elaborazioni sequenziali", quasi nessuna elaborazione sequenziale era possibile se non disponendo di files ordinati secondo un'opportuna chiave.

 

Il sort/merge del 7070

Il sort del 7070 consentiva di selezionare un file sequenziale presente su nastro magnetico; poichè l'utente poteva richiedere di ordinare un file per una chiave qualunque, il sort si avvaleva di una serie di control cards su schede perforate che servivano a comunicargli queste informazioni.

Il programma aveva bisogno di utilizzare un certo numero di unità a nastro sulle quali dovevano essere montate bobine di nastro vuote che sarebbero servite al sort per "appoggiarvi" i dati durante il suo lavoro; più unità di lavoro venivano utilizzate, più rapida era la selezione.

Il gruppo di nastri di lavoro fornito al sort veniva da lui diviso in due sottogruppi ciascuno dei quali conteneva la metà dei nastri disponibili; il processo si sviluppava in tre fasi distinte ed era molto coreografico; guardando le unità nastro si riusciva perfino a seguire quello che stava avvenendo.

Nella prima fase veniva letto il nastro di input, il programma riempiva tutta la memoria centrale disponibile con quanti più records era possibile, li ordinava in memoria e li scriveva in gruppi ordinati (chiamati sequenze) su una delle unità nastro del primo sottogruppo; per ogni gruppo di records ordinato, provvedeva a scrivere su un'unità di output diversa del primo sottogruppo e quando aveva utilizzato tutte le unità del sottogruppo ricominciava da capo a scrivere sulla prima del sottogruppo stesso; questa "rotazione" era visibile infatti si vedeva andare avanti l'unità di input fino a quando la memoria era piena, c'era poi un breve arresto di quel nastro, durante il quale si capiva che stava avvenendo l'odinamento in memoria, poi si vedeva il primo nastro del primo sottogruppo che scriveva la sequenza, successivamente si rivedeva muovere il nastro di input, si rivedeva l'arresto per l'ordinamento e poi la scrittura della seconda sequenza sul secondo nastro del primo sottogruppo; la cosa continuava così e tutti i nastri del primo sottogruppo venivano utilizzati a rotazione; la prima fase si concludeva soltanto quando i records presenti sul file di input erano terminati; la bobina di input si riavvolgeva e l'unità nastro che la conteneva apriva il dispositivo di lettura /scrittura per consentire agli operatori di smontarla; contemporaneamente tutte le unità del primo sottogruppo venivano riavvolte e messe in "ready" per poi essere rilette.

La seconda fase iniziava durante il riavvolgimento della bobina di input; la fase consisteva nella fusione delle sequenze presenti sui nastri del primo sottogruppo e nella produzione di sequenze più lunghe (cioè contenenti più records ordinati); in pratica il programma fondeva, curando di rispettare l'ordine richiesto, tutte le prime sequenze dei nastri del primo sottogruppo, poi le seconde sequenze, poi le terze, ecc.; esse venivano fuse tra loro producendo delle sequenze complessive ordinate più grandi, che venivano scritte a rotazione sui nastri del secondo sottogruppo; anche in questo caso si poteva seguire il processo: si vedevano infatti muovere quasi insieme tutte le unità nastro del primo sottogruppo e a rotazione la scrittura delle sequenze sulle unità del secondo sottogruppo; terminata la lettura di tutte le sequenze presenti sui nastri del primo sottogruppo, tutti i nastri venivano riavvolti; il processo si invertiva e inziava la fusione delle sequenze presenti sul secondo sottogruppo con la scrittura arotazione di sequenze ancora più lunghe sui nastri del primo sottogruppo che venivano nuovamente usati come output; le sequenze sui nastri di lavoro diventavano sempre più lunghe e quindi sempre meno numerose; quando il programma si accorgeva che ormai su ogni nastro di un sottogruppo era presente una sola lunghissima sequenza, iniziava la terza fase.

La terza fase consisteva nell'ultima fusione delle sequenze presenti sui nastri di lavoro di uno dei sottogruppi; si vedeva chiaramente che venivano letti tutti i nastri del sottogruppo e veniva scritto un unico nastro finale che conteneva finalmente il file originario ordinato secondo quanto richiesto.

 

Il sort/merge del 360

Anche nel software di base del 360 era presente un programma di sort fornito dalla IBM; poichè la macchina disponeva di dischi questo sort utilizzava come aree di lavoro una serie di extend (spazi su disco) distinati a questo scopo.

Anche in questo caso i parametri per il sort venivano forniti attraverso un gruppo di schede perforate attraverso le quali si definiva non solo quali erano i campi sui quali operare l'ordinamento, ma anche moltissimi altri parametri come i dischi e gli extend da utilizzare come aree di lavoro, la dimensione di ciascuna area, il tipo di tecnica di ordinamento da utilizzare, ecc.

I parametri da indicare erano molto critici per cui uno stesso sort poteva durare molte ore o molto meno a seconda che i parametri forniti al programma erano scelti male o ben studiati; per questo motivo il settore dei miei sistemisti veniva spesso interpellato dal personale della sala macchine che non riusciva a capire perchè un certo sort durasse tanto; il problema era di difficile soluzione, ma con una mia idea, realizzata immediatamente da un bravo collaboratore risolse il problema per sempre; la soluzione è spiegata in un capitolo e, poichè si avvale di altri strumenti software da me stesso realizzati prima, può essere capita soltanto dopo aver letto tutto quanto attiene alle macro di I/O.

Voglio ora parlare di alcune sofisticate caratteristiche del sort del 360; questo programma metteva a disposizione le cosiddette EXIT; non ci crederete, ma queste exit erano già negli anni '60 quello che oggi in un ambiente di programmazione moderna si chiamerebbe EVENTO.

Le EXIT disponibili erano varie, ma le due più inportanti erano: quella che si verificava subito dopo la lettura di un record del file di input e quella che si verificava immediatamente prima della scrittura di un record ormai ordinato di output; i programmatori potevano attivare le exit richiedendolo con apposite informazioni nelle control cards di avvio del sort e potevano indicare per ciascuna exit quale era la routine utente da "agganciare" al verificarsi appunto dell'evento relativo.

Continuando a parlare della exit dopo la lettura dei records e di quella prima della scrittura, aggiungo che quando il sort chiamava la routine utente, provvedeva a passargli anche l'indirizzo del record corrente sul quale quindi il programmatore poteva operare a suo piacimento; il programmatore con opportuni parametri di ritorno poteva richiedere al sort di cancellare il record corrente o poteva modificare qualche campo del record e poi restituirlo al sort perchè fosse utilizzato; era possibile anche inserire una o più records che sarebbero stati visti dal sort come records provenienti dal suo input, immediatamente prima di quello corrente.

Utilizzando queste exit si potevano realizzare programmi anche sofisticati, integrandoli nel sort stesso; ad esempio se l'output ordinato di un file era destinato ad esser stampato da un programma, invece di far produrre il file su un supporto magnetico per poi farlo rileggere dal programma di stampa, si poteva utilizzare la exit disponibile prima della scrittura del record per editare ogni record ed inviarlo subito alla stampante; se il file di output ordinato non doveva servire ad altro, si poteva anche eliminarlo completamente, semplicemente richiedendo nella exit la cancellazione di ogni record ricevuto; nessuno proibiva di aprire nuovi files durante le exit, per cui era possibile anche reperire o scrivere altri dati insieme a quelli letti o scritti dal sort.

Anche queste possibilità furono molto sfruttate dagli strumenti software da me realizzati; maggiori dettagli potranno essere trovati nei capitoli delle realizzazioni.