Linux指令

常用的指令

ls:查看当前目录下的文件

cd:cd /home 进入'/home'的目录 cd.. 返回上一级目录

mkdir dir1:创建一个叫做'dir1'的目录

rmdir dir1:删除一个叫做'dir1'的目录(只能删除空目录)

rm -f file1 删除一个叫做'file1'的文件,-f参数:忽略不存在的文件,从不给出提示

rm -rf /mulu:删除'/mulu下面的文件以及子目录文件'

cp /test1/file1 /test3/file2:将/test1目录下的file1文件复制到/test3目录,将文件名改为file2

mv /test1/file1 /test3/file2:将/test1目录下的file1文件移到到/test3目录下,将文件名改为file2

mv * ../: 将当前目录所有文件移动到上一级目录

ps -ef | grep xxx:显示进程pid

kill:使用kill命令来终结进程。一般先使用ps命令找到进程的id

tar -xvf file.tar:解压tar包

unzip file.zip:解压zip包

unrar e file.rar:解压rar包

free -m:查看服务器内存使用情况

|:管道符'|'将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。

grep:-v不显示匹配上的内容;-n显示匹配上的内容

du(disk use):显示每个文件和目录的磁盘使用空间

df(disk free):显示磁盘分区上可以使用的磁盘空间

查看端口状态

netstat -anp | grep 端口号 有LISTEN标记的才表示端口被占用了

netstat:可显示当前服务器上所有端口及进程服务,与grep结合可查看某个端口及服务情况。

参数:-t:显示TCP端口

          -u:显示UDP端口

          -n:不进行DNS轮询,显示IP

          -l:显示监听套接字

          -p:显示进程标识符和程序名称,每一个套接字/端口都属于一个程序

ps:可查看一个服务有几个端口。

lsof命令:使用lsof -i:port就能看见所指定端口运行的程序,同时还有当前连接。

按文件名找文件

find 搜索目录 -name 目标名字

find / -name file名(/代表全盘搜索)

find命令格式:find [搜索范围] [匹配条件]

参数:-name:根据名字查找

           -size:根据文件大小查找,+,-;大于设置的大小,直接写大小是等于

           -user:查找用户名的所有者的所有文件

           -group:根据所属组查找相关文件

           -type:根据文件类型查找(f文件,d目录,l软链接文件)

查看文件

cat:由第一行开始显示内容,并将所有内容输出。用法:cat 文件名,参数:-n 加行号输出

tac:从最后一行倒序显示内容,并将所有内容输出。用法:tac 文件名

more:根据窗口大小,一页一页的显示文件内容。用法:more 文件名。回车键向下翻行,空格键向下翻页,'q'键退出查看页面。

less:和more类似,但可以往前翻页,而且可以搜索字符。用法:less 文件名。使用pageup键向前翻页,pagedown向后翻页。使用less passwd,再输入字符串,可以查找,如果有会高亮显示。

head:只显示头几行。用法:head -n number 文件名(number显示的行数)

tail:只显示最后几行。用法:tail -n number 文件名(number显示的行数)

nl:类似于cat -n,显示时输出行号

grep和find的区别

grep:是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,标识全局正则表达式版本,它的使用权限是所有用户。

find:在目录结构中搜索文件,并执行指定的操作。find命令从指定的起始目录开始,递归的搜索其各个子目录,查找满足条件的文件并对之采取相关的操作。

grep是查找匹配条件的行,find是搜索匹配条件的文件。grep是根据文件的内容进行查找的,而find是根据文件的属性进行查找的。

查看路由表的命令

route:用于操作基于内核ip路由表,它的主要作用是创建一个静态路由让指定的一个主机或者一个网络通过一个网络接口,如eth0。

用法:显示当前路由:route 或者 route -n

           添加网关/设置网关:route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

           删除路由记录:route del -net 224.0.0.0 netmask 240.0.0.0

