A busz vagy sín (hosszabb elnevezéssel buszrendszer vagy sínrendszer) a számítógép-architektúrákban a számítógép olyan, jól definiált része, alrendszere, amely lehetővé teszi adatok vagy tápfeszültségek továbbítását a számítógépen belül vagy számítógépek, illetve a számítógép és a perifériák között. Eltérően a pont-pont kapcsolattól, a busz logikailag összekapcsol több perifériát ugyanazt a vezetékrendszert használva. Minden buszhoz számos csatlakozó tartozik, amelyek lehetővé teszik a kártyák, egységek vagy kábelek elektromos csatlakoztatását.

A korai számítógépek buszrendszerei betű szerinti értelemben párhuzamos elektromos buszok voltak, több csatlakozóval, de fizikai kiépítésükben eltértek attól, funkcionálisan viszont azonosak voltak. A mai modern számítógépek buszai már párhuzamos és bit-soros kapcsolatokat is meg tudnak valósítani, vagy (elektromosan) párhuzamos huzalozásúak sokcsatlakozósak (multidrop), vagy pedig lánc topológiával rendelkezők, illetve egy kapcsoló hubhoz csatlakozók, mint például az USB (univerzális soros busz).

Története A korai számítógép buszok huzalkötegek voltak, amelyek összekötötték a memóriákat és a perifériákat. Ezeket a huzalkötegeket nevezték később elektromos buszoknak vagy buszvonalaknak. Majdnem mindig volt egy memória busz és egy periféria busz, és mivel ezek eltérő funkciókat valósítottak meg, ezért különböző utasítások, teljesen más időzítések, és protokollok tartoztak hozzájuk.

Az első problémát a megszakítások használata okozta. A korai számítógépek a ki/be műveletek végrehajtása alatt hurokban várakoztak a perifériális művelet végére. Ez időveszteséggel járt, a gép tulajdonképpen állt, az egyéb feladatok is fel voltak függesztve. Ha viszont a program valamilyen egyéb feladatot végzett, ami esetleg túl sok időt igényelt, és nem tudta időben figyelni a perifériális műveletet, akkor előfordulhatott ki/beviteli adatvesztés. A mérnökök kidolgozták a perifériák megszakítási rendszerét, amely biztosította a CPU által végzett művelet megszakítását. A megszakításokat prioritási csoportokba rendezték, mivel a CPU egyszerre csak egy feladatot tudott végrehajtani, így az időkritikus perifériális műveletek kapták a legmagasabb prioritást. A megszakításhoz rendelt program végrehajtása utána CPU visszatért a következő, alacsonyabb szintű megszakítási programhoz, vagy ha az nem volt, a főprogram végrehajtásához.

Nem sokkal később felmerült az igény arra, hogy a központi memóriát megosztva használja több CPU. Ezeknél a számítógépeknél a memória-hozzáférések is priorizálva voltak.

A klasszikus, egyszerű megoldás a megszakítások és memória-hozzáférések kezelésére a lánc kapcsolás volt.

DEC úgy döntött, hogy felesleges és drága két buszrendszert megvalósítani a kisméretű, nagy sorozatban készülő számítógépeknél, és kialakítottak egy olyan memória buszt, amelyre a perifériák is csatlakozni tudtak, így a memória műveletek egyszerűbbé váltak, a busz pedig bonyolultabbá. Abban az időben, ez egy igen merész tervezési lépés volt, az ellenzők biztosak voltak abban, hogy a megoldás életképtelen.

Az első mikroszámítógépek busz rendszerei tulajdonképpen egy passzív [hátlap]ra épített, és egymással összekötött csatlakozókból álltak. Az egyes egységeket, a CPU-t, a memóriát vagy memóriákat, a periféria vezérlőket stb. a csatlakozókba dugva automatikusan létrejött a kapcsolat az egységek között. Az egységek párhuzamosan voltak összekötve. Egyes megvalósítások esetében, mint például az IBM PC, külön utasítások szolgáltak arra, hogy a CPU használni tudja az így megvalósított ki/bemeneti buszt.

Néhány mikroprogramozott vezérlőben és beágyazott rendszerekben ki/beviteli busz gyakorlatilag nem is létezett. A kommunikációt a CPU vezérelte, a periféria vezérlők felé az adatok írása és olvasása előre meghatározott memóriaterületeken keresztül történt (legtöbb esetben), a központi órajeleknek megfelelő sebesség mellett. A külső egységek a CPU egy csatlakozójára adott jellel jelezték, hogy kiszolgálási igényük van, amihez általában valamilyen megszakítás (interrupt) is hozzá volt rendelve.

