No I am not mixing the two, all I am saying is that when all the blocks have been written to, the most the GC will collect aggressively is upto the reserve (or as the technical term Over-provisioned space). This is not backed by anything other than an aggressive discussion about it at work.
You really have to understand that an SSD does not behave in any way or form to a HDD, it reads in 4KB pages but writes in 512KB blocks. You also have to understand that an SSD has an utterly random mapping of LBA blocks to SSD Pages (which only makes sense to the controller).
To understand why this is so important you have to realise the limitations of the garbage collection system in that it can only "Free" blocks which it thinks have no data. You have to understand that there are multiple mechanisms in place in an SSD to even out the wear of the NAND cells in it.
Take for example a rather simple SSD with 4 Blocks:
Block A - Block B - Block C - Block D
When we write a file, it ends up on Block-A, now the wear algorithm kicks in, rather than writing to Block-A, it now writes to block B, if we update the file again, it ends up on Block C, we keep updating it up until it ends up where it started again.
So it goes like this: A->B->C->D->A
Garbage collection during write or Idle time, marks the blocks B,C,D as free rather than used, thats all GC does.
This gets more messed up when you realise that the SSD reports block sizes as 4KB, but remember we read 4KB write 512KB!
File system do not tell the SATA controller that blocks have become free instead they update meta-data information. The only thing the controller sees are READ and WRITE commands, thats all it sees, it cant work out if that data means its a deletion or modification and this is critically important.
So lets say that we have a file that chews up Three blocks!, A,B,C
We delete the file on our file system, we have to modify data block A (because thats where teh FS meta-data is), so the controller copies the A modifies it, and moves it to D, the garbage collector marks A free.
So to the controller, sees the following as used: B,C,D
The file system sees the following as used: A
So we have this extra data just sitting there, Garbage collector has no idea about the data in B or C.
This means any time we update a small section of this block lets say B, the data in B is read in, modified and written back out. This is why TRIM is needed, the file system says HEY block B and C are no longer needed.
Over-provisioning, so far our little SSD only has 4 Blocks, but hey lets say we had 20% hidden space that means there is one whole block sitting there "E" which the filesystem doesnt see.
Remember the file system sees the SSD as a series of sequential logical block addresses, but the controller remaps the LBA addresses to SSD pages which can be any where (this is why you can move data to another block while keeping the LBA address the same!)
So lets say We have all our four blocks full:
A,B,C,D (E is empty)
We modify data in Block A, but rather than copy the data back out to A, we instead write it to E, the GC then marks A free.
So Used: B,C,D,E
Free : A - Now is reserved
So why did I say the GC is more to do with the over-provisioned space, well it was because we (me and my co-workers) hypothised that the GC can only really aggressively mark free blocks that are duplicated on the provisioned space.
So now with over-provisioning and GC (but no TRIM)
If we delete a file that uses B and C blocks (again the FS might just flip a bit to mark a file as deleted, for this example I'll say its in the B block)
Before :
Used: B,C,D,E Free: A
After:
Used: C,D,E,A Free: B
This is what the SSD sees, so lets say you overwrite some of the data in C
The Controller cant tell where your files end and begin, because it only see READ, WRITE commands, it has no understanding of files.
So the controller will read all the data in C, and write to B, Freeing C
Now: D,E,A,B Free: C
So we have a disconnect as to what the File System sees as free and what the SSD sees as free, this is exactly what TRIM fixes.
It has been said in several respectable benchmarks, that TRIM keeps your SSD Happy, because the OS can tell the Controller directly whats free.
TRIM (http://en.wikipedia.org/wiki/TRIM) is also critical for keeping your SSD healthy, as it helps with the even-wear levelling.
All these, GC, and Compression try to reduce Write Amplification (http://en.wikipedia.org/wiki/Write_amplification)
This gets worse as more and more blocks on the SSD are used.
Now I bought a SandForce based SSD, because I knew they tolerated being run with out TRIM and after while only suffered at most a 25% penalty for it, it doesnt mean they are immune they will degrade and they will degrade faster with out.
On windows they can keep the performance up as if they were new with no problems, this is because of TRIM.
So yeah its not entirely necessary, if you want to shorten the life-span of the drive, and loose upto 25% of your performance.
Zeroing is never a good thing, because you wear out your writes, remember you only have a limited number of writes on your SSD (new MLC NANDs have about 6000 writes before they go pop), so if you Zero your whole drive you just wasted one whole write cycle.
And if you think I am crazy, please read http://www.anandtech.com/show/2738/10
http://www.anandtech.com/show/3681/oczs-vertex-2-special-sauce-sf1200-reviewed (yes its SF1200, but pretty much all of it applies to SF2 drives)
Any case, TRIM should not decrease the performance of your drive, my guess Apple has special timings on their SSD (because they have been benchmarked to be slower than other drives).
So I have no idea what Apple does on their TRIM implementation I did find this though : http://www.hardmac.com/news/2011/03/05/about-trim-on-mac-os-x
So it might be just a feature you get from only using Apple SSD's which is unfair especially for us consumers, given that its a standard SATA command, and should be supported on devices that support it.
So yeah I would be asking Apple to extend the support scope of TRIM, rather than just accepting it.