读书摘要

花了一晚上的时间读了几章,挑一些印象深刻的写下来mark下。

单内核和微内核

单内核:内核是一个大过程,同时运行在一个单独的地址空间。因此,这样的内核通常以单个静态二进制文件的形式存放于磁盘(如果装过Ubuntu这种玩过,通常也能看到内核是一个文件)。因为整个系统是一个统一的内核,所以其内部调用效率很高。缺点各模块之间的界限并不特别清晰,模块间的调用比较容易,不太容易维护。

书上说 Linux是单内核,但是因为设计的非常好,模块化依然非常清晰。

微内核:微内核的功能被划分为独立的过程,每个过程叫做一个服务器。所有的服务器都保持独立并运行在各自的地址空间。因此,就不可能像单模块内核那样直接调用 函数,而是通过消息传递处理微内核通信。优点就是服务之间不会互相影响,缺点就是性能没有单内核都高。

内核中没有标准C库,比如没有printf,只有printk

进程

vfork和fork

vfork 不会复制父进程的页,但父进程阻塞,直到子进程退出或者exec()(子进程进入自己的新空间),子进程不能写父进程内存空间。但这样效率不是特别高。

fork 会复制父进程的页,内核会有意让子进程(非保证的)先执行,但是 linux现在有写时复制机制,所以区别不大。

写时复制是指父子进程在写共享的空间的时候,如果谁要写,发现这个共享区还有其他进程占用,就会自己复制一份。所以这也是为什么内核要有意让子进程先运行,因为子进程往往是执行exec函数,可以避免父进程先执行导致的写时复制的开销。

进程和线程

进程:用task_struct保存,保存在内核栈尾端,用汇编计算它都位置非常容易,根据不同CPU有做汇编优化,x86仅需要指针就可以计算出来,不需要用寄存器。

线程:从内核角度看,Linux是没有线程这个概念的。Linux内核没有专门表征线程都数据结构,实际上也是把线程当进程来实现的。线程的创建和进程类似,只不过clone的时候使用了一些参数来表示需要共享资源。

任务调度

Linux是抢占式多任务(非抢占就是当前任务必须执行完T_T),支持内核抢占。最重要的就是优先级调度策略了,这个大学的操作系统书里面都有讲。

系统调用

用户空间访问系统空间都接口,提供机制而不是策略,系统调用是有一张表的,可以自己去修改表,增加系统调用,系统调用的id也不允许重复使用,即使卸载了,这个Id也不会回收利用。内核提供系统调用,所以可以控制应用程序的访问资源权限。

中断

中断程序分为上下两部分,上半部分做一些响应实时性都操作,下半部分做一些实际耗时都处理性操作。下半部有软中断、tasklet和工作队列三种机制。

中断上下文是指当执行一个中断处理程序或下半部,内核处于中断上下文。中断上下文和进程上下文是有区别的,它没有current宏关联当前进程。进程上下文是以进程上下文的形式链接到内核中都,所以进程上下文是可以睡眠、调用调度程序。中断上下文是不可以睡眠的。

自旋锁和信号量

自旋锁是一种轮询锁(轮询标记位),不会引起进程睡眠,不能递归调用。优点是效率高,适合短时间等待的场景。
信号量会引起进程睡眠,适合长时间(相对)等待的场景

中断上下文中是不能睡眠的,所以只能使用自旋锁。
KVM和Docker

KVM是基于硬件的虚拟化,虚拟化分为全虚拟化(软件/硬件辅助的虚拟化),半虚拟化。
Docker则是基于操作系统级的,基于Linux Namespace实现的(太深入的就不懂了@_@)。

你可能感兴趣的:(读书摘要)