计算机的五大组成部分:控制器、运算器(arithmetic and logic unit,算术逻辑单元)、存储器(包含内存和硬盘)、输入和输出设备。三大核心组件:CPU、内存和硬盘。
1. 进程和线程
1.1 进程是资源分配的最小单位,而线程是CPU调度的最小单位;
1.2 一个进程可以有多个线程,而线程只能属于一个进程;
1.3 进程创建、销毁以及进程间切换比线程的创建、销毁和切换有更大的开销;进程的切换,页表目录和虚拟内存空间都需要更换,而且缓存的地址转换结果都会失效。但线程的切换,不需要更换页表目录和虚拟内存空间,因为它们属于同一个进程,共享进程的资源。线程的切换仅仅需要保存程序计数器和寄存器相关的内容。
1.4 因为同一进程的所有线程共享该进程的资源,所以线程间通信较为简单:常用的方式有锁机制、volatile修饰的变量、wait/notify的使用;而进程间通信(Inter-Process Communication)较为复杂,常用的方式有:管道、消息队列、共享内存、本地套接字、信号量(互斥同步的一种手段)。
1.4.1 管道:百度百科以及一些博客说管道是半双工的,但只能在一个方向上传递消息。我们都知道,单工是只能在一个方向传递消息,半双工不能同时双向传输,但是可以错开地在两个方向传输数据。所以管道到底是单工还是半双工的呢?管道只能在一个方向传递消息是指某个时刻只能在一个方向传递消息吗?
1.4.2 消息队列:存放在内核中,可以传递较大的数据量。
1.4.3 共享内存:由一个进程创建的一段能被其它进程所访问的内存,是进程间通信最快的一种方式。
1.4.4 本地套接字:类似于网络套接字的一种通信方式。
1.4.5 信号量:不以传输数据为目的,主要是保护共享资源,使进程间互斥。工作原理:主要是进行P、V操作,然后信号量初始值为1。进行P操作时,判断信号量的值是否大于0,如果大于0,进程可正常操作并将信号量的值减1;如果信号量的值为0,当前进程则挂起。进行V操作时,判断是否有进程被挂起,如果有,那么唤醒一个进程;如果没有,将信号量加1。
2. 存储器
2.1 存储器包含三部分:寄存器、主存储器(也就是内存)和外存(也就是硬盘这一类)。
2.2 虚拟内存:使得不同进程在运行时,它所看到的是自己独占当前系统的4G内存,在进程初始化或者需要分配空间时,仅仅建立虚拟内存和磁盘之间的映射,等到运行至对应程序、访问数据时,才触发缺页中断,将数据载入内存中。优点:①扩大了内存空间;②程序需要大块的连续空间时,只需要在虚拟内存中分配空间,不需要物理内存具有大块的连续空间,可以利用碎片。③避免了多个进程同时对物理内存资源的竞争,因为每个进程访问数据时才会将数据载入内存,占用的内存大小远小于直接在物理内存申请内存。缺点:虚拟内存和物理内存的映射所涉及的管理操作较为复杂、耗时。
2.3 虚拟内存和物理内存的映射:通过页表(映射表)实现。虚拟内存地址是虚拟页号和物理地址偏移量,虚拟页号可以根据页表得到物理页号,然后再根据物理地址偏移量,完成了虚拟地址和物理地址的映射。多级页表:假如虚拟页号需要20bit来存储,通过数组来映射,比如数组的第一个元素是虚拟页号的20bit最小值所对应的物理页号,然后物理页号需要4个字节来存储,那么需要2的20次方大小的、元素为4字节的数组,所需空间是4MB,假如运行着几十上百的程序,那么页表就占用了几百兆甚至GB的内存。所以通过多级映射,比如20bit分为5段,每段是4bit,前面4段保留的地址都是索引地址,只有最后一段的地址才是真正的物理页号,那么所需空间大小是5个2的4次方大小、元素为4字节的数组,所需空间仅仅是320个字节,空间缩小了上千倍。
2.4 地址变换高速缓冲(Translation-Lookaside Buffer, TLB): 因为多级页表需要多次内存操作,但是内存映射是频繁操作,所以可以通过缓存之前的地址转换结果来减少内存访问。
3. 中断的处理过程
3.1 中断请求:分为内部中断(CPU内部直接处理)和外部中断(通过CPU中断输入引脚输入中断请求信号,分为可屏蔽中断请求和不可屏蔽中断请求)。
3.2 中断判优:CPU找出中断优先级最高的中断源。
3.3 中断响应:①保护硬件现场;②关闭中断;③保护断点;④得到中断服务程序的入口地址。
3.4 中断处理:①保护现场:将寄存器数据压入堆栈;②开启中断:接收更高优先级的中断;③中断服务:执行具体的操作;④恢复现场:将堆栈信息重新放置寄存器中;⑤中断返回。
3.5 中断返回:返回原程序的断点处,恢复硬件现场,执行原程序。
个人理解:中断响应的保护硬件现场是对硬件层面的保护,而中断处理的保护现场是对数据的保护。
4. 同步与异步以及和阻塞、非阻塞的区别和关系
4.1 同步是指一次操作所有步骤结束再继续下一步。而异步指一次操作中某些步骤结束就执行另一个操作,不需要等待其它步骤完成。
4.2 阻塞指某些操作等待当前操作的结束而陷入阻塞状态;非阻塞就是其它操作虽然也要等待当前操作结束,但是他们可以执行其它任务,过会再来查询前面那个操作是否结束。
4.3 同步、异步和阻塞、非阻塞的关系:同步、异步是一种操作、过程;而阻塞、非阻塞是一种状态。
4.4 多路IO复用的三种方式select、poll、epoll:①select:支持的最大连接数是1024或2048,每次都遍历由fd(Linux对文件的操作通过文件描述符,file descriptor)组成的fd_set,判断相应的fd是否就绪,如果就绪则通知程序中断处理;②poll本质上和select没有区别,都是遍历fd。在遍历fd时,如果就绪则加入等待队列,如果遍历完没有发现就绪的fd,则挂起当前进程,直到主动超时,超时后再次遍历fd;基于链表储存,没有最大连接数的限制;③epoll主要通过回调机制,当fd就绪时,就会执行相应的回调程序。