Mainframy řady IBM System/370

Pavel Tišnovský 1. 12. 2009

V dnešní části seriálu o historii výpočetní techniky se budeme zabývat mainframy řady IBM System/370. Jedná se o úspěšnou architekturu podporovanou firmou IBM po dobu delší než dvacet let, která navazuje na minule popsanou řadu System/360. Mnohé aplikace vytvořené pro System/370 jsou doposud provozovány, i když jsou dnes většinou spouštěny na modernějších systémech, například S/390 či zSeries.

Obsah

1. Mainframy řady IBM System/370

2. Architektura S/370

3. Instrukční sada S/370

4. Ukázka instrukční sady S/370

5. S/370-XA: rozšíření adres z 24 na 31 bitů

6. Segmentování a stránkování

7. Obsah dalšího pokračování seriálu

8. Odkazy na Internetu

1. Mainframy řady IBM System/370

V předchozích dvou částech seriálu o historii výpočetní techniky jsme se zaměřili na popis sálových počítačů řady IBM System/360, včetně klonů těchto počítačů vyráběných v zemích RVHP. Řada System/360 byla mezi uživateli, tj. jak specializovanými výpočetními centry, tak i většími firmami s vlastním počítačem, velmi oblíbená, což mj. znamenalo, že pro tyto počítače vzniklo velké množství aplikací důležitých pro chod firem. IBM si tohoto faktu byla vědoma, takže její další řada mainframů pojmenovaná IBM System/370, která byla na trh uvedena v roce 1970, zaručovala zpětnou kompatibilitu při migraci starších aplikací (mnohdy se jednalo například o velké bankovní systémy), i když se technologie operačních pamětí, logických obvodů i externích paměťových médií poměrně radikálním způsobem změnila (připomeňme si, že první modely počítačů System/360 používaly operační paměť vytvořenou z feritových jader a jediným vysokokapacitním médiem byly magnetické pásky či bubnové paměti).

ibm-4

Obrázek 1: Část sálového počítače IBM System/360 Model 40 (rok výroby 1964). V pozadí můžeme vidět jednotky s magnetickými pásky (model IBM 2401), ovládací panel je umístěn přímo za slečnou.

Mainframy řady System/370 (zkráceně S/370) byly vyráběny téměř dvacet let. Až počátkem devadesátých let minulého století je nahradila architektura Enterprise System Architecture/390 (ESA/390, řada System/390, zkráceně S/390). V podstatě se jednalo pouze o přejmenování ESA/370 (viz další kapitoly) bez větších změn v architektuře systému (zajímavé je, že v osmdesátých letech žádná řada System/380 nevznikla). Řada System/390 začala být od roku 2000 postupně nahrazována 64bitovou řadou zSeries, která však stále zaručuje zpětnou kompatibilitu s počítači System/370. S fungujícími mainframy System/390 se však stále můžeme setkat, ostatně na těchto počítačích je možné provozovat i Linux a velkou řadu GNU nástrojů. V následujících kapitolách si popíšeme základy architektury sálových počítačů System/370, včetně toho, proč se při adresování využívá pouze 31 bitů z adresy vypočtené z třicetidvou­bitových hodnot (tato „anomálie“ je z důvodu zpětné kompatibility dodržena i v Enterprise System Architecture (ESA)/390).

ibm-4

Obrázek 2: Některá paměťová média používaná u mainframů IBM 70×x i System/360 (i když pro System/360 byly následně vytvořeny modernější typy pamětí). Můžeme zde vidět jednotky bubnových pamětí, diskovou paměť i paměť složenou z feritových jader. Právě paměťová jednotka IBM 2361 (vlevo dole) má zajímavou historii – byla použita v NASA, zejména v projektech Gemini a Apollo. Celkem tato paměť obsahovala neuvěřitelných téměř 20 milionů paměťových buněk, kde každá buňka (s kapacitou jednoho bitu) byla složena z feritového toroidního jadérka navlečeného na trojici vodičů.

2. Architektura S/370

