# Customer Information Control System

Le système appelé CICS (Customer Information Control System, c'est-à-dire «Système de contrôle des informations client») est un système qui permet d'effectuer des opérations transactionnelles (en général consultation ou mise à jour de bases de données ou de fichiers) avec une très grande économie de moyens. CICS est généralement utilisée sur les systèmes mainframe d'IBM, notamment les zSeries 900 ou S/390, mais peut aussi l'être sur des systèmes plus petits comme les AS/400, RS/6000, ou même des serveurs PC.
À titre indicatif, un IBM 3033 équipé de 16 Mo de mémoire – qui correspondait à peu près en puissance de calcul à un Pentium 100 – pouvait gérer de front 17 500 terminaux CICS.
Sur un processeur actuel (2009) de la série Z, CICS peut servir sans difficulté des milliers de transactions par seconde, ce qui le rend en particulier tout à fait apte aux transactions de terminaux bancaires automatiques.
CICS est couramment et principalement utilisé par les institutions financières, les applications bancaires, les distributeurs de billets, mais aussi dans les systèmes de production industriels. Plus de 90 % des compagnies du Fortune 500 reposent sur CICS pour la gestion de leurs transactions.
La majorité des applications CICS sont écrites en COBOL, mais il est également possible d'utiliser le langage assembleur, le langage C ou C++, PL/I, REXX et, plus récemment, Java.
La dernière version de CICS pour z/OS est la 5.6 (2020).

## Principe de fonctionnement

Les ordinateurs centraux classiques sont conçus à la base pour le traitement d'applications par lot, et donc pour le traitement simultané d'un nombre peu élevé de tâches, lesquelles ont généralement un accès exclusifs aux fichiers et ressources qu'elles utilisent. Pour la gestion de transactions, on attendrait plutôt qu'un système soit conçu pour gérer de nombreuses tâches simultanées, utilisant les mêmes ressources. CICS a été proposé dès 1968 dans le but de fournir une solution à ce problème.
D'une part, CICS agit comme une interface entre les programmes, et les services du système d'exploitation. Ainsi, lorsqu'un programme désire, par exemple, afficher quelque chose sur un terminal, accéder à un fichier, etc. il ne pourra pas le faire directement et devra passer par CICS.
De l'autre, CICS permet de simuler la gestion multi-utilisateur et multi-tâche avec une grande économie de moyens résultant des principes suivants :
* Concept totalement démarqué du temps partagé : on n'interrompt pas une tâche, on la déroule toujours jusqu'au bout, et c'est à elle de rendre le contrôle. Il n'y a donc jamais de contexte complexe de programme à sauvegarder, ni d'appel coûteux au superviseur ;
* Les tâches doivent être courtes tant en taille qu'en temps de traitement. La notion de « courte » est passé au fil du temps de 4 K en 1974 à 64 K et plus en 1985.
* Une seule tâche est utilisée à la fois ;
* Une tâche peut enchaîner automatiquement une autre tâche sur action d'un événement ;
* Les tâches, ne pouvant pas être interrompues (on peut tout au plus les tuer si elles posent problème en cours de mise au point) n'ont pas besoin d'être réentrantes, mais juste sériellement réutilisables. Il leur suffit de laisser le système dans l'état où elles souhaitent le trouver en arrivant ;
* Une tâche reste en mémoire après utilisation, prête à servir sans appel disque si elle est à nouveau sollicitée ;
* Les tâches utilisent la conception des terminaux 3270 qui ne sollicitent pas le système à chaque caractère frappé, mais uniquement lors de la transmission d'un écran entier en mode plein écran). Ainsi 1000 terminaux actifs lançant une transaction complète toutes les 20 secondes n'engendrent que 50 modestes transactions par seconde.

### Gestion des transactions

Sous CICS il n'est pas possible d'appeler directement un programme : l'utilisateur doit invoquer une transaction, laquelle spécifiera le programme à lancer. CICS se chargera de localiser l'application, la charger en mémoire si ce n'est pas déjà fait, et de démarrer une tâche.
Chaque transaction est identifiée par un code de quatre lettres appelée trans-id. CICS possède une table nommée PCT (Program Control Table – Table de Contrôle des Programmes) qui liste les trans-id valides et les associe au nom des programmes CICS qui devront être chargés lorsque la transaction est invoquée. De manière à savoir s'il faut charger en mémoire une nouvelle copie d'un programme, CICS utilise une autre table, le PPT (Processing Program Table, ou Table des Programmes Exécutés), qui contient une liste de tous les noms de programmes en mémoire.
Ainsi si un utilisateur invoque une transaction, CICS ira d'abord regarder dans le PCT pour trouver le programme à exécuter, puis vérifier dans la PPT si le programme est déjà chargé en mémoire. Dans le cas où il ne l'est pas encore, CICS localisera le programme, le chargera et mettra la PPT à jour, puis lancera une nouvelle tâche.
CICS utilise également une table des terminaux, le TCT (Terminal Control Table), qui permet d'identifier chaque terminal par le biais d'un identifiant de terminal, appelé term-id. Cette table permet de s'assurer que les traitements et résultats soient bien attribués au bon terminal.
Quant aux accès aux fichiers, ils sont gérés par CICS par le biais d'une table des fichiers, la FCT (File Control Table) qui recense les fichiers et le type d'opérations autorisés.

### Services

CICS fournit de nombreux services, lesquels sont accessibles par une API, laquelle permet de s'assurer que lesdits services sont invoqués de manière consistante.

#### Services de communication de données

Les services de communication de données, permettent notamment aux programmes de communiquer avec les terminaux. Ces services permettent par exemple d'envoyer des informations aux terminaux, ou de récupérer des informations écrites dans un formulaire, etc.
CICS a accès aux méthodes de télécommunication du système d'exploitation via une interface appelée terminal control. Cependant, utiliser directement le terminal control dans un programme peut s'avérer laborieux car cela impliquerait de traiter un ensemble assez compliqué de chaînes de caractères et de données. Pour simplifier le décodage de ces chaînes de caractères, une interface appelée BMS (Basic Mapping Support – Support Basique pour Formulaires) a été développée. BMS permet de créer facilement des formulaires, appelées map, et de gérer l'envoi ou la réception de données depuis ces formulaires.

#### Services de gestion de données

Les services de gestion de données permettent l'accès aux bases de données, fichiers, etc. Ils regroupent les outils de contrôle des fichiers comme les VSAM, ou d'accès aux interfaces SQL, ou DL/I. Ainsi lorsqu'un programme a besoin d'accéder à un fichier, les services de gestion de données CICS feront le relais avec VSAM pour gérer l'accès au fichier. Le système de gestion de données de CICS permet de gérer le partage des fichiers et donc d'éviter la corruption de données que pourrait par exemple causer la mise à jour simultanée d'un même enregistrement par deux utilisateurs.

#### Domaines de gestion CICS

Les systèmes de gestion CICS regroupent un éventail de services organisés en domaines pour gérer l'exécution des programmes. Par exemple le domaine program control permet de gérer le flot de contrôle d'un programme à un autre. Le domaine dump control permet la génération de dumps, etc.

## Avantages et inconvénients
### Avantages propres à CICS

* Une tâche peut être activée ou désactivée à la demande, voire remplacée au vol par une autre, sans arrêt du reste du système.
* CICS met à l'abri de tout risque de piratage : un terminal ne dispose jamais d'un shell, puisqu'il s'agit d'un terminal rattaché à l'application CICS et non au système qui se trouve au-dessus. Ce terminal ne peut s'échapper du contrôle de CICS (ce qui est parfois souhaitable) que si l'on crée en CICS une tâche de déconnexion, qui ne peut elle-même être codée depuis un terminal CICS.
* Gestion des possibilités « full-screen » des écrans de mainframes, y compris lors des changements de génération de ceux-ci (3277 vers 3278, 3278 vers 3278 PS, 3270 et 3270 PS, 3290, 3170 avec souris...), ces nouvelles techniques se traduisant simplement par des possibilités d'appels supplémentaires sans nécessité de modifier l'existant.

### Inconvénient de CICS

La table des transactions était gardée en forme séquentielle et non hash-codée. Le parcours séquentiel de la table à chaque nouvel appel produisait de grosses inefficiences si un système avait plusieurs milliers de noms de tâches. Les statistiques fournies par CICS permettaient d'atténuer un peu cet inconvénient en mettant en tête de table (manuellement) les noms des transactions les plus utilisées.

## Concurrents de CICS

Un sous-système non-IBM nommé ROSCOE utilisait un pseudo-conversationnel du même type, mais demandait en revanche une recompilation intégrale à chaque nouvelle transaction ajoutée au système.
IMS est l'autre moniteur transactionnel d'IBM qui est concurrent de CICS (mais uniquement sur mainframe).

## Techniques conceptuellement cousines
### Simulation du multitâches en DOS

Le principe permettant à CICS de travailler en transactionnel sur un système sans effectuer de multitâches au sens propre du terme inspira en France nombre de serveurs Minitel gérant 80 connexions en simultané apparent sur un 386 travaillant sous DOS… qui était lui-même monotâche.
Des serveurs Minitel furent aussi développés sous CICS sur mainframe. En raison de sécurités actives par défaut en CICS et sans utilité dans une messagerie de loisirs (dynamic transaction backup, commit/rollback, etc.), de premiers essais se montrèrent peu performants. Une fois ces fonctions désactivées, CICS géra les terminaux en consommant en moyenne 0,02 MIPS du serveur central par Minitel connecté.