参数:-c:显示更多信息

           -n:不解析名字

           -v:显示详细的处理信息

           -F:显示发送信息

           -C:显示路由缓存

           -f:清楚所有网管入口的路由表

           add:添加一条路由

           del:删除一条路由

           -net:目标地址是一个网络

           -host:目标地址是一个主机

           netmask:当添加一个网络路由时,需要使用网络掩码。

查看进程的命令

ps:可以查看进程。

参数:a:显示现行终端机下的所有进程。

           -A或 -e:显示所有进程

           -f:全部列出

           -p:pid进程使用cpu的时间

           -u:指定用户信息

Docker常用的指令

docker images:查看本地镜像

docker ps:查看当前正在运行的容器

docker ps -a:查看所有容器的状态

进程通信

1、无名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程亲缘关系通常是指父子进程关系。

2、有名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

3、消息队列:消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4、共享存储:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

5、信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

6、套接字:套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

7、信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

线程通信

互斥量、读写锁、自旋锁、线程信号、条件变量

进程和线程的区别

进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位);

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另一个进程造成影响,因为进程有自己独立的地址空间。

资源:进程:内核虚拟内存(代码、数据、堆、栈)、用户栈(运行时创建)、共享库的内存映射区域、运行时堆(用malloc创建的)、读/写段(.data、.bss)、只读代码段(.init、.text、.rodata)。

线程共享:进程代码段、进程的公有数据、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。线程独有:栈(保存其运行状态和局部自动变量)、程序计数器。

僵尸进程和孤儿进程

僵尸进程:一个进程使用fork函数创建子进程,如果子进程退出,而父进程并没有调用wait或者waitpid获得子进程的状态信息,那么子进程的进程描述符等一系列信息还会保存在系统中。这种进程称之为僵尸进程。危害:当Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓僵尸进程。"僵尸"进程是一个早已死亡的进程,但进程表中仍占了一个位置。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。处理方式:①改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHILD信号。子进程死后,会发送SIGCHILD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHILD消息,尽管默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。②把父进程杀掉。父进程死后,僵尸进程称为"孤儿进程",过季给1号进程init,init始终会负责清理僵尸进程。它产生的所有僵尸进程也跟着消失。

孤儿进程:父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程。孤儿进程最终会被1号进程init进程收养,因此init进程此时变成孤儿进程的父进程,并由init进程对它们完成收集工作。(init是内核启动的第一个用户级进程,init有很多重要的任务,比如启动getty(用于用户登录)、实现运行级别、以及处理孤儿进程。

内核态和用户态,系统调用,内核定制过程

内核态:运行操作系统程序,操作硬件。

用户态:运行用户程序。

指令划分:特权指令:只能由操作系统使用、用户程序不能使用的指令。例:启动I/O内存清零,修改程序状态字,设置时钟,允许/禁止中断,停机。非特权指令:用户程序可以使用的指令。例:控制转移、算术运算、取数指令、访管指令(是用户程序从用户态陷入内核态)。

特权级别:内核态相当于R0,用户态相当于R3。不同级别能够允许不同的指令集合。

CPU状态之间的转换:用户态变内核态:通过中断、异常、陷入机制(访管指令)。内核态变用户态:设置程序状态字PSW。

区别:内核态与用户态是操作系统的两种允许级别,当程序允许在3级特权级上,就可以称之为运行在3级特权级上时,就可以称之为运行在用户态。因为只是最低特权级,是普通的用户进程的特权级,大部分用户直接面对的程序都是运行在用户态。当程序运行在0级特权上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权利和能力完成的工作时就会切换到内核态(比如操作硬件)。处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的。处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成任务。fork()就是执行了一个创建新进程的系统调用。用户程序通常调用库函数,由库函数再调用系统调用,因此有的库函数会使用户程序进入内核态(只要库函数中某处调用了系统调用),有的则不会。

其中内容都是针对问题收集在网上收集,如果侵权告知立即删除!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值