V této kapitole se budeme zabývat architekturou mainframů System/370, jenž je v originálních materiálech popsána velmi precizně, protože se firma IBM snažila, aby veškeré vylepšení této architektury v budoucnosti nemuselo vést k nutnosti úprav stávajících aplikací. Při popisu nebyla brána do úvahy žádná stávající ani budoucí technologie, což znamená, že konkrétní modely mainframů System/370 sice mohly používat zcela odlišné typy pamětí či různé technologie použité při výrobě procesorů (diskrétní součástky, integrované obvody LSI, VLSI atd.), ale počítače se z hlediska uživatelských aplikací chovaly stejně. Právě díky preciznímu popisu architektury a nezávislosti na použitých technologiích se mohla řada System/370 rozvíjet po dobu 20 let a poté plynule přejít na mainframy System/390, aniž by se muselo zasahovat do provozovaných aplikací (jedinou vážnější změnou, přesněji řečeno vylepšením, je přechod na 31bitové adresy popsaný v dalších kapitolách).

ibm-4

Obrázek 3: IBM System/370 Model 168 je jedním z prvních mainframů řady S/370.

Počítače řady System/370 byly vybaveny jedním či více procesory zpracovávajícími operandy široké 32 bitů rozdělených do čtyř bajtů (pořadí bajtů odpovídá konvenci big endian). Každý procesor obsahoval šestnáct třicetidvoubitových pracovních registrů (GPR – general purpose registers), šestnáct taktéž třicetidvoubitových řídicích registrů (CR – control registers) a stavové slovo (PSW – program status word) o šířce 64 bitů, v němž byly mj. uloženy i příznaky získané v průběhu posledně prováděné aritmetické či logické operace, ukazatel na právě zpracovávanou instrukci atd. S přechodem na architekturu ESA/390 bylo přidáno dalších šestnáct třicetidvoubitových registrů použitých při adresování. Operační paměť byla adresována po jednotlivých bajtech (osmici bitů), což mj. umožnilo snadnou práci s texty ukládanými v kódování EBCDIC, o němž jsme se již zmínili v jedné z předchozích částí tohoto seriálu.

ibm-4

Obrázek 4: Mainframe IBM emulovaný na běžném osobním počítači :-). V levé části můžeme vidět obsah všech šestnácti pracovních registrů i stavového slova, pod těmito údaji lze přepínat mezi zobrazením pracovních registrů (GPR), řídicích registrů (CR), registrů pro rozšířené adresování (System/390: AR) a registrů matematického koprocesoru (FPR). Na pravé straně obrazovky je zobrazen stav dvaceti emulovaných periferních zařízení. V dolní části obrazovky můžeme mj. přečíst i údaj o aktuální rychlosti emulovaného stroje: 5,37 MIPS.

3. Instrukční sada S/370

Mainframy řady System/360 a následně i System/370 jsou typickými zástupci počítačů, jejichž procesory využívají architekturu CISC, což znamená, že jejich instrukční sada obsahuje velké množství složitých instrukcí s mnohdy komplikovanými adresními režimy v nichž je možné používat bázové adresy, offsety, indexové registry, provádět inkrementaci či dekrementaci registrů v rámci adresování (viz instrukce LA – load address) atd. Instrukční sada S/370 obsahovala tolik instrukcí, že se programátoři bavili vtipy o tom, které instrukce firma IBM ve svých systémech prozatím neimplementovala:

BOB - BRANCH ON BUG
KCE - KILL CONSULTANT ON ERROR
SRDR - SHIFT RIGHT DOUBLE RIDICULOUS

Opakem je architektura RISC, která je využívána v těch procesorech v nichž většina instrukcí pracuje s registry a jedinými instrukcemi, které dovolují načítat či ukládat hodnoty do operační paměti, jsou instrukce typu LOAD a STORE (předností této architektury je jednoduchost procesoru, možnost používání pipeliningu bez nutnosti zavádění složitých obvodů pro detekci kolizí a z toho vyplývající velké rychlosti zpracování instrukcí; většina složitých operací je provedena již překladačem).

ibm-4

Obrázek 5: Mainframe IBM System/370 model 138.

