ZhouXiangの博客 后端工程师&机器学习爱好者

Java学习系列之Linux

2019-11-10

本文系记录对Java中Linux的学习资料,如有异议,欢迎联系我讨论修改。PS:图侵删!图片丢失请访问:传送门

linux系统

Linux内存空间分配


内核空间所占的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文件系统目录配置(简述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命令

linux查看线程/进程状态

  • ps -T -p 可查看由进程号为的进程创建的所有线程
  • top -H 可实时显示各个线程情况
  • Htop 通过htop查看单个进程的线程,它是一个基于ncurses的交互进程查看器
  • pstree 以树状图显示进程

linux查看系统负载

  • uptime ```shell

    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

//系统当前时间 + 主机已运行时间 + 用户连接数 + 系统在1/5/15min的系统平均负载


系统平均负载是指在特定时间间隔内运行队列中的平均进程数,如果你的linux主机是1个双核CPU的话,当Load Average为6的时候说明机器已经被充分使用了。1可以被认为是最优的负载值。


#### linux统计文件行数的命令
wc命令 - c 统计字节数 - l 统计行数 - w 统计字数

#### linux统计文件数目的命令
- 统计文件夹下文件的个数:ls -l | grep “^-” | wc -l
- 统计文件夹下文件夹的个数:ls -l | grep “^d” | wc -l
- 统计文件夹下文件个数,包括子文件:ls -lR | grep "^-"| wc -l
- 统计文件夹下目录个数,包括子目录:ls -lR | grep "^d"| wc -l

#### linux查看资源的命令
- 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出):ls -a
- 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出:ls -l
- 将文件以相反次序显示(原定依英文字母次序);ls -r
- 将文件依建立时间之先后次序列出:ls -t
- 递归列出文件夹中的文件:ls -R

#### linux如何用一条命令如何杀掉某个后台进程

- 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看网络状况用什么,看日志用什么?
- 查看linux的端口使用情况:netstat -tln
- 查看所有的服务端口:netstat -a
- 只显示监听端口:natstat -l

#### 如何在/usr目录下找出大小超过10M的文件
```shell
find /usr -size +10M

如何在/home目录下找出120天前被修改过得文件

find /home -mtime +120

如何在/var目录下找出90天内未访问过的文件

find /var \! -atime -90

检查Java进程是否存在

ps -ef | grep java

Linux下有哪些常见的通配符

  • ?代替任意单个字符
  • *代替任意多个字符

如何查看系统支持的所有信号

kill -l

Linux中top时,进程对应的状态及表示

  • D 不可中断 Uninterruptible(usually IO)
  • R 正在运行,或在队列中的进程
  • S 处于休眠状态
  • T 停止或被追踪
  • Z 僵尸进程
  • W 进入内存交换(从内核 2.6 开始无效)
  • X 死掉的进程

如何让命令在后台运行

一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)

df和du的区别

  • du 显示目录或文件的大小
  • df 显示每个<文件>所在的文件系统的信息,默认是显示所有文件系统
  • df 命令获得真正的文件系统数据,而 du 命令只查看文件系统的部分情况

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

Similar Posts

Comments