操作系统 复习

1 select,poll和epoll

其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了.

这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornado使用的就是epoll的.

基本上select有3个缺点:

  1. 连接数受限
  2. 查找配对速度慢
  3. 数据由内核拷贝到用户态

poll改善了第一个缺点

epoll改了三个缺点.

select模型:

说的通俗一点就是各个客户端连接的文件描述符也就是套接字,都被放到了一个集合中,调用select函数之后会一直监视这些文件描述符中有哪些可读,如果有可读的描述符那么我们的工作进程就去读取资源。PHP 中有内置的函数来完成 select 系统调用

poll模型:

poll 和 select 的实现非常类似,本质上的区别就是存放 fd 集合的数据结构不一样。select 在一个进程内可以维持最多 1024 个连接,poll 在此基础上做了加强,可以维持任意数量的连接。

但 select 和 poll 方式有一个很大的问题就是,我们不难看出来 select 是通过轮训的方式来查找是否可读或者可写,打个比方,如果同时有100万个连接都没有断开,而只有一个客户端发送了数据,所以这里它还是需要循环这么多次,造成资源浪费

epoll模型: 

epoll 是 select 和 poll 的增强版,epoll 同 poll 一样,文件描述符数量无限制。

epoll是基于内核的反射机制,在有活跃的 socket 时,系统会调用我们提前设置的回调函数。而 poll 和 select 都是遍历。

但是也并不是所有情况下 epoll 都比 select/poll 好,比如在如下场景:

在大多数客户端都很活跃的情况下,系统会把所有的回调函数都唤醒,所以会导致负载较高。既然要处理这么多的连接,那倒不如 select 遍历简单有效。

epoll在底层实现了自己的高速缓存区,并且建立了一个红黑树用于存放socket,另外维护了一个链表用来存放准备就绪的事件。

工作过程: 

  执行epoll_create时,创建了红黑树和就绪链表,执行epoll_ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据。执行epoll_wait时立刻返回准备就绪链表里的数据即可。

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,而epoll只要一次拷贝。

(1)大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。  

(2)与select一样,poll返回后,需要轮询pollfd来获取就绪的描述符

2 调度算法

  1. 先来先服务
  2. 短作业优先
  3. 最高优先权调度
  4. 时间片轮转
  5. 多级反馈队列调度

实时调度算法:

  1. 最早截至时间优先 EDF
  2. 最低松弛度优先 LLF

3.一些常考命令

lsof: list open file 

可以列出被进程所打开的文件的信息。被打开的文件可以是

1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链接

8.底层的socket字流,网络socket,unix域名socket

9.在linux里面,大部分的东西都是被当做文件的…..还有其他很多

腾讯面试考过:

1)  列出某个程序所打开的文件信息

lsof -c mysql

2). 列出所有的网络连接

lsof -i

3).列出谁在使用某个端口

lsof -i :3306

4). 查看谁正在使用某个文件

lsof   /filepath/file

2.查看文件中是否包含某些特定字符串

find和grep

grep命令是一种强大的文本搜索工具,grep搜索内容串可以是正则表达式,允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。

find通常用来再特定的目录下搜索符合条件的文件,也可以用来搜索特定用户属主的文件。

1) grep "xxx" -Rln /pwd

查找pwd目录中包含"xxx"的文件

2) find .|xargs grep -ri "IBM" -l 

3) find . -name *.py* -exec grep "clientSocket" {} \+

查看进程树

ps axjf

Linux 系统 中的 所有 进程 最初 都 来自 init, 它是 所有 进程 的 源头, 其 PID 总 为 1。

ps auxf

free -h

内存状态

df -h

系统磁盘使用情况

猜你喜欢

转载自blog.csdn.net/u011510825/article/details/92377361