10 3 7分成5分的油
CPU Load
简单来说就是系统整体的进程数/单核CPU所能处理的最大进程数。链接
跟使用率还有一些区别:链接
Linux 常用命令
三剑客——awk、sed、grep
在awk的文本处理规则里,awk将文本文件视为由字段和记录组成的文本数据库。默认情况下,awk将每一行视为一个记录,也就是说记录的分隔符是\n,记录的分隔符可以通过内置变量RS更改。
在每一个记录中,又把记录分为若干个字段,即记录由字段组成,而字段的默认分隔符为空格或制表符。
ls 显示文件或目录
-l 列出文件详细信息l(list)
-a 列出当前目录下所有文件及目录,包括隐藏的a(all)
mkdir 创建目录
-p 创建目录,若无父目录,则创建p(parent)
cd 切换目录
touch 创建空文件
echo 创建带有内容的文件。
cat 查看文件内容
cp 拷贝
mv 移动或重命名
rm 删除文件
-r 递归删除,可删除子目录及文件
-f 强制删除
find 在文件系统中搜索某文件
wc 统计文本中行数、字数、字符数
grep 在文本文件中查找某个字符串
rmdir 删除空目录
tree 树形结构显示目录,需要安装tree包
pwd 显示当前目录
ln 创建链接文件
more、less 分页显示文本文件内容
head、tail 显示文件头、尾内容
stat 显示指定文件的详细信息,比ls更详细
who 显示在线登陆用户
whoami 显示当前操作用户
hostname 显示主机名
uname 显示系统信息
top 动态显示当前耗费资源最多进程信息
ps 显示瞬间进程状态 ps -aux
du 查看目录大小 du -h /home带有单位显示目录信息
df 查看磁盘大小 df -h 带有单位显示磁盘信息
ifconfig 查看网络情况
ping 测试网络连通
netstat 显示网络状态信息
man 命令不会用了,找男人 如:man ls
clear 清屏
alias 对命令重命名 如:alias showmeit="ps -aux" ,另外解除使用unaliax showmeit
kill 杀死进程,可以先用ps 或 top命令查看进程的id,然后再用kill命令杀死进程。
//管道
将一个命令的标准输出作为另一个命令的标准输入。
也就是把几个命令组合起来使用,后一个命令对前一个命令的结果进行操作。
例:grep -r "close" /home/* | more
//在home目录下所有文件中查找,包括close的文件,并分页输出。
chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符。
777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其它用户的权限,7=4+2+1,在linux中权限是可以通过数字来描述的。具体表示如下:
分布式事务
相关面试题:链接
快速排序的优化
Sleep状态
sleep不占用系统资源,它会把cpu的控制权交换给内核,内核会再schedule到另一个进程。
LFU算法
最不经常使用(LFU)缓存算法,其实就是按照频率来进行继续排序。
解题思路:
unordered_map+set实现,set用来进行频率的自排序,unordered_map是实现节点的映射。
代码展示:
struct cachenode{
int key;
int value;
int freq;
long tick;
//括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改!
bool operator <(const cachenode& rhs) const
{
if(freq<rhs.freq) return true;
if(freq==rhs.freq) return tick<rhs.tick;
return false;
}
};
class LFUCache {
private:
long tick_;//时钟
int capasize_;//map大小
unordered_map<int,cachenode> mp;
set<cachenode> cache_;
public:
LFUCache(int capacity) {
capasize_=capacity;
tick_=0;
}
int get(int key) {
auto it=mp.find(key);
if(it==mp.end())
return -1;
int value=it->second.value;
touch(it->second);//删除该节点->修改该节点->重新插入该节点
return value;
}
void put(int key, int value) {
if(capasize_==0) return;
auto it=mp.find(key);
if(it!=mp.end())
{
it->second.value=value;
touch(it->second);
return;
}
if(mp.size()==capasize_)
{
const cachenode& node=*cache_.begin();//set自动排序,头部是频率最低的节点
mp.erase(node.key);
cache_.erase(node);
}
cachenode node{key,value,1,++tick_};
mp[node.key]=node;
cache_.insert(node);
}
void touch(cachenode& node)//这里要采用引用
{
cache_.erase(node);
++node.freq;
node.tick=++tick_;
cache_.insert(node);
}
};