Typickým znakem instrukční sady System/370 je podpora strojového kódu, který je nezávislý na adrese, od které je uložen v operační paměti (PIC – Position Independent Code). Ve specifikaci mainframů System/370 není napsáno, že všechny „kompatibilní“ procesory musí umět zpracovávat všechny instrukce. V praxi je tedy možné, aby procesory levnějších a méně výkonných počítačů System/370 některé složité instrukce převáděly na sekvenci instrukcí jednodušších. Naopak výkonné počítače System/370 mohly být vybaveny procesory, které všechny instrukce dokázaly přímo provádět, i když to vedlo k jejich větší složitosti. K základním procesorům, které dokázaly přímo zpracovávat celočíselné třicetidvoubitové hodnoty, bylo možné připojit i matematické koprocesory umožňující práci s 64bitovými či 128bitovými hodnotami uloženými ve formátu plovoucí řádové čárky a taktéž koprocesory umožňující práci s vektory.

ibm-4

Obrázek 6: Procesorová jednotka počítače IBM System/370 Model 9375.

4. Ukázka instrukční sady S/370

Způsob zápisu programů v assembleru (přesněji jazyku symbolických adres) používaného u mainframů System/360System/370, je ukázán pod tímto odstavcem. Prakticky celou instrukční sadu lze nalézt na stránce http://www.simotime.com/simoi370.htm, mnemotechnické kódy instrukcí podmíněných i nepodmíněných skoků (branches) jsou vysvětleny na stránce http://www.simotime.com/asmbch01.htm:

I@A      EQU   *
* Add 4-byte memory value to register
         L     R4,FW00XX02     x'00000002'
         A     R4,FW00XX01   * Add x'00000001' = x'00000003' cc=2
         A     R4,FW80XX05   * Add x'80000005' = x'80000008' cc=1
***********************************************************************
I@AH     EQU   *
* Add 2-byte memory value to register
         AH    R4,HEX2+2     * Add HEX-2 TO REG-3
***********************************************************************
I@AL     EQU   *
* Add 4-byte memory value to register
         L     R4,FW00XX02     x'00000002'
         AL    R4,FW00XX01   * Add x'00000001' result x'00000003'
         AL    R4,FW80XX05   * Add x'80000005' result x'80000008'
***********************************************************************
I@ALR    EQU   *
* Add Logical Register to Register
         ALR   R3,R4         * Add  Register-Register
***********************************************************************
I@AP     EQU   *
* Add decimal (packed)
         AP    D1,D2         * Add Memory-Memory
***********************************************************************
I@AR     EQU   *
* Add Register to Register
         AR    R3,R4         * Add R4 to R3, Register-Register
***********************************************************************
I@BAL    EQU   *
* The following two instructions are primarily used in 24-bit mode.
* Branch and Link, the BAL and BALR Instructions
         BAL   R9,*+4        * Load R9 with LINK ADDR,BRANCH (24-BIT)
I@BALR   EQU   *
         BALR  R9,R0         * Load R9 with LINK ADDR (24-BIT)
***********************************************************************
I@BAS    EQU   *
* The following two instructions are primarily used in 31-bit mode.
* Branch and Save, the BAS and BASR Instructions
         BAS   R10,*+4       * Load R10 with LINK ADDR,BRANCH (31-BIT)
I@BASR   EQU   *
         BASR  R10,R0        * Load R10 with LINK ADDR (31-BIT)
***********************************************************************
I@BC     EQU   *
* BRANCH on Condition
         BC    15,*+8        * BRANCH to SELF-PLUS-FOUR
         B     *+4             Same as preceding instruction
***********************************************************************
I@BCR    EQU   *
* BRANCH on Condition Register
         LA    R8,BCREND       Load BRANCH-TO ADDRESS into REG-8
         BCR   15,R8         * BRANCH to ADDRESS specified in REG-8
         BR    R8              Same as preceding instruction
BCREND   EQU   *               Label for BCR-INSTRUCTION
ibm-4

Obrázek 7: Dobovou literaturu o mainframech System/360 a System/370 lze dodnes najít jak v technických a univerzitních knihovnách, tak i například na eBayi.

Pro S/370 a samozřejmě také pro S/390 je dostupný i překladač GCC společně s celými binutils. Pro S/370 již nejsou z důvodu zastaralosti této platformy nové verze GCC připravovány, ale samozřejmě není problém použít starší překladače. Při překladu zdrojového kódu (například céčkového) do assembleru je použita syntaxe AT&T, která se od výše uvedené syntaxe v mnoha ohledech odlišuje, například jiným způsobem pojmenování registrů či zápisu adres. Následuje ukázka překladu jednoduché funkce pro výpočet největšího společného dělitele dvou celočíselných hodnot:

