Sistema operativo Unix. Storia dei sistemi UNIX

Sistema operativo Unix. Storia dei sistemi UNIX

UNIX- una famiglia di sistemi operativi portatili, multitasking e multiutente.

Le idee alla base di UNIX hanno avuto un enorme impatto sullo sviluppo dei sistemi operativi dei computer. Attualmente, i sistemi UNIX sono riconosciuti come uno dei sistemi operativi storicamente più importanti.

Revisione

Il primo sistema UNIX è stato sviluppato dalla divisione Bell Labs di AT&T. Da allora sono stati creati numerosi sistemi UNIX diversi. Legalmente, solo i sistemi operativi che sono stati certificati per la conformità allo standard Single UNIX Specification hanno il diritto di essere chiamati “UNIX”. Il resto, sebbene utilizzino concetti e tecnologie simili, sono chiamati sistemi operativi simili a UNIX (inglese UNIX-like). Per brevità, in questo articolo, per sistemi UNIX si intendono sia i veri sistemi operativi UNIX che quelli simili a UNIX.

Peculiarità

La differenza principale tra i sistemi simili a UNIX e gli altri sistemi operativi è che sono intrinsecamente sistemi multiutente e multitasking. Cioè, nello stesso momento, molte persone possono eseguire molte attività informatiche (processi) contemporaneamente. Anche il sistema Microsoft Windows, popolare in tutto il mondo, non può essere definito un sistema multiutente a tutti gli effetti, poiché, ad eccezione di alcune versioni server, solo una persona può lavorare contemporaneamente su un computer Windows. Molte persone possono lavorare su Unix contemporaneamente e ognuna di loro può eseguire molti processi informatici diversi che utilizzeranno le risorse di quel particolare computer.

Il secondo merito colossale di Unix è la sua natura multipiattaforma. Il nucleo del sistema è progettato in modo tale da poter essere facilmente adattato a quasi tutti i microprocessori.

UNIX ha altre caratteristiche caratteristiche:

  • utilizzare semplici file di testo per configurare e gestire il sistema;
  • uso diffuso di utilità lanciate dalla riga di comando;
  • interazione con l'utente attraverso un dispositivo virtuale - un terminale;
  • rappresentazione di dispositivi fisici e virtuali e alcuni mezzi di comunicazione tra processi sotto forma di file;
  • utilizzando pipeline di diversi programmi, ognuno dei quali esegue un'attività.

Applicazione

Attualmente, i sistemi UNIX sono distribuiti principalmente tra server e anche come sistemi embedded per varie apparecchiature. Tra i sistemi operativi per workstation e uso domestico I sistemi operativi UNIX e simili occupano il secondo (macOS), il terzo (GNU/Linux) e molti altri posti successivi in ​​popolarità dopo Microsoft Windows.

Storia

Predecessori

Le prime versioni di UNIX erano scritte in linguaggio assembly e non avevano un compilatore di linguaggio di alto livello incorporato. Intorno al 1969, Ken Thompson, con l'assistenza di Dennis Ritchie, sviluppò e implementò il linguaggio Bi (B), che era una versione semplificata (per l'implementazione su minicomputer) del linguaggio BCPL sviluppato nel linguaggio. Bi, come BCPL, era un linguaggio interpretato. È stato rilasciato nel 1972 seconda edizione UNIX riscritto in linguaggio Bi. Nel 1969-1973 Basato su Bi, è stato sviluppato un linguaggio compilato, chiamato C (C).

Diviso

Una ragione importante per la scissione di UNIX è stata l’implementazione dello stack di protocolli TCP/IP nel 1980. Prima di ciò, la comunicazione da macchina a macchina in UNIX era agli inizi: il metodo di comunicazione più significativo era UUCP (un mezzo per copiare file da un sistema UNIX a un altro, originariamente operante su reti telefoniche utilizzando modem).

Sono state proposte due interfacce di programmazione di applicazioni di rete: socket Berkley e TLI (Transport Layer Interface).

L'interfaccia dei socket Berkley è stata sviluppata presso l'Università di Berkeley e utilizzava lo stack di protocolli TCP/IP sviluppato lì. TLI è stato creato da AT&T secondo la definizione del livello di trasporto del modello OSI ed è apparso per la prima volta nella versione 3 di System V. Sebbene questa versione contenesse TLI e flussi, inizialmente non aveva un'implementazione di TCP/IP o altri protocolli di rete, ma tale le implementazioni sono state fornite da terze parti.

L'implementazione di TCP/IP fu ufficialmente e definitivamente inclusa nella distribuzione base del System V versione 4. Ciò, insieme ad altre considerazioni (per lo più di mercato), causò la demarcazione definitiva tra i due rami di UNIX - BSD (Università di Berkeley) e System V (versione commerciale di AT&T). Successivamente, molte aziende, avendo ottenuto la licenza System V da AT&T, svilupparono le proprie varietà commerciali di UNIX, come AIX, CLIX, HP-UX, IRIX, Solaris.

Le moderne implementazioni UNIX generalmente non sono puri sistemi V o BSD. Implementano funzionalità sia di System V che di BSD.

Sistemi operativi simili a UNIX gratuiti

Attualmente, GNU/Linux e i membri della famiglia BSD stanno rapidamente conquistando il mercato dei sistemi commerciali UNIX e contemporaneamente penetrando sia nei computer desktop degli utenti finali che nei sistemi mobili e integrati.

Sistemi proprietari

Dopo la scissione della AT&T, il marchio UNIX ed i diritti sul codice sorgente originale passarono di mano più volte, in particolare furono per lungo tempo di proprietà di Novell.

L'influenza di UNIX sull'evoluzione dei sistemi operativi

I sistemi UNIX sono di grande importanza storica perché hanno dato origine ad alcuni dei concetti e degli approcci di sistemi operativi e software che sono popolari oggi. Inoltre, durante lo sviluppo dei sistemi UNIX, è stato creato il linguaggio C.

Ampiamente utilizzato nella programmazione dei sistemi, il linguaggio C, originariamente creato per lo sviluppo di UNIX, ha superato UNIX in popolarità. Il linguaggio C è stato il primo linguaggio “tollerante” che non ha cercato di imporre l’uno o l’altro stile di programmazione al programmatore. Il C è stato il primo linguaggio di alto livello a fornire l'accesso a tutte le funzionalità del processore, come riferimenti, tabelle, spostamenti di bit, incrementi, ecc. D'altra parte, la libertà del linguaggio C ha portato a errori di buffer overflow nelle funzioni della libreria standard C. come get e scanf. Il risultato sono state molte vulnerabilità note, come quella sfruttata dal famoso worm Morris.

I primi sviluppatori di UNIX hanno contribuito a introdurre i principi della programmazione modulare e del riutilizzo nella pratica ingegneristica.

UNIX ha fornito la possibilità di utilizzare i protocolli TCP/IP su computer relativamente economici, il che ha portato a rapida crescita Internet. Ciò, a sua volta, ha contribuito alla rapida scoperta di numerose importanti vulnerabilità nella sicurezza, nell'architettura e nelle utilità di sistema di UNIX.

Nel corso del tempo, i principali sviluppatori UNIX hanno sviluppato norme di sviluppo culturale Software, che divenne importante quanto lo stesso UNIX. ( )

Alcuni degli esempi più famosi di sistemi operativi simili a UNIX sono macOS, Solaris, BSD e NeXTSTEP.

Ruolo sociale nella comunità dei professionisti IT e ruolo storico

L'UNIX originale funzionava su grandi computer multiutente, che offrivano anche sistemi operativi proprietari del produttore dell'hardware, come RSX-11 e il suo discendente VMS. Nonostante il fatto che secondo una serie di opinioni [ di chi?] UNIX di quel tempo aveva degli svantaggi rispetto a questi sistemi operativi (ad esempio, la mancanza di motori di database seri), era: a) più economico e talvolta gratuito per le istituzioni accademiche b) era portabile da un'apparecchiatura all'altra e sviluppato nel formato C portatile linguaggio, che “disaccoppiava” lo sviluppo dei programmi da apparecchiature specifiche. Inoltre, l'esperienza dell'utente si è rivelata "disaccoppiata" dall'hardware e dal produttore: una persona che ha lavorato con UNIX su VAX potrebbe facilmente lavorarci su 68xxx e così via.

I produttori di hardware a quel tempo avevano spesso un atteggiamento freddo nei confronti di UNIX, considerandolo un giocattolo e offrendo il loro sistema operativo proprietario per lavori seri, principalmente DBMS e applicazioni aziendali basate su di essi in strutture commerciali. Sono noti commenti al riguardo da parte del DEC riguardo al suo VMS. Le aziende lo ascoltarono, ma non l'ambiente accademico, che aveva tutto ciò di cui aveva bisogno in UNIX, spesso non richiedeva il supporto ufficiale del produttore, gestiva da solo e apprezzava il basso costo e la portabilità di UNIX. Pertanto, UNIX è stato forse il primo sistema operativo portabile su hardware diverso.

La seconda drammatica ascesa di UNIX fu comparsa dei processori RISC intorno al 1989. Anche prima c'erano i cosiddetti. le workstation sono computer personali monoutente ad alta potenza che dispongono di memoria sufficiente, un disco rigido e un sistema operativo sufficientemente sviluppato (multitasking, protezione della memoria) per funzionare con applicazioni serie, come il CAD. Tra i produttori di tali macchine, si è distinta Sun Microsystems, che si è fatta un nome.

Prima dell'avvento dei processori RISC, queste stazioni utilizzavano tipicamente un processore Motorola 680x0, lo stesso dei computer Apple (anche se con un sistema operativo più avanzato di quello di Apple). Intorno al 1989 apparvero sul mercato implementazioni commerciali di processori con architettura RISC. La decisione logica di alcune aziende (Sun e altre) è stata quella di portare UNIX su queste architetture, il che ha comportato immediatamente il trasferimento dell'intero ecosistema software UNIX.

I sistemi operativi proprietari seri, come VMS, iniziarono il loro declino proprio da questo momento (anche se fosse possibile trasferire il sistema operativo stesso su RISC, tutto era molto più complicato con le sue applicazioni, che in questi ecosistemi erano spesso sviluppate in linguaggio assembly o in linguaggi proprietari come BLISS), e UNIX divenne il sistema operativo per i computer più potenti del mondo.

