计算机网络和操作系统都是些记忆性的知识,大概总结完了,面试前对照知识点在复习一遍就好了。下一步总结java基础。
【刷题】
剑指 Offer 37 序列化二叉树
剑指 Offer 40 最小的k个数
剑指 Offer 41 数据流中的中位数
剑指 Offer 42 连续子数组的最大和

【操作系统】

  • 系统调用/用户态、内核态
  • 进程/线程/协程
  • 进程通信方式(7个)/线程同步方式(3个)
  • 进程调度算法(5个)
  • 内存管理、虚拟内存
  • 内存分页、分段、段页
  • 页面置换算法/LRU
  • 死锁条件/解决
  • 编译过程(预处理,编译,汇编,链接)
  • fork的使用与底层原理
#include<unistd.h>

pid_t fork(void);

返回值:自进程中返回0,父进程返回进程id,出错返回-1

fork()系统调用通过复制一个现有进程来创建一个全新的进程. 进程被存放在一个叫做任务队列的双向循环链表当中.链表当中的每一项进程PCB .

为什么frok成功调用后返回两个值?
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回.因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值不同.
从fork函数开始以后的代码父子共享,既父进程要执行这段代码,子进程也要执行这段代码.
Linux平台通过clone()系统调用实现fork()。

【linux】

  • linux常见指令
  • inode/block
  • 僵尸进程和孤儿进程
  • mmap内存映射/零拷贝技术
  • 5种IO模型
  • select/poll/epoll
  • LT模式和ET模式

文件管理:ls、cd、touch创建普通文件、rm删除、mkdir新建目录、mv移动、cp拷贝、chmod修改权限
进程管理:ps显示进程信息、kill杀死进程
磁盘管理:du/df
系统管理:top、free显示系统运行信息、vmstat输出各资源使用情况
网络通讯:ping、ifconfig、netstat显示网络相关信息
其他:grep

mmap是一种内存映射文件的方法,即将文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址的一一对应关系。实现这样的映射关系后,进程就可以采用指针的方式对这段内存进行读写操作,而系统会自动回写脏页面到对应的文件磁盘上。不必调用read,write等系统调用函数就可以实现文件操作。

阻塞式:应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。
非阻塞式:应用进程执行系统调用之后,内核返回一个错误码。应用进程可以继续执行,但是需要不断的执行系统调用来获知I/O 是否完成,这种方式称为轮询
IO复用:使用 select 或者 poll 等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后再使用 recvfrom 把数据从内核复制到进程中。它可以让单个进程具有处理多个 I/O 事件的能力。又被称为 Event Driven I/O,即事件驱动 I/O。
信号驱动:应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。内核在数据到达时向应用进程发送 SIGIO 信号,应用进程收到之后在信号处理程序中调用 recvfrom 将数据从内核复制到应用进程中。
异步:应用进程执行 aio_read 系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。

文件描述符:当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
select的底层是一个fd_set的数据结构,本质上是一个long类型的数组,数组中每一个元素都对应于一个文件描述符,通过轮询所有的文件描述符来检查是否有事件发生。
 poll与select差不多,但poll的文件描述符没有最大数量的限制(底层链表),但是依然采用轮询遍历的方式检查是否有事件发生。
 epoll:epoll_wait返回的就是有事件发生的文件描述符。本质上是事件驱动。具体是通过红黑树和就绪链表实现的,红黑树存储所有的文件描述符,就绪链表存储有事件发生的文件描述符;

  1. LT 模式:当 epoll_wait() 检测到描述符事件到达时,将此事件通知进程,进程可以不立即处理该事件,下次调用 epoll_wait()会再次通知进程。
  2. ET 模式:和 LT 模式不同的是,通知之后进程必须立即处理事件,下次再调用 epoll_wait() 时不会再得到事件到达的通知。