In recent years, non-volatile memories— in particular, flash memories — have attracted considerable attention due to their high data-transfer rate and low power consumption. As the size of memory cells has been becoming smaller to increase the data storage capacity per square inch, the reading and programming noise is no longer negligible. Coding and signal processing tools can be used to mitigate the errors induced in the reading and programming cycles of non-volatile memories. In this presentation, we investigate mathematical models of the read/write process in non-volatile memories and derive the capacity of the corresponding channels. We also provide reading and programming strategies that minimize realistic cost functions associated with reading/programming errors.