Wat is communicatie tussen processen (IPC)?

May 28, 2025

Interprocescommunicatie (IPC) verwijst naar de mechanismen waarmee processen gegevens kunnen uitwisselen en hun acties kunnen coördineren terwijl ze gelijktijdig op een besturingssysteem draaien.

wat is interprocescommunicatie

Wat is interprocescommunicatie?

Interprocescommunicatie is een set programmeerinterfaces en mechanismen die door een besturingssysteem worden aangeboden en die afzonderlijke processen in staat stelt gegevens, signalen en bronnen uit te wisselen. Deze processen kunnen op dezelfde machine draaien of verspreid zijn over verschillende systemen.

IPC (Interprocess Communication) bevordert de coördinatie en samenwerking tussen processen door ze in staat te stellen met elkaar te communiceren via verschillende methoden, zoals gedeeld geheugen, berichtuitwisseling, sockets of pijpen. Omdat processen doorgaans geïsoleerd zijn en geen geheugenruimte delen, is IPC cruciaal om ervoor te zorgen dat gegevens veilig en efficiënt tussen hen kunnen worden overgedragen. Het speelt ook een belangrijke rol bij het beheren van afhankelijkheden, synchronisatie en het delen van resources in multitasking- en parallelle computeromgevingen.

Welke specifieke IPC-methoden beschikbaar zijn en hoe ze worden geïmplementeerd, hangt af van het onderliggende besturingssysteem en de programmeeromgeving.

Inter-procescommunicatietypen