Tuttavia in questo momento ecosistema ha iniziato a passare alla GUI rappresentata da Windows 3.0. Gli enormi vantaggi della GUI, nonché, ad esempio, il supporto unificato per tutti i tipi di stampanti, sono stati apprezzati sia dagli sviluppatori che dagli utenti. Ciò minò notevolmente la posizione di UNIX nel mercato dei PC: implementazioni come SCO e Interactive UNIX non erano in grado di supportare le applicazioni Windows. Per quanto riguarda la GUI per UNIX, chiamata X11 (c'erano altre implementazioni, molto meno popolari), non poteva funzionare completamente su un normale PC utente a causa dei requisiti di memoria: per il normale funzionamento X11 richiedeva 16 MB, mentre Windows 3.1 con esso funzionava sufficientemente bene per eseguire contemporaneamente sia Word che Excel in 8 MB (questa era la dimensione standard della memoria del PC a quel tempo). Con i prezzi elevati della memoria, questo era un fattore limitante.

Il successo di Windows ha dato impulso al progetto interno di Microsoft chiamato Windows NT, che era compatibile API con Windows, ma allo stesso tempo aveva tutte le stesse caratteristiche architettoniche di un sistema operativo serio come UNIX: multitasking, protezione completa della memoria, supporto per macchine multiprocessore, diritti di accesso ai file e directory, registro di sistema. Windows NT introdusse anche il file system journaled NTFS, che a quel tempo superava in capacità tutti i file system forniti standard con UNIX: gli analoghi di UNIX erano solo prodotti commerciali separati di Veritas e altri.

Sebbene Windows NT inizialmente non fosse popolare, a causa dell'elevato fabbisogno di memoria (gli stessi 16 MB), permise a Microsoft di entrare nel mercato delle soluzioni server, come i sistemi di gestione di database. Molti all'epoca non credevano che Microsoft, tradizionalmente una società di software desktop, potesse essere un attore nel mercato del software aziendale, che aveva già grandi nomi come Oracle e Sun. A questo dubbio si aggiungeva il fatto che Microsoft DBMS - SQL Server - è iniziato come una versione semplificata di Sybase SQL Server, concessa in licenza da Sybase e compatibile al 99% in tutti gli aspetti del lavoro con esso.

Nella seconda metà degli anni '90, Microsoft iniziò a inserire UNIX nel mercato dei server aziendali.

La combinazione dei fattori di cui sopra, così come il crollo dei prezzi dei controller video 3D, che si sono trasformati da apparecchiature professionali in apparecchiature domestiche, hanno sostanzialmente ucciso il concetto stesso di workstation all'inizio degli anni 2000.

Inoltre, i sistemi Microsoft sono più facili da gestire, soprattutto nei casi d’uso comuni.

Ma in questo momento iniziò la terza forte ascesa di UNIX.

Inoltre, Stallman e i suoi compagni, pienamente consapevoli che il successo del software non aziendale richiede strumenti di sviluppo non proprietari, hanno sviluppato una serie di compilatori per vari linguaggi di programmazione (gcc), che, insieme alle utilità GNU precedentemente sviluppate ( sostituendo le utilità UNIX standard) ha compilato un pacchetto software necessario e abbastanza potente per uno sviluppatore.

Un serio concorrente di Linux a quel tempo era FreeBSD, tuttavia, lo stile "cattedrale" di gestione dello sviluppo in contrapposizione allo stile "bazaar" di Linux, così come un arcaismo tecnico molto maggiore in questioni come il supporto per macchine multiprocessore e file eseguibili. formati, rallentarono notevolmente lo sviluppo di FreeBSD rispetto a Linux, rendendo quest'ultimo il fiore all'occhiello del mondo del software libero.

Successivamente, Linux ha raggiunto nuove e nuove vette:

  • trasferimento di prodotti proprietari seri come Oracle;
  • Il serio interesse di IBM per questo ecosistema come base per le sue soluzioni verticali;
  • l'emergere di analoghi di quasi tutti i programmi familiari del mondo Windows;
  • rifiuto di alcuni produttori di apparecchiature di richiedere la preinstallazione di Windows;
  • rilascio di netbook solo con Linux;
  • utilizzare come kernel in Android.

Attualmente Linux è un sistema operativo meritatamente popolare per i server, anche se molto meno popolare sui desktop.

Alcune caratteristiche architettoniche del sistema operativo UNIX

Di seguito sono riportate le caratteristiche di UNIX che distinguono questa famiglia da altri sistemi operativi.

  • Il file system è basato su alberi, fa distinzione tra maiuscole e minuscole nei nomi e presenta restrizioni molto deboli sulla lunghezza dei nomi e dei percorsi.
  • Non c'è supporto per i file strutturati da parte del kernel del sistema operativo; a livello di chiamata di sistema, un file è un flusso di byte.
  • La riga di comando si trova nello spazio degli indirizzi del processo avviato e non viene recuperata da una chiamata di sistema dal processo dell'interprete dei comandi (come accade, ad esempio, in RSX-11).
  • Il concetto di “variabili ambientali”.
  • Avvio di processi chiamando fork(), ovvero la possibilità di clonare il processo corrente con l'intero stato.
  • Concetti stdin/stdout/stderr.
  • I/O solo tramite descrittori di file.
  • Tradizionalmente, supporto estremamente debole per l'I/O asincrono, rispetto a VMS e Windows NT.
  • Un interprete dei comandi è un'applicazione ordinaria che comunica con il kernel utilizzando chiamate di sistema ordinarie (in RSX-11 e VMS, l'interprete dei comandi veniva eseguito come un'applicazione speciale, posizionata appositamente nella memoria, utilizzando chiamate di sistema speciali; erano supportate anche le chiamate di sistema, consentendo all'applicazione di accedere ai comandi dell'interprete principale).
  • Un comando da riga di comando non è altro che il nome di un file di programma; non è richiesta alcuna registrazione speciale o sviluppo speciale di programmi come comandi (che era una pratica comune in RSX-11, RT-11).
  • Non è accettato l'approccio con un programma che pone domande all'utente sulle sue modalità operative; vengono invece utilizzati parametri da riga di comando (in VMS, RSX-11, RT-11 i programmi funzionavano anche con la riga di comando, ma in sua assenza hanno richiesto l'inserimento di parametri).
  • Uno spazio dei nomi del dispositivo disco nella directory /dev che può essere gestito dall'amministratore, a differenza dell'approccio Windows, in cui lo spazio dei nomi si trova nella memoria del kernel e l'amministrazione di questo spazio (ad esempio, l'impostazione dei diritti di accesso) è estremamente difficile a causa della mancanza di archiviazione permanente su dischi (creata ogni volta che si avvia).
  • Ampio utilizzo di file di testo per memorizzare le impostazioni, al contrario di un database di impostazioni binario come in Windows.
  • Ampio utilizzo di utilità di elaborazione del testo per eseguire attività quotidiane sotto il controllo di script.
  • “Promozione” del sistema operativo dopo il caricamento del kernel eseguendo script con un interprete di comandi standard.
  • Ampio uso di pipe denominate.
  • Tutti i processi tranne init sono uguali tra loro; non esistono “processi speciali”.
  • Lo spazio degli indirizzi è diviso in un kernel globale per tutti i processi e una parte locale del processo; non esiste una parte "gruppo" dello spazio degli indirizzi, come in VMS e Windows NT, così come la possibilità di caricare codice lì ed eseguirlo Là.
  • Utilizzo di due livelli di privilegio del processore invece di quattro in VMS.
  • Rifiuto di utilizzare overlay a favore della divisione del programma in diversi programmi più piccoli che comunicano tramite pipe denominate o file temporanei.
  • Assenza di APC e analoghi, ovvero segnali arbitrari (piuttosto che strettamente elencati in un set standard) che non vengono consegnati al desiderio esplicito del processo di riceverli (Windows, VMS).
  • Il concetto di segnale è esclusivo di UNIX ed è estremamente difficile da trasferire su altri sistemi operativi come Windows.

Standard

Il gran numero di diverse varianti del sistema UNIX ha portato alla necessità di standardizzare le sue strutture al fine di semplificare la portabilità delle applicazioni e sollevare l'utente dalla necessità di apprendere le caratteristiche di ciascuna variante di UNIX.

A questo scopo già nel 1980 è stato creato il gruppo utenti /usr/group. I primi standard furono sviluppati nel 1984-1985.

Uno dei primi standard fu il System V Interface Definition (SVID), rilasciato da UNIX System Laboratories (USL) contemporaneamente a UNIX System V Release 4. Questo documento, tuttavia, non divenne ufficiale.

Insieme alle versioni UNIX System V, c'era una direzione UNIX BSD. Per garantire la compatibilità tra System V e BSD, sono stati creati gruppi di lavoro POSIX ( P ortable O operante S sistema IO interfaccia per UNI X). Esistono molti standard POSIX, ma il più noto è POSIX 1003.1-1988, che definisce l'Application Programming Interface (API). Viene utilizzato non solo in UNIX, ma anche in altri sistemi operativi. (

Se di recente hai iniziato a studiare Linux e a sentirti a tuo agio in questo vasto universo, probabilmente ti sei imbattuto spesso nel termine Unix. Assomiglia molto a Linux, ma cosa significa? Probabilmente ti starai chiedendo in cosa differisce Unix da Linux. La risposta a questa domanda dipende da cosa capisci con queste parole. Dopotutto, ognuno di essi può essere interpretato in modo diverso. In questo articolo esamineremo una storia semplificata di Linux e Unix per aiutarti a capire cosa sono e come sono correlati. Come sempre, sentitevi liberi di porre domande o aggiungere ulteriori informazioni nei commenti.

Unix ha iniziato la sua storia tra la fine degli anni '60 e l'inizio degli anni '70 presso i laboratori di ricerca informatica AT&T Bell Labs negli Stati Uniti. Insieme al MIT e alla General Electric, il laboratorio di ricerca Bell Labs ha iniziato a sviluppare un nuovo sistema operativo. Alcuni ricercatori erano insoddisfatti del progresso nello sviluppo di questo sistema operativo. Si sono allontanati dal lavoro sul progetto principale e hanno iniziato a sviluppare il proprio sistema operativo. Nel 1970 questo sistema fu chiamato Unix e due anni dopo fu completamente riscritto nel linguaggio di programmazione C.

Ciò ha consentito a Unix di essere distribuito e portato su vari dispositivi e piattaforme informatiche.

Mentre Unix continuava ad evolversi, AT&T iniziò a vendere licenze per utilizzarlo nelle università e per scopi commerciali. Ciò significava che non tutti potevano, come adesso, modificare e distribuire liberamente il codice del sistema operativo Unix. Ben presto iniziarono ad apparire molte edizioni e varianti del sistema operativo Unix, progettate per risolvere vari problemi. Il più famoso di questi era BSD.

Linux è simile a Unix in funzionalità e caratteristiche, ma non nel codice base. Questo sistema operativo è stato assemblato da due progetti. Il primo è il progetto GNU, sviluppato da Richard Stallman nel 1983, il secondo è il kernel Linux, scritto da Linus Torvalds nel 1991.

L'obiettivo del progetto GNU era creare un sistema simile ma indipendente da Unix. In altre parole, un sistema operativo che non contenesse codice Unix e potesse essere distribuito e modificato liberamente senza restrizioni, come il software libero. Poiché il kernel Linux libero non poteva funzionare da solo, il progetto GNU si fuse con il kernel Linux e nacque il sistema operativo Linux.

Linux è stato progettato sotto l'influenza del sistema Minix, un discendente di Unix, ma tutto il codice è stato scritto da zero. A differenza di Unix, utilizzato su server e mainframe di grandi dimensioni di varie aziende, Linux è stato progettato per l'uso su computer di casa con hardware più semplice.

Oggi Linux funziona su un numero enorme di piattaforme, più di qualsiasi altro sistema operativo, si tratta di server, sistemi embedded, microcomputer, modem e persino Telefono cellulare. Ora la differenza tra Linux e Unix verrà discussa più in dettaglio.

Cos'è Unix

Il termine Unix può riferirsi ai seguenti concetti:

  • Il sistema operativo originale sviluppato presso AT&T Bell Labs, sulla base del quale vengono sviluppati altri sistemi operativi.
  • Marchio, scritto in maiuscolo. UNIX appartiene a The Open Group, che ha sviluppato una serie di standard per i sistemi operativi: la specifica UNIX unica. Solo i sistemi che rispettano gli standard possono essere legittimamente chiamati UNIX. La certificazione non è gratuita e richiede agli sviluppatori di pagare per utilizzare il marchio.
  • Tutti i sistemi operativi sono registrati con il nome Unix. Perché soddisfano gli standard sopra menzionati. Questi sono AIX, A/UX, HP-UX, Inspur K-UX, Reliant UNIX, Solaris, IRIX, Tru64, UnixWare, z/OS e OS X - sì, anche quelli che funzionano sui computer Apple.

Cos'è Linux

Il termine Linux si riferisce solo al kernel. sistema operativo Non sarebbe completo senza un ambiente desktop e applicazioni. Poiché la maggior parte delle applicazioni sono state sviluppate e vengono attualmente sviluppate nell'ambito del progetto GNU, il nome completo del sistema operativo è GNU/Linux.

Al giorno d'oggi molte persone usano il termine Linux per riferirsi a tutte le distribuzioni basate sul kernel Linux. Attualmente, la versione più recente del kernel Linux è la 4.4, la versione 4.5 è in fase di sviluppo. La numerazione delle versioni del kernel è stata modificata da 3.x a 4.x non molto tempo fa.

Linux è un sistema operativo simile a Unix che si comporta come Unix ma non contiene il proprio codice. I sistemi operativi simili a Unix sono spesso chiamati Un*x, *NIX e *N?X, o anche Unixoids. Linux non ha la certificazione Unix e GNU sta per GNU e non Unix, quindi sotto questo aspetto Mac OS X è più Unix che Linux. Tuttavia, il kernel Linux e il sistema operativo GNU Linux sono molto simili a Unix in termini di funzionalità e implementano la maggior parte dei principi della filosofia Unix. Ciò include codice leggibile dall'uomo, memorizzazione della configurazione del sistema in file di testo separati e l'uso di piccoli strumenti da riga di comando, una shell grafica e un gestore di sessioni.

È importante notare che non tutti i sistemi simili a Unix hanno ricevuto la certificazione UNIX. In determinati contesti, tutti i sistemi operativi basati su UNIX o sulle sue idee sono chiamati UNIX-like, indipendentemente dal fatto che dispongano o meno di un certificato UNIX. Inoltre, possono essere commerciali e gratuiti.

Spero che ora sia più chiaro in che cosa Unix differisce da Linux. Ma andiamo ancora oltre e riassumiamo.

Principali differenze

  • Linux è un sistema operativo libero e open source, mentre l'Unix originale non lo è, ad eccezione di alcuni suoi derivati.
  • Linux è un clone dell'originale Unix, ma non ne contiene il codice.
  • La differenza principale tra Unix e Linux è che Linux è solo un kernel, mentre Unix era ed è un sistema operativo a tutti gli effetti.
  • Linux è stato sviluppato per i personal computer. E Unix si rivolge principalmente a workstation e server di grandi dimensioni.
  • Oggi Linux supporta più piattaforme di Unix.
  • Linux supporta più tipi di file system rispetto a Unix.

Come puoi vedere, la confusione di solito nasce perché Linux vs Unix può significare cose completamente diverse. Qualunque sia il significato, resta il fatto che Unix venne prima e Linux dopo. Linux è nato dal desiderio di libertà e portabilità del software, ispirato dall'approccio Unix. Si può dire con certezza che tutti abbiamo un debito nei confronti del movimento del software libero, perché senza di esso il mondo sarebbe un posto molto peggiore.

Sabbiera

barbo divertente 19 marzo 2011 alle 23:16

In cosa differisce Linux da UNIX e cos'è un sistema operativo simile a UNIX?

  • Ripostiglio *
UNIX
UNIX (non ne vale la pena confuso con la definizione di “sistema operativo simile a UNIX”) - una famiglia di sistemi operativi (Mac OS X, GNU/Linux).
Il primo sistema è stato sviluppato nel 1969 presso i Bell Laboratories, un'ex società americana.

Caratteristiche distintive di UNIX:

  1. Facile configurazione del sistema utilizzando file semplici, solitamente di testo.
  2. Ampio utilizzo della riga di comando.
  3. Utilizzo di trasportatori.
Oggigiorno UNIX viene utilizzato principalmente su server e come sistema per l'hardware.
È impossibile non notare l'enorme importanza storica dei sistemi UNIX. Ora sono riconosciuti come uno dei sistemi operativi storicamente più importanti. Durante lo sviluppo dei sistemi UNIX è stato creato il linguaggio C.

Varianti UNIX per anno

Sistema operativo simile a UNIX
Sistema operativo simile a UNIX (A volte usa l'abbreviazione *nix) - un sistema formato sotto l'influenza di UNIX.

La parola UNIX è utilizzata come marchio di conformità e come marchio.

Il consorzio Open Group possiede il marchio "UNIX", ma è meglio conosciuto come l'autorità di certificazione del marchio UNIX. Recentemente, The Open Group ha fatto luce sulla pubblicazione delle Single UNIX Specifiche, gli standard che un sistema operativo deve soddisfare per potersi chiamare orgogliosamente Unix.

Puoi dare un'occhiata all'albero genealogico dei sistemi operativi simili a UNIX.

Linux
Linux - nome comune Sistemi operativi basati su UNIX sviluppati come parte del progetto GNU (progetto di sviluppo software open source). Linux funziona su un'enorme varietà di architetture di processori, che vanno da ARM a Intel x86.

Le distribuzioni più famose e diffuse sono Arch Linux, CentOS, Debian. Esistono anche molte distribuzioni "domestiche" russe: ALT Linux, ASPLinux e altre.

C'è un po' di controversia sulla denominazione di GNU/Linux.
I sostenitori dell'"open source" usano il termine "Linux", mentre i sostenitori del "software libero" usano "GNU/Linux". Preferisco la prima opzione. A volte, per comodità di rappresentare il termine GNU/Linux, vengono utilizzate le parole “GNU+Linux”, “GNU-Linux”, “GNU Linux”.

A differenza dei sistemi commerciali (MS Windows, Mac OS X), Linux non dispone di un centro di sviluppo geografico e di un'organizzazione specifica proprietaria del sistema. Il sistema stesso e i relativi programmi sono il risultato del lavoro di enormi comunità, migliaia di progetti. Chiunque può partecipare al progetto o crearne uno proprio!

Conclusione
Così abbiamo imparato la catena: UNIX -> Sistema operativo simile a UNIX -> Linux.

Per riassumere, posso dire che le differenze tra Linux e UNIX sono evidenti. UNIX è un concetto molto più ampio, il fondamento per la costruzione e la certificazione di tutti i sistemi simili a UNIX, e Linux è un caso speciale di UNIX.

Tag: unix, linux, nix, Linux, unix

Questo articolo non è soggetto a commenti perché il suo autore non lo è ancora

Sabbiera

uomo di ferro 19 marzo 2011 alle 23:16

In cosa differisce Linux da UNIX e cos'è un sistema operativo simile a UNIX?

UNIX
UNIX (non ne vale la pena confuso con la definizione di “sistema operativo simile a UNIX”) - una famiglia di sistemi operativi (Mac OS X, GNU/Linux).
Il primo sistema è stato sviluppato nel 1969 presso i Bell Laboratories, un'ex società americana.

Caratteristiche distintive di UNIX:

  1. Facile configurazione del sistema utilizzando file semplici, solitamente di testo.
  2. Ampio utilizzo della riga di comando.
  3. Utilizzo di trasportatori.
Oggigiorno UNIX viene utilizzato principalmente su server e come sistema per l'hardware.
È impossibile non notare l'enorme importanza storica dei sistemi UNIX. Ora sono riconosciuti come uno dei sistemi operativi storicamente più importanti. Durante lo sviluppo dei sistemi UNIX è stato creato il linguaggio C.

Varianti UNIX per anno

Sistema operativo simile a UNIX
Sistema operativo simile a UNIX (A volte usa l'abbreviazione *nix) - un sistema formato sotto l'influenza di UNIX.

La parola UNIX è utilizzata come marchio di conformità e come marchio.

Il consorzio Open Group possiede il marchio "UNIX", ma è meglio conosciuto come l'autorità di certificazione del marchio UNIX. Recentemente, The Open Group ha fatto luce sulla pubblicazione delle Single UNIX Specifiche, gli standard che un sistema operativo deve soddisfare per potersi chiamare orgogliosamente Unix.

Puoi dare un'occhiata all'albero genealogico dei sistemi operativi simili a UNIX.

Linux
Linux- il nome generale dei sistemi operativi basati su UNIX che sono stati sviluppati nell'ambito del progetto GNU (progetto di sviluppo software open source). Linux funziona su un'enorme varietà di architetture di processori, che vanno da ARM a Intel x86.

Le distribuzioni più famose e diffuse sono Arch Linux, CentOS, Debian. Esistono anche molte distribuzioni "domestiche" russe: ALT Linux, ASPLinux e altre.

C'è un po' di controversia sulla denominazione di GNU/Linux.
I sostenitori dell'"open source" usano il termine "Linux", mentre i sostenitori del "software libero" usano "GNU/Linux". Preferisco la prima opzione. A volte, per comodità di rappresentare il termine GNU/Linux, vengono utilizzate le parole “GNU+Linux”, “GNU-Linux”, “GNU Linux”.

A differenza dei sistemi commerciali (MS Windows, Mac OS X), Linux non dispone di un centro di sviluppo geografico e di un'organizzazione specifica proprietaria del sistema. Il sistema stesso e i relativi programmi sono il risultato del lavoro di enormi comunità, migliaia di progetti. Chiunque può partecipare al progetto o crearne uno proprio!

Conclusione
Così abbiamo imparato la catena: UNIX -> Sistema operativo simile a UNIX -> Linux.

Per riassumere, posso dire che le differenze tra Linux e UNIX sono evidenti. UNIX è un concetto molto più ampio, il fondamento per la costruzione e la certificazione di tutti i sistemi simili a UNIX, e Linux è un caso speciale di UNIX.

Tag: unix, linux, nix, Linux, unix

Questo articolo non è soggetto a commenti perché il suo autore non lo è ancora

MINISTERO DELL'ISTRUZIONE E DELLA SCIENZA RUSSA

FEDERAZIONE

AGENZIA FEDERALE PER L'ISTRUZIONE

ISTITUTO EDUCATIVO STATALE

FORMAZIONE PROFESSIONALE SUPERIORE

UNIVERSITÀ RADIOTECNICA STATALE DI TAGANROG

Disciplina "Informatica"

"Sistema operativo UNIX"

Completato da: Orda-Zhigulina D.V., gr. E-25

Controllato da: Vishnevetsky V.Yu.

Taganrog 2006


introduzione

Cos'è Unix 3

Dove trovare Unix 7 gratis

Parte principale. (Descrizione Unix)

1. Concetti base di Unix 8

2. Sistema di file 9

2.1 Tipi di file 9

3. Interprete dei comandi 11

4. Kernel del sistema operativo UNIX 12

4.1 Organizzazione generale del kernel tradizionale del sistema operativo UNIX 13

4.2 Funzioni di base del kernel 14

4.3 Principi di interazione con il kernel 15

4.4 Principi di gestione degli interrupt 17

5. Controllo I/O 18

5.1 Principi del buffering degli I/O del sistema 19

5.2 Chiamate di sistema per il controllo I/O 21

6. Interfacce e punti di ingresso del conducente 23

6.1 Blocca conducenti 23

6.2 Driver dei caratteri 24

6.3 Driver di streaming 25

7. Comandi e utilità 25

7.1 Organizzazione del team nel sistema operativo UNIX 26

7.2 Reindirizzamento I/O e pipeline 26

7.3 Comandi integrati, libreria e utente 26

7.4 Programmazione in linguaggio di comando 27

8. Strumenti dell'interfaccia utente grafica 27

8.1 ID utente e gruppo utenti 30

8.2 Protezione dei file 32

8.3 Futuri sistemi operativi che supportano l'ambiente operativo UNIX 33

Conclusione

Principali differenze tra Unix e altri OS 36

Applicazioni di Unix 37


introduzione

Cos'è Unix

Il termine Unix e il non del tutto equivalente UNIX vengono utilizzati con significati diversi. Cominciamo dal secondo dei termini, poiché è più semplice. In poche parole, UNIX (in quella forma) è un marchio registrato originariamente di proprietà di AT&T Corporation, che ha attraversato molti proprietari nel corso della sua lunga vita ed è ora di proprietà di un'organizzazione chiamata Open Group. Il diritto di utilizzare il nome UNIX si ottiene attraverso una sorta di “controllo dei pidocchi” - superando test di conformità alle specifiche di un determinato sistema operativo di riferimento (Single Unix Standard - che in questo caso può essere tradotto come Single Standard su Unix). Questa procedura non solo è complessa, ma anche molto costosa, per cui solo pochi sistemi operativi attualmente in uso sono stati sottoposti ad essa, e tutti sono proprietari, cioè di proprietà di alcune aziende.

Tra le aziende che si sono guadagnate il diritto al nome UNIX grazie agli sforzi degli sviluppatori/tester e al sangue (più precisamente, al dollaro) dei proprietari ci sono le seguenti:

Sun con il suo SunOS (meglio conosciuto nel mondo come Solaris);

IBM, che ha sviluppato il sistema AIX;

Hewlett-Packard è il proprietario del sistema HP-UX;

IRIX è un sistema operativo di SGI.

Inoltre, il nome UNIX stesso viene applicato ai sistemi:

True64 Unix, sviluppato dalla DEC, con la liquidazione della quale è passato alla Compaq, ed ora, insieme a quest'ultima, è divenuto proprietà della stessa Hewlett-Packard;

UnixWare è di proprietà di SCO (il prodotto della fusione di Caldera e Santa Cruz Operation).

Essendo proprietari, tutti questi sistemi vengono venduti per un sacco di soldi (anche per gli standard americani). Tuttavia questo non è l'ostacolo principale alla diffusione degli UNIX stessi, poiché la loro caratteristica comune è il legame con determinate piattaforme hardware: AIX funziona su server e workstation IBM con processori Power, HP-UX - sul proprio HP-PA (Precision Architettura) macchine. , IRIX - su stazioni grafiche di SGI che trasportano processori MIPS, True64 Unix - destinato ai processori Alpha (sfortunatamente deceduto). Solo UnixWare è focalizzato sulla piattaforma PC "democratica" e Solaris esiste in versioni per due architetture - il proprio, Sparc, e tutti lo stesso PC. Il che, tuttavia, non ha contribuito molto alla loro popolarità, a causa del supporto relativamente debole per le nuove periferiche per PC.

Pertanto, UNIX è principalmente un concetto legale. Ma il termine Unix ha un'interpretazione tecnologica. Questo è il nome comune nel settore IT per l'intera famiglia di sistemi operativi, derivati ​​dall'UNIX "originale" di AT&T, o che ne riproducono le funzioni "da zero", compresi i sistemi operativi liberi come Linux, FreeBSD e altri BSD, senza test richiesti non sono mai stati testati per la conformità allo standard Single Unix. Ecco perché sono spesso chiamati simili a Unix.

Molto utilizzato è anche il termine “sistemi compatibili con POSIX”, dal significato simile, che unisce una famiglia di sistemi operativi conformi all'insieme di standard con lo stesso nome. Gli stessi standard POSIX (Portable Operation System Interface based on uniX) sono stati sviluppati basandosi sulle pratiche adottate nei sistemi Unix, e quindi questi ultimi sono tutti, per definizione, compatibili con POSIX. Tuttavia questi non sono del tutto sinonimi: i sistemi operativi che sono collegati a Unix solo indirettamente (QNX, Syllable) o che non lo sono affatto (fino a Windows NT/2000/XP) dichiarano di essere compatibili con gli standard POSIX.

Per chiarire la relazione tra UNIX, Unix e POSIX, dovremo andare un po' più a fondo nella storia. In realtà, la storia di questo problema è discussa in dettaglio nel capitolo corrispondente del libro “Free Unix: Linux, FreeBSD e altri” (di prossima pubblicazione dalla casa editrice BHV-Pietroburgo) e in articoli sulla storia di Linux e Sistemi BSD.

Il sistema operativo Unix (più precisamente, la sua prima versione) è stato sviluppato dai dipendenti dei Bell Labs (una divisione di AT&T) nel 1969-1971. I suoi primi autori, Ken Thompson e Dennis Ritchie, lo hanno fatto esclusivamente per i propri scopi, in particolare per divertirsi con il loro gioco preferito StarTravel. E per una serie di ragioni legali, l'azienda stessa non poteva utilizzarlo come prodotto commerciale. Tuttavia, l'uso pratico di Unix è stato trovato abbastanza rapidamente. In primo luogo, è stato utilizzato presso i Bell Labs per preparare vari tipi di documentazione tecnica (inclusi i brevetti). In secondo luogo, il sistema di comunicazione UUCP (Unix to Unix Copy Programm) era basato su Unix.

Un altro campo di applicazione di Unix negli anni '70 e all'inizio degli anni '80 del secolo scorso si è rivelato del tutto insolito. Vale a dire, nei testi originali è stato distribuito tra le istituzioni scientifiche che svolgono lavori nel campo dell'informatica. Lo scopo di tale diffusione (non era del tutto gratuita nell'accezione corrente, ma in realtà si rivelò molto liberale) era: l'educazione e la ricerca nel suddetto campo della conoscenza.

Il sistema più famoso è BSD Unix, creato presso l'Università di Berkeley, in California. Il quale, liberandosi gradualmente dal codice proprietario dell'Unix primordiale, alla fine, dopo drammatici alti e bassi (descritti in dettaglio qui), ha dato origine ai moderni sistemi BSD gratuiti: FreeBSD, NetBSD e altri.

Uno dei risultati più importanti del lavoro degli hacker universitari è stata (1983) l'introduzione in Unix del supporto per il protocollo TCP/IP, su cui si basava l'allora ARPANET (e che divenne la base della moderna Internet). Questo divenne un prerequisito per il dominio di Unix in tutti i settori legati al World Wide Web. E questo si è rivelato essere il successivo applicazione pratica questa famiglia di sistemi operativi - a quel punto non c'era più bisogno di parlare di un singolo Unix. Perché, come accennato in precedenza, due dei suoi rami furono separati: originati dall'UNIX primordiale (nel tempo ricevette il nome Sistema V) e dal sistema di origine Berkeley. D'altra parte, System V costituiva la base di quei vari UNIX proprietari, che, di fatto, avevano il diritto legale di rivendicare questo nome.

Quest'ultima circostanza - la ramificazione di un sistema operativo un tempo unico in più linee, perdendo gradualmente la compatibilità - è entrata in conflitto con uno dei pilastri dell'ideologia Unix: la portabilità del sistema tra diverse piattaforme e delle sue applicazioni - da un sistema Unix a un altro. Ciò ha dato origine alle attività di vari tipi di organizzazioni di standardizzazione, che alla fine sono culminate nella creazione del set di standard POSIX, menzionato in precedenza.

Sono stati gli standard POSIX quelli su cui Linus Torvalds ha fatto affidamento quando ha creato il suo sistema operativo, Linux, “da zero” (cioè senza utilizzare codice preesistente). E lei, avendo padroneggiato rapidamente e con successo le tradizionali aree di applicazione dei sistemi Unix (sviluppo di software, comunicazioni, Internet), nel tempo ne ha aperto una nuova per loro: piattaforme utente desktop generiche. Ciò ne assicurò la popolarità tra la gente, una popolarità superiore a quella di tutti gli altri sistemi Unix messi insieme, sia proprietari che gratuiti.

Successivamente parleremo del lavoro sui sistemi Unix nel senso più ampio del termine, senza tener conto di tutti i tipi di marchi e altre questioni legali. Sebbene i principali esempi relativi ai metodi di lavoro saranno presi dall'area delle loro implementazioni gratuite - Linux, in misura minore FreeBSD, e in misura ancora minore - da altri sistemi BSD.

Dove posso ottenere Unix gratuito?

Database di FreeBSD - www.freebsd.org;

È possibile contattare www.sco.com


Parte principale. (Descrizione Unix)

1. Concetti base di Unix

Unix si basa su due concetti base: "processo" e "file". I processi rappresentano la parte dinamica del sistema, sono soggetti; e i file sono statici, sono oggetti delle azioni dei processi. Quasi l'intera interfaccia dei processi che interagiscono con il kernel e tra loro sembra scrivere/leggere file. Anche se dobbiamo aggiungere cose come segnali, memoria condivisa e semafori.

I processi possono essere suddivisi in modo molto approssimativo in due tipi: attività e demoni. Un'attività è un processo che esegue il proprio lavoro, cercando di completarlo rapidamente e di essere completato. Il demone attende l'elaborazione degli eventi, elabora gli eventi che si sono verificati e attende nuovamente; di solito termina per ordine di un altro processo; molto spesso viene ucciso dall'utente dando il comando "kill process_number". In questo senso, risulta che un'attività interattiva che elabora l'input dell'utente è più simile a un demone che a un'attività.

2. Sistema di file

Nei vecchi Unix venivano assegnate 14 lettere per nome, in quelli nuovi questa restrizione è stata rimossa: oltre al nome del file, la directory contiene il suo identificatore di inode, un numero intero che determina il numero del blocco in cui si trovano gli attributi del file sono scritti Tra questi: il numero utente - il proprietario del file; gruppi numerici; numero di collegamenti al file (vedi sotto), data e ora di creazione, ultima modifica e ultimo accesso al file; attributi di accesso. Attributi di accesso contenere il tipo di file (vedi sotto), gli attributi per modificare i diritti all'avvio (vedi sotto) e i diritti di accesso ad esso per il proprietario, il compagno di classe e altri per leggere, scrivere ed eseguire. Il diritto di cancellare un file è determinato dal diritto di scrivere nella directory sovrastante.

Ogni file (ma non la directory) può essere conosciuto con diversi nomi, ma devono trovarsi sulla stessa partizione. Tutti i collegamenti al file sono uguali; il file viene cancellato quando viene eliminato l'ultimo collegamento al file. Se il file è aperto (in lettura e/o scrittura), il numero di collegamenti ad esso aumenta di uno in più; quindi molti programmi che aprono un file temporaneo lo cancellano immediatamente, così che in caso di crash, quando il sistema operativo chiude i file aperti dal processo, questo file temporaneo viene cancellato dal sistema operativo.

Ce n'è un altro caratteristica interessante file system: se, dopo aver creato un file, la scrittura su di esso non è stata eseguita di seguito, ma a intervalli ampi, lo spazio su disco non viene allocato per questi intervalli. Pertanto, il volume totale dei file in una partizione potrebbe essere maggiore del volume della partizione e, quando tale file viene eliminato, viene liberato meno spazio rispetto alla sua dimensione.

2.1 Tipi di file

I file sono dei seguenti tipi:

file regolare ad accesso diretto;

directory (un file contenente i nomi e gli identificatori di altri file);

collegamento simbolico (una stringa con il nome di un altro file);

dispositivo di blocco (disco o nastro magnetico);

dispositivo seriale (terminali, porte seriali e parallele; anche i dischi e i nastri magnetici hanno un'interfaccia seriale)

canale denominato.

I file speciali progettati per funzionare con i dispositivi si trovano solitamente nella directory "/dev". Eccone alcuni (nella nomination di FreeBSD):

tty* - terminali, inclusi: ttyv - console virtuale;

ttyd - Terminale DialIn (solitamente una porta seriale);

cuaa: linea DialOut

ttyp - pseudo-terminale di rete;

tty: terminale a cui è associata l'attività;

wd* - dischi rigidi e relative sottosezioni, tra cui: wd - disco rigido;

wds - partizione di questo disco (qui chiamata "slice");

wds - sezione della partizione;

fd - dischetto;

rwd*, rfd* - uguale a wd* e fd*, ma con accesso sequenziale;

A volte è necessario che un programma avviato da un utente non abbia i diritti dell'utente che lo ha avviato, ma alcuni altri. In questo caso, l'attributo di modifica dei diritti è impostato sui diritti dell'utente, il proprietario del programma. (Come esempio darò un programma che legge un file con domande e risposte e, in base a ciò che ha letto, mette alla prova lo studente che ha lanciato questo programma. Il programma deve avere il diritto di leggere il file con le risposte, ma lo studente chi lo ha lanciato no.) Così funziona, ad esempio, il programma passwd, con il quale l'utente può cambiare la propria password. L'utente può eseguire il programma passwd, può apportare modifiche al database di sistema, ma l'utente non può.

A differenza di DOS, che nome e cognome assomiglia a "drive:pathname" e RISC-OS, in cui appare come "-filesystem-drive:$.path.name" (che in generale ha i suoi vantaggi), Unix utilizza una notazione trasparente della forma "/ percorso/nome ". La radice viene misurata dalla partizione da cui è stato caricato il kernel Unix. Se è necessario utilizzare un'altra partizione (e la partizione di avvio di solito contiene solo l'essenziale per l'avvio), utilizzare il comando `mount /dev/partition_file directory`. In questo caso, i file e le sottodirectory che precedentemente si trovavano in questa directory diventano inaccessibili finché la partizione non viene smontata (ovviamente tutti gente normale utilizzare directory vuote per montare le partizioni). Solo il supervisore ha il diritto di montare e smontare.

Una volta avviato, ogni processo può aspettarsi di avere tre file già aperti, che conosce come input standard stdin al descrittore 0; stdout standard sul descrittore 1; e output standard stderr sul descrittore 2. Quando accede al sistema, quando l'utente inserisce un nome e una password e la shell viene lanciata per lui, tutti e tre vengono indirizzati a /dev/tty; successivamente ognuno di essi può essere reindirizzato a qualsiasi file.

3. Interprete dei comandi

Unix include quasi sempre due interpreti di comandi: sh (shell) e csh (shell simile a C). Oltre a loro, ci sono anche bash (Bourne), ksh (Korn) e altri. Senza entrare nei dettagli, darò i principi generali:

Tutti i comandi, ad eccezione della modifica della directory corrente, dell'impostazione delle variabili di ambiente e delle istruzioni di programmazione strutturata, sono programmi esterni. Questi programmi si trovano solitamente nelle directory /bin e /usr/bin. I programmi di amministrazione del sistema si trovano nelle directory /sbin e /usr/sbin.

Il comando è composto dal nome del programma da avviare e dagli argomenti. Gli argomenti sono separati dal nome del comando e tra loro da spazi e tabulazioni. Alcuni caratteri speciali vengono interpretati dalla shell stessa, ad esempio " " ` ! $ ^ * ? | & ; (cos'altro?).

È possibile eseguire più comandi su una riga di comando. Le squadre possono essere divise; (esecuzione sequenziale di comandi), & (esecuzione asincrona simultanea di comandi), | (esecuzione sincrona, lo stdout del primo comando verrà inviato allo stdin del secondo).

Puoi anche prendere l'input standard da un file includendo "file" (il file verrà azzerato) o ">>file" (la scrittura verrà scritta alla fine del file) come uno degli argomenti.

Se hai bisogno di ottenere informazioni su qualsiasi comando, dai il comando "man command_name". Questo verrà visualizzato sullo schermo tramite il programma “more” - guarda come gestirlo sul tuo Unix con il comando `man more`.

4. Kernel del sistema operativo UNIX

Come qualsiasi altro sistema operativo multiutente che protegge gli utenti gli uni dagli altri e protegge i dati di sistema da qualsiasi utente non privilegiato, UNIX ha un kernel sicuro che gestisce le risorse del computer e fornisce un insieme di servizi di base agli utenti.

La comodità e l'efficienza delle versioni moderne del sistema operativo UNIX non significa che l'intero sistema, compreso il kernel, sia progettato e strutturato nel miglior modo possibile. Il sistema operativo UNIX si è evoluto nel corso degli anni (è il primo sistema operativo nella storia che continua a guadagnare popolarità in un'età così matura - da più di 25 anni). Naturalmente, le capacità del sistema sono aumentate e, come spesso accade nei sistemi di grandi dimensioni, i miglioramenti qualitativi nella struttura del sistema operativo UNIX non hanno tenuto il passo con la crescita delle sue capacità.

Di conseguenza, il nucleo della maggior parte dei moderni sistemi operativi UNIX commerciali è un grande monolite strutturato in modo approssimativo. Per questo motivo, la programmazione a livello del kernel del sistema operativo UNIX continua a rimanere un'arte (ad eccezione della tecnologia comprovata e comprensibile per lo sviluppo di driver di dispositivi esterni). Questa mancanza di tecnologia nell'organizzazione del kernel del sistema operativo UNIX non soddisfa molti. Da qui il desiderio di riprodurre completamente l'ambiente del sistema operativo UNIX con un'organizzazione del sistema completamente diversa.

A causa del suo utilizzo diffuso, il kernel UNIX System V viene spesso discusso (può essere considerato tradizionale).

4.1 Organizzazione generale del kernel tradizionale del sistema operativo UNIX

Uno dei principali vantaggi del sistema operativo UNIX è che il sistema è altamente portabile. Il significato di questa qualità è che l'intero sistema operativo, incluso il suo kernel, è relativamente facile da portare su varie piattaforme hardware. Tutte le parti del sistema, escluso il kernel, sono completamente indipendenti dalla macchina. Questi componenti sono scritti bene in C e il loro porting su una nuova piattaforma (almeno nella classe a 32 bit) richiede solo la ricompilazione del codice sorgente nel codice del computer di destinazione.

Naturalmente, i problemi maggiori sono associati al kernel del sistema, che nasconde completamente le specificità del computer utilizzato, ma dipende da queste specificità. Come risultato di un'attenta separazione dei componenti del kernel dipendenti dalla macchina e indipendenti dalla macchina (a quanto pare, dal punto di vista degli sviluppatori del sistema operativo, questo è il risultato più alto ottenuto dagli sviluppatori del tradizionale kernel del sistema operativo UNIX), è stato possibile garantire che la parte principale del kernel non dipenda dalle caratteristiche architetturali della piattaforma di destinazione, sia scritta interamente in C e richieda solo la ricompilazione per essere trasferita su una nuova piattaforma.

Tuttavia, comparativamente no la maggior parte Il kernel è specifico per la macchina ed è scritto in un misto di linguaggio C e linguaggio assembly del processore di destinazione. Quando si trasferisce un sistema su una nuova piattaforma, questa parte del kernel deve essere riscritta utilizzando il linguaggio assembly e tenendo conto delle caratteristiche specifiche dell'hardware di destinazione. Le parti del kernel dipendenti dalla macchina sono ben isolate dalla parte principale indipendente dalla macchina e, con una buona comprensione dello scopo di ciascun componente dipendente dalla macchina, riscrivere la parte dipendente dalla macchina è principalmente un compito tecnico (sebbene richieda un'elevata capacità di programmazione).

La parte dipendente dalla macchina del tradizionale kernel del sistema operativo UNIX include i seguenti componenti:

promozione e inizializzazione del sistema a livello basso (per ora dipende dalle caratteristiche dell'apparecchiatura);

elaborazione primaria degli interrupt interni ed esterni;

gestione della memoria (nella parte che riguarda le funzionalità di supporto hardware per la memoria virtuale);

cambio del contesto del processo tra modalità utente e modalità kernel;

parti dei driver di dispositivo relative alle caratteristiche della piattaforma di destinazione.

4.2 Funzioni di base del kernel

Le funzioni principali del kernel del sistema operativo UNIX includono quanto segue:

(a) Inizializzazione del sistema: funzione di avvio e spin-up. Il kernel del sistema fornisce un bootstrap che carica il kernel completo nella memoria del computer ed esegue il kernel.

(b) Gestione di processi e thread: la funzione di creazione, terminazione e monitoraggio di processi e thread esistenti ("processi" in esecuzione su memoria virtuale condivisa). Poiché UNIX è un sistema operativo multiprocesso, il kernel consente ai processi in esecuzione di condividere il tempo del processore (o i processori su sistemi multiprocessore) e altre risorse del computer per creare l'impressione che i processi siano effettivamente eseguiti in parallelo.

(c) Gestione della memoria - la funzione di mappare la memoria virtuale praticamente illimitata dei processi nella RAM fisica del computer, che ha una dimensione limitata. Il componente del kernel corrispondente consente a più processi di condividere le stesse aree di memoria utilizzando la memoria esterna.

(d) Gestione dei file - una funzione che implementa l'astrazione del file system - gerarchie di directory e file. I file system UNIX supportano diversi tipi di file. Alcuni file potrebbero contenere dati ASCII, altri corrisponderanno a dispositivi esterni. Il file system memorizza file oggetto, file eseguibili, ecc. I file vengono generalmente archiviati su dispositivi di archiviazione esterni; l'accesso ad essi è fornito dal kernel. Nel mondo UNIX esistono diversi tipi di organizzazione del file system. Le versioni moderne del sistema operativo UNIX supportano contemporaneamente la maggior parte dei tipi di file system.

(e) Strumenti di comunicazione - una funzione che fornisce la capacità di scambiare dati tra processi in esecuzione all'interno di un computer (IPC - Inter-Process Communications), tra processi in esecuzione in diversi nodi di una rete dati locale o globale, nonché tra processi e driver di dispositivi esterni.

(f) Interfaccia del programma - una funzione che fornisce l'accesso alle funzionalità del kernel dai processi utente in base al meccanismo delle chiamate di sistema, concepite come una libreria di funzioni.

4.3 Principi di interazione con il kernel

Ogni sistema operativo supporta alcuni meccanismi che consentono ai programmi utente di accedere ai servizi del kernel del sistema operativo. Nei sistemi operativi del più famoso computer sovietico BESM-6, i mezzi corrispondenti per comunicare con il kernel erano chiamati extracodici, nei sistemi operativi IBM erano chiamati macro di sistema, ecc. In UNIX, tali funzionalità sono chiamate chiamate di sistema.

Il nome non cambia il significato, ovvero che per accedere alle funzioni del kernel del sistema operativo vengono utilizzati "comandi speciali" del processore, quando eseguiti si verifica un tipo speciale di interruzione interna del processore, commutandolo in modalità kernel (nella maggior parte dei casi sistemi operativi moderni questo tipo di interruzione è chiamato trap - trap). Durante l'elaborazione di tali interruzioni (decrittografia), il kernel del sistema operativo riconosce che l'interruzione è in realtà una richiesta al kernel da parte del programma utente di eseguire determinate azioni, seleziona i parametri di accesso e la elabora, quindi esegue un "ritorno dall'interruzione", riprendendo normale esecuzione del programma utente.

È chiaro che i meccanismi specifici per generare gli interrupt interni avviati dal programma utente differiscono nelle diverse architetture hardware. Poiché il sistema operativo UNIX mira a fornire un ambiente in cui i programmi utente possano essere completamente mobili, era necessario un livello aggiuntivo per nascondere il meccanismo specifico per la generazione di interrupt interni. Questo meccanismo è fornito dalla cosiddetta libreria delle chiamate di sistema.

Per l'utente, la libreria delle chiamate di sistema è una normale libreria di funzioni preimplementate del sistema di programmazione C. Quando si programma in C, l'utilizzo di qualsiasi funzione della libreria delle chiamate di sistema non è diverso dall'utilizzo di qualsiasi funzione nativa o della libreria C. Tuttavia, all'interno di qualsiasi funzione di una particolare libreria di chiamate di sistema è presente un codice che, in generale, è specifico per una determinata piattaforma hardware.

4.4 Principi di gestione delle interruzioni

Naturalmente, il meccanismo utilizzato nei sistemi operativi per la gestione degli interrupt interni ed esterni dipende principalmente dal tipo di supporto per la gestione degli interrupt hardware fornito da una particolare piattaforma hardware. Per fortuna ormai (e ormai da tempo) i principali produttori di computer sono di fatto giunti ad un accordo sui meccanismi di interruzione di base.

Se non parliamo in modo molto preciso e specifico, l'essenza del meccanismo attualmente accettato è che ogni possibile interruzione del processore (sia essa interna o esterna) corrisponde a un determinato indirizzo fisso della RAM fisica. Nel momento in cui al processore è consentito interrompere a causa della presenza di una richiesta di interruzione interna o esterna, il trasferimento del controllo hardware avviene su una cella RAM fisica con l'indirizzo corrispondente - solitamente l'indirizzo di questa cella è chiamato "vettore di interruzione" (di solito le richieste di interruzione interne, cioè le richieste provenienti direttamente dal processore vengono soddisfatte immediatamente).

Il compito del sistema operativo è quello di posizionare nelle celle RAM appropriate il codice del programma che fornisce l'elaborazione iniziale dell'interruzione e avvia l'elaborazione completa.

Fondamentalmente, il sistema operativo UNIX segue un approccio generale. Nel vettore di interruzione corrispondente all'interruzione esterna, cioè interrupt da qualche dispositivo esterno, contiene istruzioni che impostano il livello di esecuzione del processore (il livello di esecuzione determina a quali interrupt esterni il processore deve rispondere immediatamente) e passa al programma completo di gestione degli interrupt nel driver del dispositivo corrispondente. Per un interrupt interno (ad esempio un interrupt avviato da un programma utente quando la pagina di memoria virtuale richiesta non si trova nella memoria principale, quando si verifica un'eccezione nel programma utente, ecc.) o un interrupt timer, il vettore di interrupt contiene un passare al programma del kernel UNIX corrispondente.

5. Controllo I/O

Tradizionalmente, il sistema operativo UNIX ha tre tipi di organizzazione di input/output e, di conseguenza, tre tipi di driver. L'I/O a blocchi è destinato principalmente a lavorare con directory e file di file system regolari, che a livello base hanno una struttura a blocchi. A livello utente, ora è possibile lavorare con i file mappandoli direttamente su segmenti di memoria virtuale. Questa funzionalità è considerata il livello più alto di I/O a blocchi. Al livello inferiore, l'I/O del blocco è supportato dai driver del blocco. L'I/O a blocchi è supportato anche dal buffering del sistema.

L'I/O dei caratteri viene utilizzato per eseguire scambi diretti (senza buffering) tra lo spazio degli indirizzi dell'utente e il dispositivo corrispondente. Comune a tutti i driver dei caratteri, il supporto del kernel consiste nel fornire funzioni per il trasferimento dei dati tra gli spazi degli indirizzi dell'utente e del kernel.

Infine, l'I/O del flusso è simile all'I/O dei caratteri, ma poiché può includere moduli di elaborazione intermedi nel flusso, è molto più flessibile.

5.1 Principi del buffering degli I/O del sistema

Un modo tradizionale per ridurre il sovraccarico quando si eseguono scambi con dispositivi di memoria esterni che hanno una struttura a blocchi è bufferizzare l'I/O a blocchi. Ciò significa che qualsiasi blocco di un dispositivo di memoria esterno viene letto prima di tutto in un buffer nell'area della memoria principale, chiamata cache di sistema nel sistema operativo UNIX, e da lì viene copiato completamente o parzialmente (a seconda del tipo di scambio) lo spazio utente corrispondente.

I principi del meccanismo di buffering tradizionale sono, in primo luogo, che una copia del contenuto del blocco viene mantenuta nel buffer di sistema finché non diventa necessario sostituirla per mancanza di buffer (per organizzare il buffer viene utilizzato un tipo di algoritmo LRU politica di sostituzione). In secondo luogo, quando si scrive un blocco qualsiasi di un dispositivo di memoria esterno, viene effettivamente eseguito solo l'aggiornamento (o la creazione e il riempimento) del buffer della cache. La comunicazione effettiva con il dispositivo avviene quando il buffer viene estratto a causa della sostituzione del suo contenuto o quando viene eseguita una speciale chiamata di sistema di sincronizzazione (o fsync) specificatamente per forzare il push dei buffer di cache aggiornati nella memoria esterna.

Questo schema di buffering tradizionale è in conflitto con gli strumenti di gestione della memoria virtuale sviluppati nelle versioni moderne del sistema operativo UNIX e in particolare con il meccanismo per mappare i file sui segmenti di memoria virtuale. Pertanto, System V Release 4 ha introdotto un nuovo schema di buffering, attualmente utilizzato in parallelo al vecchio schema.

L'essenza del nuovo schema è che il meccanismo per mappare i file in segmenti di memoria virtuale è effettivamente riprodotto a livello del kernel. Innanzitutto, ricorda che il kernel UNIX viene effettivamente eseguito nella propria memoria virtuale. Questa memoria ha una struttura più complessa, ma fondamentalmente la stessa della memoria virtuale dell'utente. In altre parole, la memoria virtuale del kernel è segmentata e, insieme alla memoria virtuale dei processi utente, è supportata da un sottosistema comune di gestione della memoria virtuale. Ne consegue, in secondo luogo, che praticamente qualsiasi funzione fornita dal kernel agli utenti può essere fornita da alcuni componenti del kernel ad altri componenti del kernel. In particolare, ciò vale per la possibilità di mappare i file su segmenti di memoria virtuale.

Il nuovo schema di buffering nel kernel UNIX si basa principalmente sul fatto che non si può fare quasi nulla di speciale per organizzare il buffering. Quando uno dei processi utente apre un file precedentemente non aperto, il kernel crea un nuovo segmento e collega il file da aprire a questo segmento. Successivamente (indipendentemente dal fatto che il processo utente lavori con il file in modalità tradizionale utilizzando le chiamate di sistema di lettura e scrittura o colleghi il file a un segmento della sua memoria virtuale) a livello del kernel, il lavoro verrà svolto con il segmento del kernel per cui il file è connesso a livello kernel. L'idea principale del nuovo approccio è quella di colmare il divario tra la gestione della memoria virtuale e il buffering a livello di sistema (questo avrebbe dovuto essere fatto molto tempo fa, poiché è ovvio che il buffering principale nel sistema operativo dovrebbe essere eseguito dal componente di gestione della memoria virtuale).

Perché non possiamo abbandonare il vecchio meccanismo di buffering? Il fatto è che il nuovo schema presuppone la presenza di un indirizzamento continuo all'interno dell'oggetto di memoria esterna (deve esserci un isomorfismo tra gli oggetti visualizzati e quelli visualizzati). Tuttavia, quando si organizzano i file system, nel sistema operativo UNIX è piuttosto difficile allocare la memoria esterna, il che vale soprattutto per gli i-node. Pertanto, alcuni blocchi di memoria esterna devono essere considerati isolati, e per loro risulta più vantaggioso utilizzare il vecchio schema di buffering (anche se, forse, nelle versioni future di UNIX sarà possibile passare completamente a uno unificato nuovo schema).

5.2 Chiamate di sistema per il controllo degli I/O

Per accedere (ovvero, per poter eseguire successive operazioni di I/O) a un file di qualsiasi tipo (compresi i file speciali), un processo utente deve prima connettersi al file utilizzando uno dei sistemi open, creat, dup o pipe chiamate.

La sequenza di azioni della chiamata di sistema open (percorso, modalità) è la seguente:

viene analizzata la coerenza dei parametri di input (principalmente legati ai flag della modalità di accesso ai file);

lo spazio è allocato o localizzato per un descrittore di file nell'area dati di sistema del processo (area u);

nell'area a livello di sistema, lo spazio esistente viene allocato o posizionato per ospitare il descrittore del file di sistema (struttura del file);

nell'archivio del file system viene cercato un oggetto denominato "pathname" e viene generato o trovato un descrittore di file a livello di file system (vnode nei termini UNIX V System 4);

il vnode è collegato alla struttura del file precedentemente formata.

Le chiamate di sistema open e creat sono (quasi) funzionalmente equivalenti. Qualsiasi file esistente può essere aperto utilizzando la chiamata di sistema creat e qualsiasi nuovo file può essere creato utilizzando la chiamata di sistema open. Tuttavia, per quanto riguarda la chiamata di sistema creat, è importante sottolineare che nella sua applicazione naturale (creare un file), questa chiamata di sistema crea una nuova voce nella directory corrispondente (in base al valore del percorso specificato), e crea anche e inizializza di conseguenza un nuovo i-node.

Infine, la chiamata di sistema dup (duplicato) comporta già la creazione di un nuovo descrittore apri il file. Questa chiamata di sistema specifica per UNIX è esclusivamente per scopi di reindirizzamento I/O.) La sua esecuzione consiste nel creare un nuovo descrittore di file aperto nell'area u dello spazio di sistema del processo utente, contenente il descrittore di file appena formato (intero), ma facendo riferimento al file di struttura a livello di sistema già esistente e contenente gli stessi segni e flag che corrispondono al file di esempio aperto.

Altre chiamate di sistema importanti sono le chiamate di sistema di lettura e scrittura. La chiamata di sistema di lettura viene eseguita come segue:

nella tabella dei file a livello di sistema si trova un descrittore del file specificato e viene determinato se l'accesso da un determinato processo a un determinato file nella modalità specificata è legale;

viene stabilito un blocco di sincronizzazione sul vnode di questo file per un (breve) tempo (il contenuto del descrittore non dovrebbe cambiare nei momenti critici dell'operazione di lettura);

la lettura effettiva viene eseguita utilizzando il vecchio o il nuovo meccanismo di buffering, quindi i dati vengono copiati per diventare disponibili nello spazio degli indirizzi dell'utente.

L'operazione di scrittura è simile, ma modifica il contenuto del buffer del pool di buffer.

La chiamata di sistema di chiusura fa sì che il driver chiuda la comunicazione con il processo utente corrispondente e (nel caso dell'ultima volta che il dispositivo è stato chiuso) imposta il flag "driver libero" a livello di sistema.

Infine, per i file speciali è supportata un'altra chiamata di sistema "speciale", ioctl. Questa è l'unica chiamata di sistema fornita per file speciali e non viene fornita per altri tipi di file. Infatti, la chiamata di sistema ioctl consente di estendere arbitrariamente l'interfaccia di qualsiasi driver. I parametri ioctl includono un codice operativo e un puntatore ad alcune aree di memoria del processo utente. Tutta l'interpretazione del codice operativo e dei parametri specifici corrispondenti viene eseguita dal conducente.

Naturalmente, poiché i driver sono progettati principalmente per controllare dispositivi esterni, il codice del driver deve contenere mezzi appropriati per gestire le interruzioni provenienti dal dispositivo. Il singolo programma di gestione delle interruzioni nel driver viene richiamato dal kernel del sistema operativo. Allo stesso modo, il driver può dichiarare un input di “timeout”, al quale il kernel accede quando è scaduto il tempo precedentemente ordinato dal driver (tale controllo di temporizzazione è necessario quando si controllano dispositivi non molto intelligenti).

Lo schema generale dell'organizzazione dell'interfaccia del driver è mostrato in Figura 3.5. Come mostra questa figura, dal punto di vista delle interfacce e del controllo a livello di sistema, esistono due tipi di driver: carattere e blocco. Dal punto di vista dell'organizzazione interna, spicca un altro tipo di driver: i driver in streaming. Tuttavia, in termini di interfaccia esterna, i driver di flusso non differiscono dai driver di carattere.

6. Interfacce e punti di ingresso del conducente

6.1 Blocca i driver

I driver a blocchi sono progettati per servire dispositivi esterni con una struttura a blocchi (dischi magnetici, nastri, ecc.) e differiscono dagli altri in quanto sono progettati ed eseguiti utilizzando il buffering del sistema. In altre parole, tali driver funzionano sempre attraverso il pool di buffer del sistema. Come puoi vedere nella Figura 3.5, qualsiasi accesso a un driver di blocco per la lettura o la scrittura passa sempre attraverso la preelaborazione, che consiste nel cercare di trovare una copia del blocco desiderato nel pool di buffer.

Se una copia del blocco richiesto non è nel buffer pool, o se per qualche motivo il contenuto di qualche buffer aggiornato deve essere sostituito, il kernel UNIX chiama la procedura strategica del driver del blocco corrispondente. La strategia fornisce un'interfaccia standard tra il kernel e il driver. Utilizzando routine di libreria progettate per la scrittura dei driver, la procedura strategica può organizzare code di scambi con il dispositivo, ad esempio, per ottimizzare il movimento delle testine magnetiche su un disco. Tutti gli scambi eseguiti dal driver del blocco vengono eseguiti con la memoria buffer. La copia delle informazioni necessarie nella memoria del corrispondente processo utente viene effettuata dai programmi del kernel che gestiscono la gestione del buffer

6.2 Driver dei caratteri

I driver dei caratteri sono destinati principalmente alla manutenzione dei dispositivi con i quali gli scambi vengono eseguiti carattere per carattere o tramite stringhe di caratteri di dimensioni variabili. Un tipico esempio di dispositivo a caratteri è una semplice stampante che accetta un carattere per scambio.

I driver dei caratteri non utilizzano il buffering di sistema. Copiano direttamente i dati dalla memoria del processo utente quando eseguono operazioni di scrittura o nella memoria del processo utente quando eseguono operazioni di lettura, utilizzando i propri buffer.

È da notare che è possibile fornire un'interfaccia a caratteri ad un dispositivo a blocchi. In questo caso, il driver del blocco utilizza funzionalità aggiuntive della procedura strategica, che consentono lo scambio senza l'uso del buffer di sistema. Per un driver che dispone sia di interfacce a blocchi che a caratteri, vengono creati due file speciali nel file system, a blocchi e a caratteri. Ogni volta che si accede al driver, questo riceve informazioni su quale modalità è in uso.

6.3 Driver di streaming

Lo scopo principale del meccanismo degli stream è aumentare il livello di modularità e flessibilità dei driver con logica interna complessa (soprattutto ciò vale per i driver che implementano protocolli di rete avanzati). La specificità di tali driver è che la maggior parte del codice del programma non dipende dalle caratteristiche del dispositivo hardware. Inoltre spesso è vantaggioso combinare parti del codice di programma in modi diversi.

Tutto ciò ha portato all'emergere di un'architettura di driver di streaming, che rappresenta una pipeline bidirezionale di moduli di elaborazione. All'inizio della pipeline (più vicino al processo utente) c'è l'intestazione del thread, a cui si accede principalmente tramite chiamate avviate dall'utente. Alla fine della pipeline (più vicino al dispositivo) c'è il normale driver del dispositivo. Nel mezzo è possibile posizionare un numero arbitrario di moduli di elaborazione, ciascuno dei quali è progettato in conformità con l'interfaccia di streaming richiesta.

7. Comandi e utilità

Quando lavorano in modo interattivo nell'ambiente del sistema operativo UNIX, utilizzano una varietà di utilità o comandi del linguaggio shell esterno. Molte di queste utilità sono programmi non meno complessi della shell stessa (e, a proposito, la shell stessa è una delle utilità che possono essere richiamate dalla riga di comando).

7.1 Organizzazione del team nel sistema operativo UNIX

Per creare un nuovo comando è sufficiente seguire le regole della programmazione C. Ogni programma C ben formato inizia la sua esecuzione con la funzione main. Questa funzione "semi-sistema" ha un'interfaccia standard che fornisce la base per organizzare i comandi che possono essere richiamati nella shell. I comandi esterni vengono eseguiti dall'interprete della shell utilizzando una serie di chiamate di sistema fork e una delle opzioni exec. I parametri della chiamata di sistema exec includono un insieme di stringhe di testo. Questo insieme di stringhe di testo viene passato come input alla funzione principale del programma in esecuzione.

Più precisamente, la funzione main riceve due parametri: argc (il numero di stringhe di testo da passare) e argv (un puntatore a un array di puntatori a stringhe di testo). Un programma che dichiara di usarlo come comando di shell deve avere un'interfaccia esterna ben definita (i parametri vengono solitamente immessi dal terminale) e deve controllare e analizzare correttamente i parametri di input.

Inoltre, per conformarsi allo stile della shell, un programma di questo tipo non deve sovrascrivere i file corrispondenti allo standard input, allo standard output e allo standard error. Il comando può quindi essere reindirizzato all'I/O nel modo consueto ed essere incluso nelle pipeline.

7.2 Reindirizzamento I/O e pipeline

Come si può vedere dall'ultima frase del paragrafo precedente, non è necessario fare nulla di speciale per fornire funzionalità di reindirizzamento I/O e pipeline durante la programmazione dei comandi. È sufficiente lasciare semplicemente da parte i tre descrittori di file iniziali e lavorare correttamente con questi file, vale a dire, eseguire l'output in un file con un descrittore stdout, inserire i dati dal file stdin e inviare messaggi di errore al file stderror.

7.3 Comandi integrati, libreria e utente

I comandi incorporati fanno parte del codice della shell. Funzionano come routine di interprete e non possono essere sostituite o sovrascritte. La sintassi e la semantica dei comandi integrati sono definite nel linguaggio dei comandi corrispondente.

I comandi della libreria fanno parte del software di sistema. Si tratta di un insieme di programmi eseguibili (utilità) forniti con il sistema operativo. La maggior parte di questi programmi (come vi, emacs, grep, find, make, ecc.) sono estremamente utili nella pratica, ma vanno oltre lo scopo di questo corso (ci sono sezioni separate sugli editor vi ed emacs e sull'integrità dei file di programma l'utilità crea libri spessi).

Un comando utente è qualsiasi programma eseguibile organizzato in conformità con i requisiti stabiliti in Pertanto, qualsiasi utente del sistema operativo UNIX può espandere illimitatamente il repertorio di comandi esterni del suo linguaggio di comando (ad esempio, puoi scrivere il tuo interprete di comandi).

7.4 Programmazione in linguaggio di comando

In linea di principio, qualsiasi variante del linguaggio Shell menzionata può essere utilizzata come linguaggio di programmazione. Tra gli utenti del sistema operativo UNIX, ci sono molte persone che scrivono programmi piuttosto seri nella shell. Per la programmazione è meglio utilizzare linguaggi di programmazione (C, C++, Pascal, ecc.), piuttosto che linguaggi di comando.


8. Strumenti dell'interfaccia utente grafica

Sebbene molti programmatori professionisti che lavorano nell'ambiente del sistema operativo UNIX oggi preferiscano utilizzare mezzi tradizionali basati su linee per interagire con il sistema, l'uso diffuso di terminali grafici a colori relativamente economici con qualità ad alta risoluzione ha portato al fatto che tutte le versioni moderne di UNIX Il sistema operativo supporta le interfacce utente grafiche con il sistema e agli utenti vengono forniti strumenti per sviluppare interfacce grafiche con i programmi che sviluppano. Dal punto di vista dell'utente finale, gli strumenti dell'interfaccia grafica supportati in diverse versioni del sistema operativo UNIX e in altri sistemi (ad esempio, MS Windows o Windows NT) sono più o meno gli stessi nello stile.

Innanzitutto, in tutti i casi, è supportata la modalità multi-finestra di lavoro con lo schermo del terminale. In qualsiasi momento l'utente può creare una nuova finestra e associarla al programma desiderato, che funziona con questa finestra come con un terminale separato. Le finestre possono essere spostate, ridimensionate, chiuse temporaneamente, ecc.

In secondo luogo, tutte le versioni moderne dell'interfaccia grafica supportano il controllo del mouse. Nel caso del sistema operativo UNIX, si riscontra spesso che la normale tastiera del terminale viene utilizzata solo quando si passa alla tradizionale interfaccia basata su righe (sebbene nella maggior parte dei casi uno degli interpreti di comandi della famiglia shell sia in esecuzione in almeno una finestra di terminale) .

In terzo luogo, tale diffusione dello stile di lavoro “mouse” è resa possibile attraverso l'uso di strumenti di interfaccia basati su icone e menu. Nella maggior parte dei casi, un programma in esecuzione in una finestra richiede all'utente di selezionare una funzione da eseguire, visualizzando una serie di immagini simboliche di possibili funzioni (icone) nella finestra o offrendo un menu a più livelli. In ogni caso per un'ulteriore selezione è sufficiente controllare con il mouse il cursore della finestra corrispondente.

Infine, le moderne interfacce grafiche sono “user-friendly”, fornendo un aiuto immediato e interattivo per qualsiasi cosa. (Probabilmente sarebbe più accurato affermare che un buon stile di programmazione della GUI è quello che fornisce effettivamente tali suggerimenti.)

Dopo aver elencato tutte queste proprietà comuni mezzi moderni interfaccia grafica, potrebbe sorgere una domanda naturale: se esiste una tale uniformità nel campo delle interfacce grafiche, cosa si può dire di speciale delle interfacce grafiche nell'ambiente del sistema operativo UNIX? La risposta è abbastanza semplice. Sì, è vero che l'utente finale in qualsiasi sistema oggi si trova di fronte all'incirca allo stesso insieme di capacità di interfaccia, ma in sistemi diversi queste capacità vengono ottenute in modi diversi. Come al solito, il vantaggio del sistema operativo UNIX è la presenza di tecnologie standardizzate che consentono di creare applicazioni mobili con interfacce grafiche.

8. Principi di tutela

Poiché il sistema operativo UNIX è stato concepito fin dall'inizio come un sistema operativo multiutente, il problema di autorizzare l'accesso di diversi utenti ai file nel file system è sempre stato rilevante. L'autorizzazione all'accesso si riferisce alle azioni di sistema che consentono o negano l'accesso a un determinato file da parte di un determinato utente, a seconda dei diritti di accesso dell'utente e delle restrizioni di accesso impostate per il file. Lo schema di autorizzazione all'accesso utilizzato nel sistema operativo UNIX è così semplice e conveniente e allo stesso tempo così potente che è diventato lo standard de facto dei moderni sistemi operativi (che non pretendono di essere sistemi con protezione multilivello).

8.1 ID utente e gruppo utenti

Ogni processo in esecuzione in UNIX è associato a un ID utente reale, a un ID utente effettivo e a un ID utente salvato. Tutti questi identificatori vengono impostati utilizzando la chiamata di sistema setuid, che può essere eseguita solo in modalità superutente. Allo stesso modo, tre ID di gruppo utente sono associati a ciascun processo: ID di gruppo reale, ID di gruppo effettivo e ID di gruppo salvato. Questi identificatori vengono impostati dalla chiamata di sistema privilegiata setgid.

Quando un utente accede al sistema, il programma di login verifica che l'utente sia registrato nel sistema e conosca la password corretta (se impostata), crea un nuovo processo e avvia al suo interno la shell richiesta per questo utente. Ma prima, login imposta gli ID utente e gruppo per il processo appena creato, utilizzando le informazioni memorizzate nei file /etc/passwd e /etc/group. Una volta associati gli ID utente e gruppo a un processo, a tale processo si applicano le restrizioni di accesso ai file. Un processo può accedere o eseguire un file (se il file contiene un programma eseguibile) solo se le restrizioni di accesso del file lo consentono. Gli identificatori associati a un processo vengono trasmessi ai processi da esso creati, soggetti alle stesse restrizioni. Tuttavia, in alcuni casi, un processo può modificare i propri permessi utilizzando le chiamate di sistema setuid e setgid, e talvolta il sistema può modificare automaticamente i permessi di un processo.

Consideriamo, ad esempio, la seguente situazione. Il file /etc/passwd non può essere scritto da nessuno tranne che dal superutente (il superutente può scrivere su qualsiasi file). Questo file, tra le altre cose, contiene le password degli utenti e ogni utente può modificare la propria password. Esiste un programma speciale /bin/passwd che modifica le password. Tuttavia, l'utente non può farlo nemmeno con questo programma perché è proibito scrivere sul file /etc/passwd. Su UNIX, questo problema viene risolto come segue. Il file eseguibile può specificare che gli ID utente e/o gruppo devono essere impostati quando viene eseguito. Se un utente richiede l'esecuzione di un programma di questo tipo (utilizzando la chiamata di sistema exec), l'ID del processo corrispondente viene impostato sull'ID utente del proprietario del file eseguibile e/o sull'ID del gruppo di quel proprietario. In particolare, quando si esegue il programma /bin/passwd, al processo verrà assegnato l'ID superutente e il programma sarà in grado di scrivere nel file /etc/passwd.

Sia per l'ID utente che per l'ID gruppo, l'ID reale è il vero ID e l'ID effettivo è l'ID dell'esecuzione corrente. Se l'ID utente corrente è il superutente, quell'ID e l'ID gruppo possono essere reimpostati su qualsiasi valore dalle chiamate di sistema setuid e setgid. Se l'ID utente corrente è diverso dall'ID superutente, l'esecuzione delle chiamate di sistema setuid e setgid comporta la sostituzione dell'ID corrente con l'ID vero (rispettivamente utente o gruppo).

8.2 Protezione dei file

Come di consueto in un sistema operativo multiutente, UNIX supporta un meccanismo di controllo dell'accesso uniforme per file e directory del file system. Qualsiasi processo può accedere a un file se e solo se i diritti di accesso specificati per il file corrispondono alle capacità del processo.

La protezione dei file dall'accesso non autorizzato in UNIX si basa su tre fatti. In primo luogo, qualsiasi processo che crea un file (o una directory) è associato a un identificatore utente univoco nel sistema (UID - User Identifier), che può successivamente essere interpretato come l'identificatore del proprietario del file appena creato. In secondo luogo, ogni processo che tenta di ottenere l'accesso a un file ha una coppia di identificatori ad esso associati: l'utente corrente e gli identificatori di gruppo. In terzo luogo, ogni file è associato in modo univoco al suo descrittore: i-node.

Qualsiasi i-node utilizzato in un file system corrisponde sempre in modo univoco a uno e un solo file. L'I-node contiene molte informazioni diverse (la maggior parte è disponibile agli utenti tramite le chiamate di sistema stat e fstat), e tra queste informazioni c'è una parte che consente al file system di valutare il diritto di un dato processo ad accedere a un dato file nella modalità richiesta.

I principi generali di protezione sono gli stessi per tutte le versioni esistenti del sistema: le informazioni di i-node includono l'UID e il GID dell'attuale proprietario del file (immediatamente dopo la creazione del file, gli identificatori del suo attuale proprietario vengono impostati su il corrispondente identificatore valido del processo creatore, ma può essere successivamente modificato dalle chiamate di sistema chown e chgrp). Inoltre, l'i-node del file memorizza una scala che indica cosa l'utente - il suo proprietario - può fare con il file, cosa possono fare con il file gli utenti appartenenti allo stesso gruppo di utenti del proprietario e cosa possono fare gli altri con il file .users. I dettagli di implementazione minori variano tra le diverse varianti di sistema.

8.3 Futuri sistemi operativi che supportano l'ambiente del sistema operativo UNIX

Il microkernel è la parte centrale minima del sistema operativo e funge da base per estensioni modulari e portatili. A quanto pare, la maggior parte dei sistemi operativi di prossima generazione avrà microkernel. Tuttavia, ci sono molte opinioni diverse su come dovrebbero essere organizzati i servizi del sistema operativo in relazione al microkernel: come progettare i driver dei dispositivi per ottenere la massima efficienza, ma mantenere le funzioni dei driver quanto più indipendenti possibile dall'hardware; se le operazioni non kernel debbano essere eseguite nello spazio kernel o nello spazio utente; Vale la pena mantenere i programmi dei sottosistemi esistenti (ad esempio UNIX) o è meglio scartare tutto e ricominciare da capo.

Il concetto di microkernel è stato introdotto in un uso diffuso da Next, il cui sistema operativo utilizzava il microkernel Mach. Il piccolo kernel privilegiato di questo sistema operativo, attorno al quale si trovavano i sottosistemi eseguiti in modalità utente, teoricamente avrebbe dovuto fornire flessibilità e modularità senza precedenti del sistema. Ma in pratica, questo vantaggio è stato in qualche modo minato dalla presenza di un server monolitico che implementa il sistema operativo UNIX BSD 4.3, che Next ha scelto come wrapper per il microkernel Mach. Tuttavia, affidarsi a Mach ha permesso al sistema di includere la messaggistica e una serie di funzioni di servizio orientate agli oggetti, che hanno prodotto un'elegante interfaccia per l'utente finale con strumenti grafici per la configurazione della rete, l'amministrazione del sistema e lo sviluppo del software.

Il successivo sistema operativo microkernel fu Windows NT di Microsoft, in cui il vantaggio principale dell'utilizzo di un microkernel avrebbe dovuto essere non solo la modularità, ma anche la portabilità. (Si noti che non c'è consenso sul fatto che NT debba effettivamente essere classificato come un sistema operativo microkernel.) NT è stato progettato per funzionare su sistemi a processore singolo e multiprocessore basati su processori Intel, Mips e Alpha (e quelli che verranno dopo loro). Poiché NT avrebbe eseguito programmi scritti per sistemi compatibili con DOS, Windows, OS/2 e Posix, Microsoft ha utilizzato la modularità intrinseca dell'approccio microkernel per creare una struttura NT comune che non replicasse alcun sistema operativo esistente. Ogni sistema operativo viene emulato come modulo o sottosistema separato.

Le architetture dei sistemi operativi Microkernel furono successivamente annunciate da Novell/USL, Open Software Foundation (OSF), IBM, Apple e altri. Uno dei principali concorrenti di NT nel sistema operativo microkernel è Mach 3.0, un sistema creato alla Carnegie Mellon University che sia IBM che OSF si sono impegnate a commercializzare. (Next attualmente utilizza Mach 2.5 come base per NextStep, ma sta esaminando attentamente anche Mach 3.0.) Un altro concorrente è il microkernel Chorus 3.0 di Chorus Systems, scelto da USL come base per le nuove implementazioni del sistema operativo UNIX. Alcuni microkernel verranno utilizzati in SpringOS di Sun, un successore orientato agli oggetti del sistema operativo Solaris (supponendo che Sun segua SpringOS). Esiste un’ovvia tendenza verso una transizione dai sistemi monolitici a quelli microkernel (questo processo non è semplice: IBM ha fatto un passo indietro e ha abbandonato la transizione alla tecnologia microkernel). Questa però non è affatto una novità per le aziende QNX Software Systems e Unisys, che da diversi anni rilasciano sistemi operativi microkernel di successo. Il sistema operativo QNX è popolare nel mercato dei sistemi in tempo reale e il CTOS di Unisys è popolare nel settore bancario. Entrambi i sistemi utilizzano con successo la modularità inerente ai sistemi operativi microkernel.


Conclusione

Le principali differenze tra Unix e altri sistemi operativi

Unix è costituito da un kernel con driver e utilità inclusi (programmi esterni al kernel). Se è necessario modificare la configurazione (aggiungere un dispositivo, modificare una porta o interrompere), il kernel viene ricostruito (collegato) da moduli oggetto o (ad esempio, in FreeBSD) dai sorgenti. Questo non è del tutto vero. Alcuni parametri possono essere corretti senza ricostruire. Ci sono anche moduli del kernel caricabili.

A differenza di Unix, Windows (se non è specificato quale, allora intendiamo 3.11, 95 e NT) e OS/2 collegano effettivamente i driver al volo durante il caricamento. Allo stesso tempo, la compattezza del kernel assemblato e del il riutilizzo del codice comune è di un ordine di grandezza inferiore rispetto a Unix. Inoltre, con la configurazione del sistema invariata, il kernel Unix senza modifiche (è necessario modificare solo la parte iniziale del BIOS) può essere scritto nella ROM ed eseguito _senza_ caricamento_ nella RAM.La compattezza del codice è particolarmente importante, poiché il kernel e i driver non lasciano mai la RAM fisica, la memoria non verrà trasferita sul disco.

Unix è il sistema operativo più multipiattaforma. WindowsNT sta cercando di imitarlo, ma finora non ha avuto successo: dopo l'abbandono di MIPS e POWER-PC, W"NT è rimasto solo su due piattaforme: la tradizionale i*86 e DEC Alpha. La portabilità dei programmi da un versione di Unix a un'altra è limitata. Un programma scritto male, che non tiene conto delle differenze nelle implementazioni Unix, facendo ipotesi irragionevoli come "una variabile intera deve occupare quattro byte" può richiedere una seria rielaborazione, ma è ancora di molti ordini di grandezza più semplice rispetto, ad esempio, al porting da OS/2 a NT.

Applicazioni Unix

Unix viene utilizzato sia come server che come workstation. Nella categoria server compete con MS WindowsNT, Novell Netware, IBM OS/2 Warp Connect, DEC VMS e i sistemi operativi mainframe. Ogni sistema ha il proprio campo di applicazione in cui è migliore degli altri.

WindowsNT: per gli amministratori che preferiscono un'interfaccia comoda all'uso parsimonioso delle risorse e ad alte prestazioni.

Netware: per reti in cui sono necessari servizi di file e stampanti ad alte prestazioni e altri servizi non sono così importanti. Lo svantaggio principale è che è difficile eseguire le applicazioni su un server Netware.

OS/2 è utile quando è necessario un server delle applicazioni "leggero". Richiede meno risorse di NT, è più flessibile nella gestione (anche se può essere più difficile da configurare) e il multitasking è molto buono. L'autorizzazione e la differenziazione dei diritti di accesso non vengono implementate a livello del sistema operativo, il che è più che compensato dall'implementazione a livello dell'applicazione server. (Tuttavia, altri sistemi operativi spesso fanno lo stesso). Molte stazioni FIDOnet e BBS sono basate su OS/2.

VMS è un potente application server, in nessun modo inferiore a Unix (e in molti sensi superiore ad esso), ma solo per le piattaforme VAX e Alpha di DEC.

Mainframe: per servire un numero molto elevato di utenti (nell'ordine di diverse migliaia). Ma il lavoro di questi utenti è solitamente organizzato non sotto forma di interazione client-server, ma sotto forma di terminale host. Il terminale in questa coppia molto probabilmente non è un client, ma un server (Internet World, N3, 1996). I vantaggi dei mainframe includono una maggiore sicurezza e resistenza ai guasti, mentre gli svantaggi sono il prezzo corrispondente a queste qualità.

Unix va bene per un amministratore qualificato (o disposto a diventarlo) perché... richiede la conoscenza dei principi di funzionamento dei processi che si verificano in esso. Il vero multitasking e la rigorosa condivisione della memoria garantiscono un'elevata affidabilità del sistema, sebbene i servizi di file e stampa di Unix siano inferiori a Netware nelle prestazioni dei servizi di file e stampa.

La mancanza di flessibilità nel garantire i diritti di accesso degli utenti ai file rispetto a Windows NT rende difficile organizzare l'accesso di gruppo ai dati (più precisamente ai file) nel_file_system_, il che, a mio avviso, è compensato dalla facilità di implementazione, il che significa hardware inferiore requisiti. Tuttavia, applicazioni come SQL Server risolvono da sole il problema dell'accesso ai dati di gruppo, quindi la possibilità, che manca in Unix, di negare l'accesso a un _file_ a un utente specifico, a mio avviso, è chiaramente ridondante.

Quasi tutti i protocolli su cui si basa Internet sono stati sviluppati sotto Unix, in particolare lo stack di protocolli TCP/IP è stato inventato all'Università di Berkeley.

La sicurezza di Unix, se amministrata correttamente (e quando non lo è?) non è in alcun modo inferiore a Novell o WindowsNT.

Una proprietà importante di Unix, che lo avvicina ai mainframe, è la sua natura multiterminale; molti utenti possono eseguire simultaneamente programmi su una macchina Unix. Se non avete bisogno di utilizzare la grafica, potete cavarvela con terminali di testo economici (specializzati o basati su PC economici) collegati su linee lente. In questo compete solo con VMS. È inoltre possibile utilizzare terminali X grafici quando lo stesso schermo contiene finestre di processi in esecuzione su macchine diverse.

Nella categoria workstation, MS Windows*, IBM OS/2, Macintosh e Acorn RISC-OS competono con Unix.

Windows: per coloro che apprezzano la compatibilità piuttosto che l'efficienza; per coloro che sono pronti ad acquistare una grande quantità di memoria, spazio su disco e megahertz; per chi ama cliccare sui pulsanti della finestra senza approfondire l'essenza. È vero, prima o poi dovrai ancora studiare i principi di funzionamento del sistema e dei protocolli, ma poi sarà troppo tardi: la scelta è stata fatta. Un vantaggio importante di Windows è la capacità di rubare un sacco di software.

OS/2 - per gli amanti di OS/2. :-) Sebbene, secondo alcune informazioni, OS/2 interagisca meglio con i mainframe e le reti IBM rispetto ad altri.

Macintosh - per lavori grafici, editoriali e musicali, nonché per coloro che amano un'interfaccia chiara e bella e non vogliono (non possono) comprendere i dettagli del funzionamento del sistema.

RISC-OS, flashato nella ROM, consente di evitare perdite di tempo nell'installazione del sistema operativo e nel ripristino dopo guasti. Inoltre, quasi tutti i programmi sotto di esso utilizzano le risorse in modo molto economico, grazie al quale non richiedono scambi e funzionano molto rapidamente.

Unix funziona sia su PC che su potenti workstation con processori RISC; per Unix sono scritti sistemi CAD e di informazione geografica veramente potenti. Secondo alcuni autori, la scalabilità di Unix, grazie alla sua natura multipiattaforma, è un ordine di grandezza superiore a qualsiasi altro sistema operativo.


Bibliografia

1. Libro di testo di Kuznetsov S.D. "sistema operativo UNIX" 2003;

2. Polyakov d.C. “UNIX 5a edizione su x86, o non dimenticare la storia”;

3. Karpov D.Yu. "UNIX" 2005;

4. Fedorchuk A.V. "La padronanza di Unix", 2006

5. Materiali dal sito http://www.citforum.ru/operating_systems/1-16;

MINISTERO DELL'ISTRUZIONE E DELLA SCIENZA DELLA FEDERAZIONE RUSSA AGENZIA FEDERALE PER L'ISTRUZIONE ISTITUTO EDUCATIVO STATALE DI ISTRUZIONE PROFESSIONALE SUPERIORE UNIVERSITÀ RADIOTECNICA STATALE DI TAGANROG Disciplina

 

 

Questo è interessante: