记录:
1.程序本身并不是进程,进程是处于执行期的程序以及相关的资源的总称。实际上,完全可能存在两个或多个不同的进程执行的是同一程序。并且两个或者两个以上并存的进程还可以共享许多诸如打开的文件、地址空间之类的资源。
2.Unix的进程创建:它是由两个单独的函数中去执行的,fork()和exec()。首先,fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别在于PID(每个进程唯一)、PPID(父进程的进程号,子进程将其设置为被拷贝进程的PID)和某些资源和统计量(例如,挂起的信号,它没有被继承)。exec()函数负责读取可执行文件并将其载入地址空间开始运行。把这两个函数组合起来使用跟其他系统使用的单一函数的效果相似。
3.进程调度:它是确保进程能有效工作的一个内核子系统。可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统。Linux中使用新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比。如果消耗的使用比比当前进程小,则新进程立刻投入运行,抢占当前进程。否则,将推迟其运行。
4.上下文切换,也就是从一个可执行进程切换到另一个可执行进程,有定义在kernel/sched.c中的context_switch()函数负责处理。
5.机制:需要提供什么功能;策略:怎样实现这些功能。
6.设计接口的时候要尽量为将来多做考虑。系统调用设计得越通用越好。Unix的格言:“提供机制而不是策略。”
7.内核提供了两个方法来完成必须的检查和内核空间与用户空间之间数据的来回拷贝。copy_to_user():向用户空间写入数据;copy_from_user():从用户空间读取数据。(失败,返回的都是没能完全拷贝的数据的字节数。成功,返回0)
8.使用链表存放数据的理想情况是:需要遍历所有数据或需要动态加入和删除数据时。
9.Linux中最重要的四种数据结构:链表、队列、映射和红黑树。如果你对数据集合的主要操作是遍历数据,就使用链表。如果你的代码符合生产者\消费者模式,则使用队列(fifo),特别是要一个定长的缓冲。如果你需要映射一个UID到一个对象,就使用映射(Linux的映射接口是针对UID到指针的映射它并不适合其它的场景)。如果你需要存储大量数据,并且检索迅速,那么红黑树做好(它能确保搜索时间复杂度是对数关系,也保证按序遍历时间复杂度是线性关系)。