Hieronder vindt u de belangrijkste soorten IPC, met uitleg over hoe ze werken:

  • Buizen. Pipes bieden een unidirectioneel communicatiekanaal tussen processen. Een pipe stelt het ene proces in staat om gegevens te schrijven en het andere om deze te lezen. Er zijn twee typen: anonieme pipes, die gebruikt worden tussen gerelateerde processen (bijvoorbeeld parent-child), en named pipes (FIFO's), die communicatie tussen niet-gerelateerde processen mogelijk maken.
  • Berichtenwachtrijen. Berichtenwachtrijen stellen processen in staat berichten uit te wisselen in een gestructureerde wachtrij. Processen schrijven berichten naar de wachtrij en andere processen lezen ze in FIFO- of geprioriteerde volgorde. Deze methode is geschikt voor asynchrone communicatie en ontkoppeling van zender en ontvanger.
  • Gedeeld geheugen. Gedeeld geheugen zorgt ervoor dat meerdere processen toegang hebben tot hetzelfde deel van fysiek geheugenHet is de snelste IPC-methode omdat het kopiëren van gegevens tussen processen overbodig maakt. Het vereist echter synchronisatiemechanismen (zoals semaforen of mutexen) om racecondities te voorkomen.
  • Semaforen. Semaphores zijn synchronisatietools die worden gebruikt om de toegang tot gedeelde bronnen te beheren. Ze doen dit niet. gegevens verzenden Ze worden gebruikt in combinatie met gedeeld geheugen of bestanden om conflicterende toegang door meerdere processen te voorkomen.
  • Stopcontacten. Sockets maken communicatie tussen processen via een netwerk of binnen dezelfde machine mogelijk. Ze maken gebruik van standaard netwerkprotocollen (TCP or UDP) en worden veel gebruikt voor cliënt-server toepassingen en gedistribueerde systemen.
  • Signalen. Signalen zijn beperkte, asynchrone meldingen die naar een proces worden verzonden om het op de hoogte te stellen van een gebeurtenis, zoals een onderbreking of beëindigingsverzoek. Signalen kunnen worden gebruikt om processen te besturen, maar zijn niet geschikt voor gegevensoverdracht.
  • Geheugentoegewezen bestanden. Geheugen-gemapt bestanden Hiermee kunnen processen een bestand of een deel ervan in hun adresruimte plaatsen. Dit biedt gedeelde toegang tot de inhoud van het bestand zonder expliciete lees-/schrijfbewerkingen, wat efficiënte bestandsgebaseerde IPC ondersteunt.

Hoe werkt interprocescommunicatie?

Hoe werkt interprocescommunicatie?

Interprocescommunicatie werkt door processen in staat te stellen gegevens uit te wisselen en hun uitvoering te synchroniseren met behulp van door het besturingssysteem geleverde mechanismen. Omdat elk proces doorgaans zijn eigen geïsoleerde geheugenruimte heeft, maakt IPC gebruik van gecontroleerde interfaces om communicatie te faciliteren zonder de procesisolatie of systeembeveiliging te schenden.

Wanneer een proces wil communiceren, gebruikt het systeemoproepen of API's om toegang te krijgen tot een IPC-mechanisme, zoals pijpen, berichtenwachtrijen, gedeeld geheugen of sockets. In een berichtuitwisselingssysteem formatteert het verzendende proces bijvoorbeeld gegevens tot een bericht en plaatst dit in een wachtrij of verzendt het via een socket. De ontvanger ontvangt het bericht, verwerkt het en kan op dezelfde manier reageren. In systemen met gedeeld geheugen wordt een geheugenregio toegankelijk gemaakt voor meerdere processen, waardoor ze direct kunnen lezen en schrijven, meestal met synchronisatieprimitieven zoals semaforen of mutexen om gegevenscorruptie te voorkomen.

IPC kan synchroon zijn – waarbij processen op elkaar moeten wachten – of asynchroon, waarbij ze onafhankelijk van elkaar kunnen werken. Het besturingssysteem regelt machtigingen, geheugenbeheer en synchronisatie om betrouwbare communicatie te garanderen, procesgrenzen te handhaven en deadlocks of racecondities te voorkomen.

De exacte workflow is afhankelijk van het gebruikte type IPC en de implementatie van het besturingssysteem. Alle IPC-mechanismen zijn echter gericht op het bieden van efficiënte, veilige en gecoördineerde communicatie tussen processen.

Inter-procescommunicatie en besturingssystemen

Interprocescommunicatie verschilt per besturingssysteem, afhankelijk van de architectuur, ontwerpfilosofie en ondersteunde programmeerinterfaces. Hoewel de kerndoelen – gegevensuitwisseling en synchronisatie tussen processen – consistent blijven, verschillen de implementatie en beschikbare mechanismen.

Unix / Linux

UNIX -achtige systemen bieden een uitgebreide set IPC-mechanismen die gestandaardiseerd zijn door POSIX . Deze omvatten:

  • Pijpen en FIFO's voor eenvoudige bytestreamcommunicatie.
  • Berichtenwachtrijen en gedeelde geheugensegmenten toegankelijk via msgget(), shmget() en gerelateerde systeemoproepen.
  • semaforen voor synchronisatie, gebruikmakend van semget() en bijbehorende functies.
  • Signalen voor asynchrone gebeurtenismeldingen.
  • Sockets, zowel lokaal (UNIX-domein) als in een netwerk (TCP/UDP), voor robuuste communicatie tussen processen, zelfs op verschillende machines.

Linux ondersteunt ook geavanceerde functies zoals epoll , eventfd en netlink-sockets voor hoogwaardige communicatie op systeemniveau.

Windows

Windows gebruikt een andere set IPC-primitieven die geïntegreerd zijn in de Win32 API en de Windows NT-kernelarchitectuur:

  • Benoemde en anonieme pijpen, die duplexcommunicatie biedt.
  • Brievenbussen voor eenrichtingsberichten in broadcast-stijl.
  • Gedeelde herinnering via geheugen-gemapte bestanden.
  • Semaforen, mutexen, evenementenen kritieke secties voor synchronisatie.
  • COM (Componentobjectmodel) en DDE (Dynamische gegevensuitwisseling) voor objectgebaseerde of oudere communicatie tussen applicaties.
  • Windows Sockets (Winsock) voor netwerkcommunicatie en IPC tussen machines.

macOS

Omdat macOS UNIX-gebaseerd is, ondersteunt het standaard POSIX IPC-methoden zoals pipes, berichtenwachtrijen, semaforen en gedeeld geheugen. Het omvat ook:

  • Mach-poorten, onderdeel van de XNU kernel's microkernelarchitectuur, gebruikt voor op berichten gebaseerde IPC op systeemniveau.
  • Grote centrale verzending (GCD) en XPC voor asynchrone taak- en servicecommunicatie op hoog niveau in gebruikersapplicaties.

Android

Android, gebouwd op Linux, gebruikt standaard Linux IPC, maar voegt daar nog extra frameworks aan toe:

  • Bindmiddel IPC, een hoge performantie RPC-mechanisme dat veel wordt gebruikt voor communicatie tussen systeemservices en apps.
  • Sockets, gedeeld geheugenen bestanden voor standaard Linux-stijl IPC.
  • AIDL (Android Interface Definition Language) om interfaces voor Binder-communicatie op een typeveilige manier te definiëren.

RTOS en ingebedde systemen

Real-time besturingssystemen (RTOS) zoals FreeRTOS, VxWorks en QNX maken gebruik van lichtgewicht IPC-mechanismen die speciaal zijn ontworpen voor deterministisch gedrag:

  • Berichtenwachtrijen, mailboxen, semaforenen evenementenvlaggen.
  • Gedeelde herinnering in nauw gekoppelde systemen met strikte timingvereisten.
    Deze zijn geoptimaliseerd voor lage latentie en minimale overhead, en niet zozeer voor functionaliteitsrijkdom.

Inter-procescommunicatie en gedistribueerde systemen

ipc en gedistribueerde systemen

Interprocescommunicatie in gedistribueerde systemen omvat communicatie tussen processen die draaien op afzonderlijke fysieke of virtuele machines die via een netwerk met elkaar verbonden zijn. In tegenstelling tot traditionele IPC binnen één systeem, moet bij gedistribueerde IPC rekening worden gehouden met netwerklatentie , gedeeltelijke uitval en het ontbreken van gedeeld geheugen. Elk type gedistribueerd systeem kan IPC op een andere manier implementeren, afhankelijk van de architectuur, protocollen en gebruiksscenario's.

1. Klant-Server Systems

In een cliënt-server modelIPC wordt doorgaans afgehandeld via sockets of remote procedure calls (RPC). Clients sturen verzoeken via een netwerk (meestal TCP of HTTP) naar een server, die de aanvraag verwerkt en een antwoord retourneert. Dit model benadrukt de vraag-antwoordcommunicatie en wordt veel gebruikt in webservices. databank systemen en toepassingen servers.

2. Peer-to-peer (P2P)-systemen

P2P systemen verdelen de controle en verantwoordelijkheid over knooppunten, waarbij elk knooppunt zowel als cliënt als serverIPC in P2P-systemen maakt vaak gebruik van gedecentraliseerde protocollen en is sterk afhankelijk van sockets, UDP-broadcasts of peer-discoverymechanismen. Het delen van gegevens kan asynchroon zijn en consistentie wordt meestal beheerd via gedistribueerde consensus of versiebeheer.

3. Microservices-architecturen

In microservices communiceren verschillende services via het netwerk met behulp van lichtgewicht IPC-mechanismen zoals RESTful API's, gRPC of message brokers zoals Kafka of RabbitMQ. Services zijn losjes gekoppeld en vaak stateless, en vertrouwen op IPC voor gegevensuitwisseling, coördinatie en workflow-orkestratie. Message queues worden vaak gebruikt om betrouwbare, asynchrone communicatie te garanderen.

4. Cloud en gedistribueerde computerframeworks

Gedistribueerde systemen zoals Apache Hadoop, Spark of Kubernetes gebruiken gespecialiseerde IPC-protocollen voor coördinatie en gegevensuitwisseling. Hadoop gebruikt bijvoorbeeld RPC voor communicatie tussen knooppunten, terwijl Kubernetes gRPC en etcd gebruikt voor gedistribueerde statussynchronisatie. Deze frameworks moeten IPC beheren met het oog op fouttolerantie, schaalbaarheid en een hoge doorvoer.

5. Realtime gedistribueerde systemen

In realtimesystemen (bijvoorbeeld in telecommunicatie- of besturingssystemen) moet IPC voldoen aan strikte timingvereisten. Deze systemen kunnen gebruikmaken van realtime berichtenbussen (zoals DDS of ZeroMQ) om communicatie met lage latentie en deterministische gegevens te garanderen, zelfs bij storingen of variaties in de belasting.

Wat is een voorbeeld van IPC?

Een veelvoorkomend voorbeeld van communicatie tussen processen is het gebruik van pipes in op UNIX gebaseerde besturingssystemen, waarmee het ene proces gegevens kan doorgeven aan het andere.

Neem bijvoorbeeld het commando:

ls | grep ".txt"

Hier geeft het `ls`-proces een lijst van bestanden in een directory en schrijft de uitvoer naar een pipe. Het `grep`-proces leest vervolgens uit die pipe en filtert de uitvoer, zodat alleen de extensie .txt-bestanden worden weergegeven. De pipe (|) fungeert als interprocescommunicatiemechanisme (IPC), waardoor de twee processen met elkaar kunnen communiceren zonder naar een tussenliggend bestand te schrijven of eruit te lezen. Dit type IPC is eenvoudig, efficiënt en wordt veelvuldig gebruikt in shellscripts en commandoregelomgevingen.

De voor- en nadelen van IPC

Interprocescommunicatie speelt een cruciale rol bij het efficiënt laten samenwerken van processen, zowel binnen hetzelfde systeem als in gedistribueerde omgevingen. Hoewel IPC coördinatie en gegevensuitwisseling vergemakkelijkt, brengt het ook complexiteit, potentiële prestatieoverhead en synchronisatieproblemen met zich mee. Inzicht in de voor- en nadelen van IPC helpt bij het selecteren van het juiste communicatiemechanisme voor een bepaalde toepassing.

Voordelen van interprocescommunicatie

Hieronder vindt u de belangrijkste voordelen van IPC, inclusief uitleg:

  • Modulair ontwerp. IPC maakt de ontwikkeling van modulaire toepassingen Waar functionaliteit over meerdere processen is verdeeld. Deze scheiding verbetert de onderhoudbaarheid, schaalbaarheid en duidelijkheid van het softwareontwerp, waardoor elk proces zich op een specifieke taak kan richten.
  • Bron delen. IPC maakt het mogelijk dat meerdere processen gegevens en systeembronnen zoals bestanden, geheugen en netwerkverbindingen delen. Dit voorkomt duplicatie en verbetert de efficiëntie door gecoördineerde toegang tot gedeelde componenten mogelijk te maken.
  • Parallelisme en gelijktijdigheid. Door meerdere processen gelijktijdig te laten draaien en communiceren, ondersteunt IPC parallelle uitvoering. Dit verbetert de prestaties op multi-core systemen aanzienlijk en verkort de verwerkingstijd voor complexe taken.
  • Specialisatie en herbruikbaarheid. Processen kunnen worden ontworpen als onafhankelijke services of componenten die communiceren via IPC. Deze services kunnen worden hergebruikt in verschillende applicaties of systemen, waardoor de ontwikkeltijd en -inspanning worden verminderd.
  • Schaalbaarheid in gedistribueerde systemen. IPC is essentieel bij gedistribueerd computergebruik, omdat het processen op verschillende machines met elkaar laat samenwerken. Dit ondersteunt horizontale schaalverdeling, waardoor systemen grotere werklasten kunnen verwerken door taken te verdelen over meerdere knooppunten.
  • Foutisolatie. Door functies in verschillende processen te scheiden, ondersteunt IPC foutisolatie. Een storing in één proces leidt niet noodzakelijkerwijs tot een crash van de hele applicatie, wat de algehele robuustheid en stabiliteit van het systeem verbetert.
  • Ondersteuning voor heterogene systemen. In gedistribueerde omgevingen maakt IPC communicatie mogelijk tussen processen die op verschillende systemen draaien. hardware platforms of besturingssystemen, vaak via gestandaardiseerde protocollen zoals TCP/IP of gRPC.

Nadelen van interprocescommunicatie

Hieronder staan ​​de belangrijkste nadelen van IPC, inclusief uitleg:

  • Verhoogde complexiteit. De implementatie van IPC verhoogt de complexiteit van applicatieontwerp, vooral bij het coördineren van meerdere processen of het garanderen van betrouwbare gegevensuitwisseling. Ontwikkelaars moeten synchronisatie, foutafhandeling en communicatieprotocollen expliciet beheren.
  • Synchronisatieproblemen. Wanneer meerdere processen toegang hebben tot gedeelde bronnen, kunnen er racecondities, deadlocks of inconsistenties in gegevens ontstaan ​​als de juiste synchronisatie (bijvoorbeeld via mutexen en semaforen) niet zorgvuldig wordt geïmplementeerd.
  • Prestatieoverhead. Sommige IPC-mechanismen, zoals berichtdoorgifte of netwerkgebaseerde communicatie, veroorzaken aanzienlijke overhead vanwege contextwisseling, het kopiëren van gegevens en netwerklatentie, vooral in gedistribueerde omgevingen.
  • Veiligheidsrisico's. IPC kan processen blootstellen aan ongeautoriseerde toegang of data lekkage Als machtigingen en toegangscontroles niet strikt worden gehandhaafd, kunnen kwaadaardige processen gedeelde bronnen misbruiken of berichten tussen processen onderscheppen.
  • Beperkte draagbaarheid. Bepaalde IPC-implementaties zijn nauw gekoppeld aan specifieke besturingssystemen of platforms, waardoor de overdraagbaarheid tussen verschillende omgevingen zonder aanpassing of abstractie beperkt kan zijn.
  • Moeilijkheden bij het debuggen. Het diagnosticeren van problemen in IPC-gebaseerde applicaties kan een uitdaging zijn, vooral wanneer er communicatiestoringen, synchronisatiefouten of racecondities optreden. Deze problemen zijn vaak niet-deterministisch en moeilijk te reproduceren.
  • Bronconflict. Regelmatige communicatie of onjuist beheer van middelen kan leiden tot conflicten over CPU, geheugen, of I / O bronnen, wat de algehele systeemprestaties en -responsiviteit kan verslechteren.

IPC-beveiliging en synchronisatie

ipc-beveiliging en synchronisatie

In IPC zijn beveiliging en synchronisatie cruciaal voor het behoud van de systeemintegriteit en betrouwbare werking. Beveiliging zorgt ervoor dat alleen geautoriseerde processen toegang hebben tot gegevens of deze kunnen uitwisselen via IPC-kanalen, waardoor datalekken, ongeautoriseerde controle of interferentie door kwaadaardige processen worden voorkomen. Synchronisatie coördineert daarentegen de uitvoering van processen die resources of gegevens delen om conflicten zoals racecondities en deadlocks te voorkomen. Samen zorgen deze controles ervoor dat IPC veilig, consistent en efficiënt functioneert.

IPC-beveiligingsoverwegingen

Hieronder volgen de belangrijkste IPC-beveiligingsaspecten:

  • Toegangscontrole. Het beperken van welke processen toegang hebben tot IPC-mechanismen, zoals berichtenwachtrijen, gedeeld geheugen of named pipes, is cruciaal. Zonder adequate toegangscontrole kunnen ongeautoriseerde processen gegevens lezen, schrijven of verstoren, wat leidt tot beveiligingsproblemen. inbreuken of systeeminstabiliteit.
  • authenticatie en autorisatie. Processen die via IPC communiceren, moeten worden geauthenticeerd om hun legitiemheid te garanderen. Autorisatieregels bepalen welke acties elk proces mag uitvoeren (bijvoorbeeld alleen-lezen versus lees-/schrijftoegang), waardoor het risico op privilege-escalatie of misbruik wordt verkleind.
  • Data-integriteit. Om manipulatie of corruptie te voorkomen, moeten IPC-kanalen ervoor zorgen dat de gegevens tijdens de transmissie ongewijzigd blijven. Dit kan worden ondersteund door checksums, digitale handtekeningen, of cryptografisch hashes, vooral in gedistribueerde systemen of via onveilige netwerken.
  • Vertrouwelijkheid. Gevoelige gegevens die tussen processen worden verzonden, moeten worden beschermd tegen afluisteren. In gedistribueerde IPC houdt dit vaak in versleutelen Gegevens onderweg met behulp van veilige protocollen (bijv. TLS). Voor lokale IPC moeten beveiligingen op OS-niveau ongeautoriseerde toegang tot het geheugen voorkomen.
  • Isolatie van hulpbronnen. Gedeelde IPC-bronnen zoals geheugen of wachtrijen moeten worden geïsoleerd om te voorkomen dat één proces ze uitput of monopoliseert, wat mogelijk denial-of-service (DoS) voor andere processen veroorzaakt. Quota's en resourcelimieten helpen dit risico te beperken.
  • Exploits van raceomstandigheden. Slecht gesynchroniseerde toegang tot gedeelde bronnen kan leiden tot race-omstandigheden, die aanvallers kunnen misbruiken om willekeurige code uit te voeren of verhoogde rechten te verkrijgen. Een veilig IPC-ontwerp moet voorzien zijn van de juiste vergrendelings- en synchronisatiemechanismen.
  • Audit en logging. Het monitoren van IPC-activiteiten via logs helpt bij het detecteren van verdacht gedrag, ongeautoriseerde toegangspogingen of verkeerde configuraties. Audit trails helpen bij forensisch onderzoek en de naleving van beveiligingsnormen.
  • Invoervalidatie. Processen moeten alle via IPC-kanalen ontvangen gegevens valideren om injectieaanvallen, bufferoverlopen en andere exploits die voortvloeien uit misvormde of schadelijke invoer te voorkomen.

IPC-synchronisatietechnieken

Dit zijn de belangrijkste IPC-synchronisatietechnieken:

  • Atomaire operaties. Atomaire bewerkingen zorgen ervoor dat een specifieke geheugenbewerking (zoals het verhogen van een teller) zonder onderbreking wordt voltooid. Deze worden vaak gebruikt in lock-vrije datastructuren en gelijktijdigheidscontrole zonder de overhead van volledige synchronisatieprimitieven.
  • Semaforen. Semaforen zijn synchronisatieprimitieven op basis van gehele getallen die gebruikt worden om de toegang tot gedeelde bronnen te beheren. Een binaire semafoor (ook wel mutex genoemd) geeft slechts één proces tegelijk toegang tot een bron, terwijl een tellende semafoor meerdere instanties van een bron kan beheren. Semaforen voorkomen racecondities en worden vaak gebruikt in systemen met gedeeld geheugen.
  • Mutexen (wederzijdse uitsluitingssloten). Mutexen staan ​​slechts één proces tegelijk toe om een ​​kritieke sectie code te betreden. Een proces moet de mutex vergrendelen vóór het betreden van de kritieke sectie en deze daarna ontgrendelen. Dit voorkomt gelijktijdige toegang tot gedeelde data en garandeert dataconsistentie. In tegenstelling tot semaforen zijn mutexen doorgaans eigendom van de thread die ze vergrendelt.
  • Monitoren. Monitors zijn synchronisatieconstructies op hoog niveau die wederzijdse uitsluiting en voorwaardelijke variabelen combineren. Een monitor laat slechts één proces tegelijk uitvoeren, terwijl voorwaardelijke variabelen processen in staat stellen te wachten (slapen) en een melding te ontvangen (wekken) wanneer aan bepaalde voorwaarden is voldaan. Ze vereenvoudigen complexe synchronisatielogica.
  • Voorwaardelijke variabelen. Voorwaardelijke variabelen werken samen met mutexen om een ​​proces te blokkeren totdat aan een specifieke voorwaarde is voldaan. Zo kan het ene proces wachten tot een buffer niet meer leeg is, terwijl een ander proces de voorwaarde signaleert zodra er gegevens worden weggeschreven. Voorwaardelijke variabelen ondersteunen een nauwkeurige controle over synchronisatie.
  • Belemmeringen. Barrières synchroniseren een groep processen of threads door ze allemaal te laten wachten tot ze een bepaald punt in de uitvoering hebben bereikt. Pas wanneer alle deelnemende processen de barrière hebben bereikt, kunnen ze verdergaan. Dit is handig bij parallel computing, waarbij taken in vaste fasen moeten worden gesynchroniseerd.
  • Spinlocks. Spinlocks zijn low-level lockingmechanismen waarbij een proces herhaaldelijk controleert (spint) totdat een lock beschikbaar is. Ze vermijden contextwisseling, maar kunnen CPU-cycli verspillen, waardoor ze alleen geschikt zijn voor korte, snelle bewerkingen in multicoresystemen.
  • Lees-/schrijfvergrendelingen. Lees-schrijfvergrendelingen stellen meerdere processen in staat om een ​​gedeelde resource tegelijkertijd te lezen, maar bieden exclusieve toegang tijdens het schrijven. Dit verbetert de gelijktijdigheid in scenario's waarin leesbewerkingen frequenter zijn dan schrijfbewerkingen.

Anastasia
Spasojević
Anastazija is een ervaren contentschrijver met kennis en passie voor cloud computergebruik, informatietechnologie en onlinebeveiliging. Bij phoenixNAP, richt ze zich op het beantwoorden van brandende vragen over het waarborgen van de robuustheid en veiligheid van gegevens voor alle deelnemers aan het digitale landschap.