Például, a diszk vezérlő jelezni tudta a CPU-nak, hogy az adatok olvasásra készek a kijelölt memóriaterületen (mivel előzőleg betöltötte oda a lemezről leolvasott adatokat), a CPU ezután már hozzáfért a kért adatokhoz. A CPU és a diszk vezérlő között a kapcsolatot a memória biztosította. Az első gépek túlnyomó többsége ilyen elven működött, kezdve az Altair az S-100 buszával, és folytatva az 1980-as évek IBM PC-jével.

Ezek az egyszerű buszok voltak a legfontosabbak az általános célú számítógépek számára. Minden, a buszhoz csatlakozó berendezés azonos sebességgel tudott a buszon kommunikálni, amit a központi órajel határozott meg.

A CPU-k sebességének növekedése komoly problémát jelentett, mivel az előzőek értelmében a periféria vezérlők sebességét is azonos mértékben növelni kellett volna. Ez nem minden esetben sikerült, így előfordult, hogy egy gyors CPU-nak alkalmazkodnia kellett a leglassabb perifériavezérlő sebességéhez, a CPU sebesség növekedését nem lehetett kihasználni. Amíg ezt megoldást a beágyazott rendszerek esetében elfogadták, a kereskedelmi célú számítógépek esetében a piac már nem tolerálta.

Ugyancsak problémát jelentett, hogy majdnem minden művelethez a CPU-t kellett igénybe venni, így más feladatok végzésére már esetleg nem ért rá, tehát a CPU valódi áteresztőképessége drasztikusan leesett.

Néhány buszrendszer konfigurálása nagyon bonyolulttá vált, ha minden „polcról levett” berendezéssel együtt kellett működnie. Tipikus ilyen megoldás volt az alaplapokon és a csatolókártyákon lévő kisméretű kapcsolók (jumper) megjelenése, amelyek megfelelő helyre dugásával a memória címek, az I/O címek, megszakítási címek és prioritások bizonyos határok között, de megváltoztathatók voltak.

A „második generációs” buszrendszerek, mint a NuBus már kezelték a fenti problémák egy részét. Ezek a buszok mereven két részre osztották a "világot": az egyikbe a CPU és a memória tartozott, a másikba pedig a számos vezérlőegység, a két világ közötti kapcsolatot a busz vezérlő (bus controller) biztosította. Ez a megoldás megengedte a CPU sebességének növelését anélkül, hogy buszra hatással lett volna. Ez a megoldás a terhelést a CPU-ról a csatolókártyák felé mozdította, a csatolókártyáknak egymással és a buszvezérlővel kellett kommunikálniuk, és ehhez nem volt szükség a CPU igénybevételére. Sikerül ilyen módon a jobb teljesítményt elérni, cserébe viszont a csatolókártyák sokkal bonyolultabbak lettek. Ezek a buszok gyakran "nagyobb" sebességűek voltak az adatutak szempontjából, kezdetben 8 bites párhuzamos buszok voltak ez első generációkban, aztán jöttek a 16 bites, majd a 32 bites adatutak, szoftver segítségével történő konfigurálás (most ezt szabványosították, mint Plug-n-play) a manuális jumper dugdosás kiváltására.

Egy tulajdonságukban a mai, korszerű buszok megegyeznek elődeikkel: a buszon lévő egységek azonos sebességgel kommunikálnak egymással. Ahogyan a CPU és memória függetlenné vált az egyéb berendezésektől, a CPU és memória sebességét addig lehetett emelni, amíg a technikai lehetőségek azt lehetővé tették (de CPU és a memória kommunikációjának szinkronban kell lennie). E folyamat eredményeként a busz (periféria) sebessége esetleg kisebb, mint a korai gépeknél, és az adat ki-bevitel továbbra is szűk keresztmetszetet jelent. Különsen jól megfigyelhető ez a hatás a videó kártyák esetében: az új buszok, mint a PCI már nem elég gyorsak, a PC-kben megjelentek az AGP buszok. 2004-től az AGP-t is kinőtték, és nagy teljesítményű (high-end) videó kártyák már az új PCI Express buszokat igénylik.

