10大基础实用算法及其讲解
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。
在平均状况下,排序 n 个项目要Ο(n log n)次比较。
在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。
事实上,快速排序通常明显比其他 Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
从数列中挑出一个元素,称为 “基准”(pivot)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。
虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最 ...
Unix/Linux 网络 IO 模型简介
概述Linux内核将所有外部设备都看做一个文件来操作。对该文件的读写操作会调用内核提供的系统命令, 返回一个 fd(file descriptor) 文件描述符。而对一个 socket 的读写也有相应的描述符即 socketfd。 描述符即一串数字,指向内核中的一个结构体 Unix、Linux 提供五种 i/o 模型,分别如下:
阻塞i/o模型最常用的 I/O 模型就是阻塞 I/O 模型。缺省情况下,所有文件操作都是阻塞的。我们以套接字接口为例讲解此模型:在进程空间中调用 recvfrom,其系统调用直到数据包到达被复制到应用进程中的缓冲区中或者发生错误时才返回。在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的。 流程如下图:
非阻塞 i/o 模型recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个 EWOULDBLOCK 错误,一般都对非阻塞 I/O 模型进行轮询检查这个状态,看内核是否有数据到来,流程如下图:
I/O 复用模型linux 提供 ...
LVS的十种调度算法
静态调度:RR(Round Robin):轮询调度,轮叫调度;轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从 1 开始,直到 N (内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
WRR(Weighted Round Robin ):加权轮询由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求,然后根据其权重进行轮询。
SH(Source Hashing):源地址散列其能够实现 session sticy,源 IP 地址 hash,将来自于同一个 IP 地址的请求始终发往第一次挑中的 RS,从而实现会话绑定。 源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散 ...
HTTP状态码大全
如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在检测工具抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求。 一些常见的状态代码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务器暂时不可用 以下提供了 HTTP 状态代码的完整列表。
1xx(临时响应用于表示临时响应并需要请求者执行操作才能继续的状态代码。
代码
说明
100(继续)
请求者应继续进行请求。服务器返回此代码以表示,服务器已收到某项请求的第一部分,正等待接收剩余部分。
101(切换协议)
请求者已要求服务器切换协议,服务器已确认并准备进行切换。
2xx(成功用于表示服务器已成功处理相应请求的状态代码。
代码
说明
200(成功)
服务器成功处理了相应请求。通常,这表示服务器已提供了请求的网页。如果您的 robots.txt 文件显示为此状态,则表示 检测工具 已成功检索到该文件。
201(已创建)
请求成功且服务器已创建了新的资源。
202(已接受)
服务器已接受相应请求,但尚未对 ...
Linux查询被占用文件
fuser:由文件找出占用该文件的程序有的时候我想要知道我的程序到底在这次启动过程中开启了多少文件,可以利用 fuser 来观察!
举例来说,你如果卸载时发现系统通知:『 device is busy 』,那表示这个文件系统正在忙碌中, 表示有某支程序正在使用该文件系统!那么你就可以利用 fuser 来追踪。
fuser [-umv] [-k [i] [-signal]] file/dir
常用选项:
-u :除了程序的 PID 之外,同时列出该程序的拥有者;
-m :后面接的那个文件名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
-v :可以列出每个文件与程序还有命令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9) !
范例:找出目前所在目录的使用 PID/所属帐号/权限
fuser ...
Linux特殊程序与文件
具有 SUID/SGID 权限的程序SUID的权限其实与程序的相关性非常的大!
SUID 权限仅对二进位程序(binary program)有效;
运行者对于该程序需要具有 x 的可运行权限;
本权限仅在运行该程序的过程中有效 (run-time);
运行者将具有该程序拥有者 (owner) 的权限。
所以说,整个 SUID 的权限会生效是由于『具有该权限的程序被触发』,而我们知道一个程序被触发会变成程序。
所以,运行者可以具有程序拥有者的权限就是在该程序变成程序的那个时候!
为啥运行了 passwd 后你就具有 root 的权限呢?不都是一般使用者运行的吗? 这是因为你在触发 passwd 后,会取得一个新的程序与 PID,该 PID 产生时通过 SUID 来给予该 PID 特殊的权限配置!
passwd
Changing password for user zhang.Changing password for zhang.(current) UNIX password: [1]+ Stopped passwd
pstree -u
...
Linux后台工作管理
当我们登陆系统取得 bash shell 之后,可以在单一终端机介面下同时进行多个工作的行为管理,进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash ! 当我们处于一个终端,在可以出现提示字节让你操作的环境就称为前台 (foreground),至于其他工作就可以让你放入后台 (background) 去暂停或运行。
要注意的是,放入后台的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在后台里面运行 (running) 的!因为你没有输入数据他就不会跑! 而且放入后台的工作是不可以使用 [ctrl]+c 来终止的』! 总之,要进行 bash 的 job control 必须要注意到的限制是:
这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己的 bash);
前台:你可以控制与下达命令的这个环境称为前台的工作 (foreground);
后台:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 ...
系统资源查看
free:内存使用情况free 选项
常用选项:
-b:以字节为单位 显示 内存总和。
-k:缺省的) 以 KB 为单位 显示。
-m:以 MB 为单位。
-t :显示 一个 总计行。
-h:易读模式显示单位。
-o: 禁止 “buffer adjusted” 行的显示. 除非 指定 free 从 (相应的) 已用/未用的 内存 减去/加上 缓 冲区内存。
free -m
total used free shared buffers cachedMem: 1861 475 1386 0 56 241-/+ buffers/cache: 176 1685Swap: 2047 0 2047
Mem:显示的是实体内存的量。
Swap:是虚拟内存的量。
total :总量。
used:已被使用的量。
free:则是剩余可用的量。
shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及缓存的量。
Swap 的效能跟实体内存实在差很多,而系统会使用到 swap ...
Linux进程优先级
我们知道 Linux 是多人多工的环境,由 top 的输出结果我们也发现, 系统同时间有非常多的程序在运行中,只是绝大部分的程序都在休眠 (sleeping) 状态而已。 如果所有的程序同时被唤醒,那么 CPU 应该要先处理那个程序呢?也就是说,哪个程序被运行的优先序比较高? 这就得要考虑到程序的优先运行序 (Priority) 与 CPU 排程!
Priority 与 Nice 值 CPU 一秒钟可以运行多达数 G 的微命令次数,通过核心的 CPU 排程可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 运行部分的命令码。
如果程序都是集中在一个队列中等待 CPU 的运行, 那么为了区分不同程序的优先顺序,我们 Linux 给予程序一个所谓的『优先运行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。
不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现?
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN ...
Linux定时任务
Linux 任务调度种类: 单一任务:at命令,仅执行一次,必须要有atd服务支持。 循环任务:crontab命令,定时循环。
单一任务使用单一任务调度时,必须要有atd这个调度服务的支持。不过有的系统未默认开启此服务,可能需要我们手动启用。
centos 7:
systemctl start atd //启动systemctl enable atd //开机自启动
centos 6:
atd start //启动chkconfig atd on //开机自启动
at的运作方式:使用at命令生成所需运行的工作,并将这个工作以文本文件的方式写入**/var/spool/at/**目录内,该工作才能被atd服务调取并执行。
at 和 batch 从标准输入或一个指定的文件读取命令,这些命令在以后 某个时间用 /bin/sh 执行。
at的使用限制管理:
/etc/at.allow:白名单,只有此名单内用户可以使用at。
/etc/at.deny:黑名单,此名单内用 ...