Java面试知识点总结-Linux系统及指令
linux系统
CPU利用率和负载
CPU 利用率显示的是程序在运行期间实时占用的 CPU 百分比;CPU 使用率反映的是当前 CPU 的繁忙程度,忽高忽低的原因在于占用 CPU 处理时间的进程可能处于 IO 等待状态但却还未释放进入 wait 。
CPU 负载是指某段时间内占用 CPU 时间的进程和等待 CPU 时间的进程数,这里等待 CPU 时间的进程是指等待被唤醒的进程,不包括处于 wait 状态进程。负载越小越好。
CPU 利用率高,并不意味着 CPU 的负载大。两者之间没有必然的关系。无论 CPU 的利用率是高是低,跟后面有多少任务在排队没有必然关系。负载表示的是“等待进程的平均数”。只有进程处于运行态(running)和不可中断状态(interruptible)才会被加入到负载等待进程中,也就是下面这两种情况的进程才会表现为负载的值:
- 即便需要立即使用 CPU,也还需等待其他进程用完 CPU
- 即便需要继续处理,也必须等待磁盘输入输出完成才能进行
CPU使用率低负载高
产生的原因就是:等待磁盘 I/O 完成的进程过多,导致进程队列长度过大,但是 CPU 运行的进程却很少,这样就体现到负载过大了,CPU 使用率低。常见场景如下:
- 磁盘读写请求过多就会导致大量 I/O 等待
- MySQL 中存在没有索引的语句或存在死锁等情况
- 外接硬盘故障,常见有挂了 NFS ,但是 NFS server 故障
Linux中的负载
在 linux 下使用 top 指令将会显示相关信息。load average: 0.00, 0.03, 0.00
分别表示当前CPU在1分钟、5分钟和15分钟内的平均负载。这些数据来自于文件/proc/loadavg
,内核会负责统计出这些数据。top 和 uptime 命令显示的内容就来自于这个文件,根据 proc 的帮助文件可知,这里的值就是单位时间内处于运行状态以及等待磁盘 I/O 状态的平均 job 数量。以单核CPU为例:
- 小于1: 说明平均每次只有不到一个 job 在忙,对于单核CPU来说,完全能处理过来
- 等于1: 说明平均每次刚好有一个 job 在忙,对于单核的CPU来说,刚好能处理过来
- 大于1: 说明平均每次有多于一个 job 在忙,对于单核的CPU来说,由于一次只能处理一个任务,所以肯定有任务在等待,说明系统负载较大,调度不过来,有job需要等待
内核态与用户态
内核空间所占的 3G-4G 部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。
Linux特权级的理解
对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86 架构的 cpu 一共有四个级别, 0-3 级,0 级特权级最高,3 级特权级最低。
用户态与内核态是什么
当一个进程在执行用户自己的代码时处于用户运行态(用户态)。此时特权级为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3 状态不能访问 Ring0 的地址空间,包括代码和数据。当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
用户运行一个程序,该程序创建的进程开始时运行自己的代码,处于用户态。如果要执行文件操作、网络数据发送等操作必须通过 write、send 等系统调用,这些系统调用会调用内核的代码。进程会切换到 Ring 0,然后进入第 3G-4G 中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring 3,并回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。
当在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态,比如:
- 系统调用。这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。例如
fork()
就是执行了一个创建新进程的系统调用。系统调用的机制和新是使用了操作系统为用户特别开放的一个中断来实现,如 Linux 的 int 80h 中断。 - 异常。当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。
- 外围设备的中断。当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到内核态的切换。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。
用户态和内核态的区别
- 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所占有的处理机是可被抢占的。
- 而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占用的处理机是不允许被抢占的。
Linux文件系统
- /home:每个账户对应的文件夹,用于管理自己的数据
- /usr:主要包括系统的主要程序、安装的软件、图形接口所需的文档、额外的函数库、共享目录与文件
- /bin:存放客户自行文件
- /boot:存放Linux开机会用的文件
- /dev:存放Linux的任何装置和接口设备文档
- /etc:存放系统设定文档,如账户密码
- /lib:系统使用的函数库放置的目录
- /mnt:软盘和光盘预设挂载点的位置
- /opt:主机额外安装软件所在的目录
- /root:系统管理员的home
- /sbin:只有系统管理员能使用的执行指令
- /tmp:临时存放文件的路径
Linux中进程的状态
- 不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号
- 暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态
- 就绪状态:在 run_queue 队列里的状态
- 运行状态:在 run_queue 队列里的状态
- 可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起
- zombie 状态(僵尸):父亲没有通过wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉
Linux命令
查看线程/进程状态
- ps -T -p <pid> 可查看由进程号为<pid>的进程创建的所有线程</pid></pid>
- top -H 可实时显示各个线程情况
- pstree 以树状图显示进程
查看系统负载
- top
- uptime
# uptime 02:03:50 up 126 days, 12:57, 2 users, load average: 0.08, 0.03, 0.05 10:19:04 up 257 days, 18:56, 12 users, load average: 2.10, 2.10,2.09
系统平均负载是指在特定时间间隔内运行队列中的平均进程数,如果你的 linux 主机是 1 个双核 CPU 的话,当 Load Average 为 6 的时候说明机器已经被充分使用了。1 可以被认为是最优的负载值。
统计文件行数的命令
wc命令 - c 统计字节数 - l 统计行数 - w 统计字数
- 统计某文件中,单词出现的行数:find ./linux.txt | xargs cat | grep "hello" | wc -l
统计文件数目的命令
- 统计文件夹下文件的个数:ls -l | grep “^-” | wc -l
- 统计文件夹下文件夹的个数:ls -l | grep “^d” | wc -l
- 统计文件夹下文件个数,包括子文件:ls -lR | grep "^-"| wc -l
- 统计文件夹下目录个数,包括子目录:ls -lR | grep "^d"| wc -l
查看资源的命令
- 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出):ls -a
- 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出:ls -l
- 将文件以相反次序显示(原定依英文字母次序);ls -r
- 将文件依建立时间之先后次序列出:ls -t
- 递归列出文件夹中的文件:ls -R
杀掉某个后台进程
- ps -ef | grep firefox; kill -s 9 1827; 先查出Firefox的进程号,然后给进程发送信号
- ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9; “grep firefox”的输出结果是,所有含有关键字“firefox”的进程。“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程
- pkill -9 firefox
- killall -9 firefox
- kill -9 pid // 向指定pid的进程发送信号,终止进程
查看网络状况
- 查看linux的端口使用情况:netstat -tln
- 查看所有的服务端口:netstat -a
- 只显示监听端口:natstat -l
在/usr目录下找出大小超过10M的文件
find /usr -size +10M
在/home目录下找出120天前被修改过得文件
find /home -mtime +120
在/var目录下找出90天内未访问过的文件
find /var \! -atime -90
检查Java进程是否存在
ps -ef | grep java
常见的通配符
- ?代替任意单个字符
- *代替任意多个字符
查看系统支持的所有信号
kill -l
top时,进程对应的状态及表示
- D 不可中断 Uninterruptible(usually IO)
- R 正在运行,或在队列中的进程
- S 处于休眠状态
- T 停止或被追踪
- Z 僵尸进程
- W 进入内存交换(从内核 2.6 开始无效)
- X 死掉的进程
在后台运行命令
一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)
grep命令
Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
综合
文件系统
- 查看挂载的文件系统:cat /proc/filesystems
- 查看目录的使用情况:df -h //-h表示以G为单位查看
- 查看文件或目录大小:df -sh
- 查看文件夹的磁盘使用情况:du -a // -a表示全部目录下每个文件所占的磁盘空间
- 目录切换的命令:cd ~
- 打印当前路径:pwd
- 创建目录:mkdir
- 删除目录:rmdir
- 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出):ls -a
- 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出:ls -l
- 将文件以相反次序显示(原定依英文字母次序);ls -r
- 将文件依建立时间之先后次序列出:ls -t
- 递归列出文件夹中的文件:ls -R
- 文件复制:cp from to
- 文件夹复制:cp from to -r
- 删除文件:rm -rf file
- 文件移动:mv file desdir
- 获取路径名:dirname
- ????显示文件内容: cat file -n // -n表示行号
- 显示文件的前n行或后n行:head -n; tail -n;
- 修改文件的时间(修改、访问、状态修改):touch -d "10/13/2013" file
- 查找文件位置:whereis file / locate file / find file
- 比较两个文件的差异:diff -c file1 file2
- 以并列的方式显示两个文件的差异:diff -y file1 file2
- 建立文件的软连接:ln file1 file2
- 建立文件的硬链接:ln -s file1 file2
- 修改文件拥有者:chown -R path
- 修改权限:chmod {u|g|o|a}{+|-|=}{r|w|x} filename // {用户、同组用户、其他用户、所有用户}{增加权限、去除权限、增加所有权限}{读、写、执行}
- 统计文件字数:wc -c file // -l表示行数; -w表示单词数; -c表示字符数
系统
- 查看用户标识:id
- 查看当前登录的用户:users
- 查看都有哪些用户登录到机器上:who
- 显示当前终端的用户名:whoami
- !!!!显示进程: ps -ef // -a显示所有进程的信息、-e显示当前运行的每一个进程信息、-f显示一个完成列表、-x显示包括没有终端控制的进程状况
- 杀掉进程:kill -9 pid // 向指定pid的进程发送信号,终止进程
- 查看IP地址:ifconfig
- 查看路由表:netstat
- 查看历史输入的指令:history
- 查看后台任务 job -l
日期
- 显示日期:date
- 显示日历:cal 2019