This is the first kernel ive written, and id like to get some information from experienced coders here

Its actually two questions; Firstly, I want to group Interrupts into groups. Secondly, I want to get rid of Remote Procedure Calls (RPC), or atleast understand -why- you would need them.
From my understanding, there is only two real separate concepts (The Von Neumann Architecture?), and thats memory and processing.
Because hardware can not block, and so inform a request call that its finished, it uses interrupts, is that right?
So surely an Interrupt's role is either to inform you that a function has completed (processing), or data that was requested is ready or streaming (memory).
e.g.
Keyboard Interrupt - I have data ready for you.
Clock Interrupt - You asked me to wait x seconds, I've finished waiting. - Even with scheduling it can be seen like this. (Wait x seconds, but while i wait run this process).
However, as i have not written drivers before, Im not sure if all hardware can be grouped like this.
If it can be then I can build special buffers in the kernel to handle hardware "memory" interrupts, and when the driver is ready to read more data, just reads from the buffers.
As for "processing" interrupts, Sync and Async would be specific to hardware the driver is for, The interrupt would basically just be forwarded to the app. Either the app is in a wait state (sync) for this interrupt or it'll a stub function thats called (async).
As for question two, I am writing my kernel and operating system in a client-server way and specifically MVC. Basically, The idea is that data is shared and synchronised between processes only. All function's are run locally to the process (client). There is no such thing as asking another process to execute a function. Can anyone give me examples where you -may- require RPC or need to execute a function in another process?
This last bit is pretty important as one of my main goals is for apps to not be aware of any other processes running.
Thanx for your time!
Mike Brown