A külső egységek számának növekedésével a perifériák elkezdtek saját buszokat használni. Amikor az első (hard) diszk egységek egy külön kártyával csatlakoztak a buszhoz, elfoglalva ezzel egy szabad busz csatlakozókat. Az 1980-as és 1990-es évek között az új rendszerek, mint a SCSI és a IDE már szakítottak ezzel a megoldással, és nem foglaltak minden diszk egységhez egy-egy busz csatlakozót. Mára ezek a saját buszrendszerek már bevett gyakorlatnak számítanak, és egyre több perifériát támogatnak.

Egyre népszerűbb lett az a koncepció, amely különbséget tesz helyi busz a külső busz között. A régi szemlélet szerint a buszokat úgy tervezték, hogy a belső egységek kiszolgálását biztosítsák (grafikus kártyák), később ezek a buszok már külső egységeket (szkenner)eket is támogattak. Meg kell jegyezni, hogy a "helyi" kifejezés gyakran a processzorhoz nagyon közeli (VL és PCI) buszt jelenti, nem pedig az ISA-t. Az IDE ugyan a használata szempontjából külső busznak tekinthető, de legtöbbször a gépen belül valósítják meg.

A buszok "harmadik generációja" piaci megjelenés előtt áll, ideértve a HyperTransport és a InfiniBand megoldásokat is. Ezek a buszok rendelkeznek azzal a tulajdonsággal, hogy a képesek nagysebességű kommunikációra a CPU, memória, videó kártyák irányába, de ugyanakkor a sokkal lassabb perifériákkal (lemezegység) is együtt tudnak működni. A fizikai kapcsolódást sokféle formában engedik meg, és használhatók belső busznak éppen úgy, mint külső egységek csatlakoztatására. A legkülönbözőbb igényeket támogatják, a harmadik generációs buszok már sokkal jobban hasonlítanak a magas szintű protokollokkal dolgozó számítógépes-hálózatokhoz, mint az eredeti busz elképzeléshez, képesek a nagy számú, különböző egységet, perifériát kezelni, összekapcsolni. A kezelésük is lassan már inkább szoftveres megoldásokat igényel, mint hardveres beavatkozásokat.

Egy másik ágon, az integrált áramkörök "testreszabásával" olyan logikák alakíthatók ki, amelyeket már intelligens vezérlőknek is nevezhetünk. Buszok, mint a Wishbone úgy vannak megtervezve, hogy megengedik a különböző integrált áramkörök egymás közötti kommunikációját.

Megvalósítások Régen a „busz” egy elektromosan párhuzamos rendszert jelentett, az elektromos vezetők, vezetékek megfeleltek a CPU kivezetéseinek. Ez a megoldás nem sokáig működött így, a mai modern rendszerekben már összemosódnak a buszok és a hálózatok közötti különbségek.

A buszok lehetnek párhuzamos buszok (paralel), amelyek egyidőben általában egy szót visznek át a vezetékeken, vagy lehetnek soros buszok (serial), amelyek bit-soros formában továbbítják az adatokat. A különböző kiegészítő tápfeszültség, vezérlő jel(ek) a különböző meghajtók számára további kapcsolódási pontok (csatlakozó pontok) kialakítását teszik szükségessé mindkét irányban. Általában minden soros busz legalább két csatlakozó ponttal többet valósít meg a szükségesnél a fentiek miatt (legalább 2-t biztosan használ), mint az I²C soros busz. Ahogyan az adatráta növekszik, főleg a párhuzamos buszok esetén, az időzítéssel és az áthallással kapcsolatos problémák és azok elhárítása egyre nehezebb lesz. Részleges megoldás erre a problémára, a double pump the bus. Gyakran a soros buszok jóval gyorsabban dolgoznak, mint a párhuzamos buszok, annak ellenére kevesebb kapcsolódási ponttal rendelkeznek, viszont a soros buszoknál sem az áthallás, sem az időzítési problémák nem jelentkeznek. Erre jó példák az USB, a FireWire, és a Serial ATA. A több csatlakozós gyors soros buszok nem működőképesek, ezért inkább a lánc, vagy a hub felépítésű buszokat alkalmaznak.

A legtöbb számítógépben belső és külső buszok is vannak. Egy belső busz a gépen belüli egységek összekapcsolását végzi, főleg a CPU-t és a központi memóriá(ka)t kapcsolja össze, vagy kapcsolja az alaplaphoz. Ezeket buszokat szokták még helyi buszoknak is nevezni, mivel a helyi egységeket kapcsolják össze, nem pedig a gépen kívüli egységeket, vagy másik számítógépeket. A külső buszok csatlakoztatják a perifériákat az alaplaphoz.