int gcd(int a, int b)
{
    if (a==0)
        return  b;

    while (b>0)
        if (a>b)
            a-=b;
        else
            b-=a;

    return a;
}

GCC vyprodukuje (bez použití optimalizací) následující program v assembleru:

        stmg    %r11,%r15,88(%r15)
        lay     %r15,-168(%r15)
        lgr     %r11,%r15
        lgr     %r1,%r3
        st      %r2,164(%r11)
        st      %r1,160(%r11)
        l       %r1,164(%r11)
        ltr     %r1,%r1
        jne     .L4
        l       %r1,160(%r11)
        j       .L3
.L6:
        l       %r1,164(%r11)
        c       %r1,160(%r11)
        jle     .L5
        l       %r1,164(%r11)
        s       %r1,160(%r11)
        st      %r1,164(%r11)
        j       .L4
.L5:
        l       %r1,160(%r11)
        s       %r1,164(%r11)
        st      %r1,160(%r11)
.L4:
        l       %r1,160(%r11)
        ltr     %r1,%r1
        jh      .L6
        l       %r1,164(%r11)
.L3:
        lgfr    %r1,%r1
        lgr     %r2,%r1
        lg      %r4,280(%r11)
        lmg     %r11,%r15,256(%r11)
        br      %r4

Povšimněte si, že pro přístup k lokálním proměnným se používá registr R11 s offsetem 160 resp. 164, protože proměnné typu int jsou od sebe v operační paměti vzdálené čtyři bajty. Při zapnutí optimalizačních metod se samozřejmě načítání i ukládání hodnot do operační paměti v co nejvyšší míře eliminuje.

5. S/370-XA: rozšíření adres z 24 na 31 bitů

Původní mainframy řady System/370 používaly z důvodu zpětné kompatibility s počítači System/360 pouze 24bitové adresování, i když šířka pracovních registrů byla rovna 32 bitům. Při načítání dat z operační paměti nebo při provádění skoků se nejvyšších osm bitů adresy ignorovalo, čehož některé aplikace využívaly, například tak, že do zmiňovaných osmi bitů ukládaly další informace (například informaci o typu dat, příznaky atd.). Firma IBM se po zhruba deseti letech existence mainframů System/370 rozhodla pro rozšíření adresového prostoru, který byl v případě použití 24 bitů adresy omezen na kapacitu pouhých 16 MB; výsledkem byla architektura System/370-XA resp. pouze S/370-XA. Důvod byl jednoduchý – nové aplikace vyžadovaly práci s většími objemy dat a současně již byly k dispozici technologie, které vedly k tomu, že začaly být cenově dostupné paměti o kapacitách stovek megabajtů i jednotek gigabajtů (v dobách S/360 s feritovými paměťmi byla tato kapacita takřka nepředstavitelná, už jen z prostorových důvodů). Jakým způsobem bylo adresování prováděno je vysvětleno v další kapitole.

ibm-4

Obrázek 8: Část mainframu IBM System/370 Model 9375.

To, zda se bude používat 24bitové či 31bitové adresování je prováděno na základě hodnoty nejvyššího bitu adresy. Pokud je tento bit nulový, používá se původní 24bitové adresování (horních osm bitů adresy se ignoruje), v opačném případě je zbylých 31 bitů použito pro výpočet fyzické adresy. V praxi to znamená, že bylo nutné upravit pouze ty starší aplikace, které nastavovaly nejvyšší bit adresy na jedničku, ostatní aplikace běžely stále v režimu 24bitového adresování.

6. Segmentování a stránkování

Adresa uložená například v pracovním registru neurčovala přímo adresu buňky v operační paměti, ale takzvanou virtuální adresu. Pro transformaci virtuálních adres na adresy fyzické se používal přepočet na základě obsahu segmentové tabulky (segment table) a stránkových tabulek (page table(s)). Virtuální 24bitová či 31bitová adresa, se kterou mohl programátor manipulovat, byla rozdělena na tři části – index do segmentové tabulky, index do stránkové tabulky vybrané na základě jednoho ze šestnácti segmentů a offset. V případě 24bitových adres byl index do segmentové tabulky široký 4 bity, index do stránkové tabulky 8 bitů a pro offset bylo vyhrazeno zbývajících 12 bitů. Segmentová tabulka obsahovala šestnáct záznamů, přičemž každý záznam byl složen z reálné adresy tabulky stránek a její délky (1 až 256 záznamů). Na základě čtyřbitového indexu se ze segmentové tabulky vybrala adresa jedné ze šestnácti stránkových tabulek. Tyto tabulky mohly obsahovat až 256 záznamů o šířce 12 či 20 bitů, z nichž jeden byl vybraný na základě osmibitového „stránkového“ indexu.

ibm-4

Obrázek 9: Způsob výpočtu fyzické adresy z adresy virtuální při použití 24 bitového adresování. Situace je obdobná jako v případě 31 bitového adresování, ale bitové šířky jednotlivých částí adresy jsou odlišné.

Vybraných 12 či 20 bitů ze stránkové tabulky bylo po bitovém posunu o 12 míst doleva připojeno k offsetu, čímž vznikla kýžená 24bitová či 32bitová fyzická adresa. Tento způsob výpočtu fyzických adres měl několik předností – eliminoval fragmentaci dat v operační paměti a současně umožňoval operačnímu systému rozdělit jednotlivé bloky operační paměti mezi různé procesy (postačilo zakázat modifikace segmentových a stránkových tabulek) a umožňoval měnit velikosti jednotlivých segmentů zvětšováním či naopak zmenšováním příslušných stránkových tabulek. Navíc byl tento způsob výpočtu adres flexibilnější než varianta segment:offset s překrývajícími se segmenty a offsety, jak ji známe z architektury i86. Tím, že nedochází k překryvu offsetu s adresou stránky, je velikost každé stránky rovna 212 bajtům, tj. čtyřem kilobajtům, což je vlastně minimální velikost paměťových bloků, po kterých může operační systém efektivně přidělovat části operační paměti jednotlivým procesům.

7. Obsah dalšího pokračování seriálu

V následující části seriálu o historii vývoje počítačů si řekneme, jaké operační systémy a programovací jazyky byly používány na mainframech řady System/370System/390. Firma IBM i další subjekty se podílely na vytvoření poměrně velkého množství operačních systémů pro tyto počítače, každý systém byl určen pro provozování určitého typu úloh. Mezi základní systémy patří DOS/VS, OS/MFT (OS/VS1) a OS/MVT (OS/VS2), později byl vyvinut pravděpodobně nejznámější a nejvýkonnější systém pro tyto počítače – MVS/370. Samozřejmě nezapomeneme ani na Linux/390, který je pro některé typy úloh (například webové aplikace) vhodnější než MVS. Z programovacích jazyků si stručně představíme COBOL (typicky používaný v bankovních systémech, který se v této oblasti stále využívá), Fortran (dodnes používaný v oblasti numerických výpočtů, například simulací) a PL/1, který se firma IBM poměrně neúspěšně pokoušela prosadit jako univerzální programovací jazyk vhodný pro většinu úloh (existovala i zjednodušená verze tohoto jazyka určená pro mikroprocesory a mikrořadiče, která se nazývala PL/M).

ibm-4

Obrázek 10: Kniha o Linuxu na mainframech S/390 a zSeries.

Taktéž si popíšeme některé klony mainframů System/370 a System/390 i populární emulátor těchto strojů určený pro osobní počítače – Hercules. S využitím tohoto emulátoru je možné zprovoznit mainframe (včetně vybraného operačního systému i aplikací) například i na obyčejném netbooku.

widgety

ibm-4

Obrázek 11: Hercules – emulátor mainframů System/370 i System/390.

8. Odkazy na Internetu

  1. IBM ESA/390
    http://en.wikipedia.org/…/IBM_ESA/390
  2. 31-bit
    http://en.wikipedia.org/wiki/31-bit
  3. Hercules IBM S/370 and ESA/390 Emulator
    http://www.jaymoseley.com/hercules/
  4. The Hercules System/370, ESA/390, and z/Architecture Emulator
     http://www.hercules-390.org/
  5. MVS
    http://en.wikipedia.org/wiki/MVS
  6. MVS… a long history. A history of IBM's most powerful and reliable operating system
     http://www.os390-mvs.freesurf.fr/mvshist.htm
  7. MVS : the operating system that keeps the world going
     http://www.os390-mvs.freesurf.fr/mvs.htm
  8. The 370 Instruction Set
    http://www.simotime.com/simoi370.htm
  9. Mainframe family tree and chronology
    http://www-03.ibm.com/…ame_FT1.html
  10. 704 Data Processing System
    http://www-03.ibm.com/…e_PP704.html
  11. 705 Data Processing System
    http://www-03.ibm.com/…e_PP705.html
  12. The IBM 704
    http://www.columbia.edu/…ory/704.html
  13. IBM Mainframe album
    http://www-03.ibm.com/…e_album.html
  14. Mainframe computer
    http://en.wikipedia.org/…ame_computer
  15. IBM mainframe
    http://en.wikipedia.org/…BM_mainframe
  16. IBM 700/7000 series
    http://en.wikipedia.org/…/7000_series
  17. IBM System/360
    http://en.wikipedia.org/…M_System/360
  18. IBM System/370
    http://en.wikipedia.org/…M_System/370
  19. IBM Floating Point Architecture
    http://en.wikipedia.org/…Architecture
  20. Extended Binary Coded Decimal Interchange Code
     http://en.wikipedia.org/wiki/EBCDIC
  21. 25 let ÚVT MU v Brně – Technika: Sálové počítače
     http://www.ics.muni.cz/…ocitace.html
  22. IBM System/360 (1964)
    http://www.computermuseum.li/…360-1964.htm
  23. Mainframe Museum ‚Where we started‘
    http://www.techsystemsps.com/…e-Museum.htm
  24. 360 Assembly
    http://en.wikibooks.org/…360_Assembly
  25. 360 Assembly/360 Architecture
    http://en.wikibooks.org/…Architecture
  26. ASCII/EBCDIC Conversion Table
    http://docs.hp.com/…/apcs01.html
  27. EBCDIC
    http://www.hansenb.pdx.edu/…s/ebcdic.php
  28. EBCDIC tables
    http://home.mnet-online.de/…ic/cc_en.htm
  29. The Mainframe Blog
    http://mainframe.typepad.com/…nal_mai.html
  30. IBM Tightens Stranglehold Over Mainframe Market Gets Hit with Antitrust Complaint in Europe
     http://www.ccianet.org/…Europe.shtml
  31. Lectures in the History of Computing: Mainframes
     http://www.computinghistorymuseum.org/…omputers.ppt
  32. 36-bit
    http://en.wikipedia.org/…_word_length
  33. 36bit.org
    http://www.36bit.org/
  34. ES EVM
    http://en.wikipedia.org/wiki/ES_EVM
  35. History of computer hardware in Soviet Bloc countries
     http://en.wikipedia.org/…st_countries
Našli jste v článku chybu?
Lupa.cz: Adblock Plus začal prodávat reklamy

Adblock Plus začal prodávat reklamy

Podnikatel.cz: Znáte už 5 novinek k #EET

Znáte už 5 novinek k #EET

DigiZone.cz: Banaxi: videa kdekoli na světě

Banaxi: videa kdekoli na světě

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

Podnikatel.cz: „Lex Babiš“ Babišovi paradoxně pomůže

„Lex Babiš“ Babišovi paradoxně pomůže

Lupa.cz: Proč jsou firemní počítače pomalé?

Proč jsou firemní počítače pomalé?

Vitalia.cz: 5 chyb, které děláme při skladování potravin

5 chyb, které děláme při skladování potravin

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Root.cz: Hořící telefon Samsung Note 7 zapálil auto

Hořící telefon Samsung Note 7 zapálil auto

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Vitalia.cz: Tradiční čínská medicína a rakovina

Tradiční čínská medicína a rakovina

DigiZone.cz: Technisat připravuje trojici DAB

Technisat připravuje trojici DAB

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

DigiZone.cz: Digi Slovakia zařazuje stanice SPI

Digi Slovakia zařazuje stanice SPI

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?

Podnikatel.cz: Letáky? Lidi zuří, ale ony stále fungují

Letáky? Lidi zuří, ale ony stále fungují