前端工程化Linux预备知识

工程化Linux知识学习

Posted by wang chong on February 26, 2019

操作系统概述

古老的操作系统

古老的Dos系统,它是windows系统的前身,最早的windows是构建在Dos系统下面的,作为Dos系统的一种增强型界面。后来windows95出现之后,windows就独立了,它不依赖Dos了,反而Dos就成为了一个子系统嵌入到windows中,一直到今天(现在的终端不是Dos了,但是一直使用着Dos的命令)。

windows

windows作为中国普遍的操作系统是适用于工作和娱乐的。但是在开发环境下相对于Mac和Linux就有些欠缺,windows的终端也没有Mac和Linux强大。

Linux

Linux系统是一个开源的操作系统,适合程序员做开发。Linux的桌面不是很成熟,但是服务器系统是非常强大的。

MacOS

MacOS应该是程序员中最普遍使用的操作系统了,有着成熟的桌面同时终端也非常强大,适合程序员做开发。

远程登录Linux系统

一般的Linux系统都是用来做服务器来使用的,所以我们必须要操作它,服务器之所以叫做服务器是因为上面跑着很多服务,服务永不停止,这样才能在有需要的时候提供一些功能。如果不能远程登录到服务器上去,那么程序就没法部署上去。因为现在的服务器大多数都在机房或者都是云服务器,所以需要远程连接登录上去。

远程登录协议

远程登录Linux系统使用的是ssh协议,同时ssh也是一个软件,支持ssh网络协议的服务名是sshd

不同操作系统下远程登录的方式

windows

由于windows并没有像Linux和MacOS那样强大的终端,windows自己的终端里面并没有ssh,所以只能借助外物来实现登录。

  1. putty:是一个带有图形用户界面的远程登录终端。—开源,比较简单。
  2. Xshell:也是带有图形用户界面的远程登录终端。—商业软件(收费),功能强大。
  3. Cmder:windows系统下的一个增强型的终端。可以使用大部分Linux命令,也可以使用ssh登录远程服务器(建议使用这种)。

Linux和MacOS

Linux和MacOS的终端里面登录都自带了ssh命令,可以通过ssh命令来登录远程服务器。 使用

ssh 用户名@ip地址

例如来登录一下我的服务器。

这样就登录成功了,除此之外我们发现登录成功之后后面有一个~符号 这里服务器的home目录,每一个Linux系统上的用户都有一个自己的目录,也就是home目录。不同的用户下的home是不同的。

  • root用户下的home目录比较特殊 /root
  • 普通用户的home目录的路径在/home/用户名
用户身份切换

Linux下的用户身份切换命令有两个:

  1. sudo:一般用于敲命令,表示暂时以root身份运行一个需要权限的命令。
  2. su:用于切换用户身份,su 普通用户(不需要敲密码),以普通身份切换到root身份需要密码。

切换身份是一种递归型的切换,向外切换过去,可以通过exit命令返回。

强调重要的Linux命令

行编辑器vi/vim

由于我们是远程登录到Linux服务器,又因为远程服务器并没有图形化界面,所以在编辑器方面vim是一个神奇。vim是vi的增强版。

服务器管理命令

Linux操作系统的服务器管理命令是systemctl。用于管理服务的状态。

用法:systemctl [status,start,stop,restart] 服务名

上面命令其中systemctl为主命令,[status,start,stop,restart]为子命令。

  1. systemctl status 服务名 :查看一个服务的运行状态
  2. systemctl start 服务名 :启动一个服务。
  3. ystemctl stop 服务名 :停止一个服务。

网络管理命令

ifconfig

用于查看当前计算机的硬件信息和网络。在windows下是ipconfig,在linux和mac下是ifconfig(ifconfig:interface config) etho表示物理网卡。

物理网卡:默认名称是:eth+数字

ip

ip命令是一个新命令,centOS6之前是没有的。ip命令是一个网络配置的工具箱,分为主命令和子命令。例如:

ip addr :显示网络

route

route命令用于帮助诊断网络。当局域网访问不了互联网的时候,我们首先使用ping命令执行下,如果没有得到返回,那么可能就是网络出了问题,那么就可以使用route命令查看一下路由配置对不对。

  1. Destination:路由名称。
  2. Gateway:表示网关。
  3. Genmask:表示通过网关可以达到什么样的网段。
  4. Ifce:Interface,表示网络走的是什么网卡。

下载命令

在终端中的下载命令有两个。

  1. wget

    wget url 下载

    wget -c url :断点续传,下载失败了,执行这个会在断开的地方下载。

  2. curl

    curl url 下载

    curl功能更加强大,可以控制http头

Linux帮助

  1. 命令 -h:显示帮助。
  2. man 命令:显示命令的帮助文档。这个man命令实际上是一个小数据库,存放着各种命令的帮助文档。

常用的终端快捷键

  1. ctrl + s:暂停屏幕输出:不要轻易的挂起终端,可能会导致一个服务启动失败。
  2. ctrl + c:结束正在运行的程序(ping,telnet等)
  3. ctrl + d:结束输入或退出shell
  4. ctrl + q:恢复屏幕输出。
  5. ctrl + l:清屏,等同于Clear。
  6. ctrl + a/ctrl + e 快速移动光标到行首/行尾。

Linux进程、线程与协程

进程

进程是一个动态的概念。进程就是运行的实例。进程的目的就是担当分配系统资源的(CPU时间,内存)的实体。

我们知道操作系统最核心的概念就是进程。其实进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。

进程分配CPU的方式

单核操作系统分配CPU的方式

单核操作系统分配CPU的方式是‘切时间片’方式:给进程1一段时间,然后把CPU控制权拿回来,再给进程2用,进程2用一小段时间再给进程3用。这种也可以称之为时分复用。

多核操作系统分配CPU的方式

当进程1启动的时候把进程1分配到核心1上,当进程2启动的时候把进程2分配到核心2上。当进程多的时候,也同样把把每个核心使用切时间片的方式。

  1. 单核CPU:同一时间只能执行一个进程。
  2. 多核CPU:每个核心同一时间只能执行一个进程。

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程里面,是跑在进程里面的更小的任务。

协程

协程是一种程序运行的方式,是一种用户态的轻量级线程。无法利用多核资源。不用调用内核资源,生成一个协程不需要内核的参与。

何为轻量级线程

多个线程(单线程情况下,即多个函数)可以并行执行,但是只有一个线程(或函数)处于正在运行的状态,其他线程(或函数)都处于暂停态(suspended),线程(或函数)之间可以交换执行权。也就是说,一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函数),等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的线程(或函数),就称为协程。

何为用户态

在操作系统中是分层的:最内存是硬件,然后硬件给操作系统提供支持。操作系统提供内部核心功能(内核态),再外层就是一个库,再外层就是shell(它就是一个壳)(用户态是自己实现的一些功能),用户态在使用的时候也是需要操作系统的内核态的功能(通过API或者是操作系统的信号系统进行提供)。简单的说用户态就是自己实现的代码。

IO密集型应用的发展

IO密集型一般是网络相关的应用,IO(输入输出)主要做的是计算机内部和计算机外部进行数据交换。之所以说IO操作是最慢的操作,是因为IO操作时要跨越硬件进行数据交换。I:输入时把数据传给CPU、O:输出时CPU处理完了再把数据吐出来。

网卡对于CPU来说是另外一个设备。在CPU内部的数据处理是很快的,但是CPU要和其他的物理元件进行通信要走数据总线,然而数据总线的带宽是受到限制的,所以在IO操作上面效率是很低的。

发展历程

  • 多进程:最初为了提高IO的吞吐量,走的是多进程,多进程消耗的系统资源比较多。使用多进程解决方案的时候要启动多个进程。比如说:nginx是一种典型的多进程的解决方案,现在也用到了事件驱动。再往前就是Apache,Apache也是多进程的,当有一个网络请求过来的时候Apache会创建出一个子进程来,有两个网络请求过来会创建两个子进程,因为进程消耗的系统资源非常多,所以性能是直线下降的。
  • 多线程:线程运行在进程内部,就可以只启动一个进程,当有网络请求过来的时候创建一个线程,有多个创建多个线程。为多进程节省资源。但是请求数多了也不行。
  • 事件驱动:事件驱动就是一个单线程处理方案(node),当没有请求的时候就待着,有请求的时候:一个事件过来,通过事件处理流程去完成操作。简单的说就是在一条线上工作,没有消耗更多的资源。
  • 协程:协程是一种用户态更加轻量的线程。协程所消耗的系统资源更少。

CPU密集型应用的发展

CPU密集型纯碎就是消耗CPU的时间,决定CPU密集型的性能就取决于CPU跑的是快还是慢。科学数据运算就是CPU密集型。

调度和切换的时间:进程>线程>协程

操作系统要管理进程和线程,所以操作系统本身也要消耗一些资源,如果说操作系统在管理进程和线程,进程和线程进行调度和切换频率非常高的时候,要么很多的CPU资源都会消耗到切换上面。也就是说CPU资源都被操作系统占用了,所以说并不是进程越多越好或者线程越多越好,是有一个最佳的平衡点的。

进程与线程

操作系统在设计上,可以归纳为三点:

  1. 以多进程为例,允许多个任务同时进行;每一个进程都有自己的内存空间,都有自己的数据结构。进程中分为父进程和子进程,以nginx为例:当启动nginx服务的时候,实际上启动的是主进程,当有连接请求的时候,nginx会创建出一条子进程来(子进程就是工作进程),主进程负责调度(产生工作进程),工作进程完成任务之后,主进程负责回收。
  2. 以多线程为例,允许单个任务分为不同的部分运行;线程可以共享进程的数据,线程本身也有自己的数据。
  3. 提供协调机制:一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

    • 资源争抢的后果:谁都想拿资源,但是谁也拿不走或者说会把资源给破坏掉。有些资源是独占资源,协调机制就是协调独占资源。

进程与线程的资源共享

由上图可以得知:每个进程都有自己的独有的东西,线程会继承自所在进程全部的东西,并且多线程之间每个线程也有自己独有的东西。

单线程进程

单线程进程是指一个进程中只有一个线程,该线程继承进程的所有资源(代码、数据、文件操作符),并且有自己的资源(寄存器、栈)。

多线程进程

多线程进程是指在一个进程中有多个线程,这个线程都可以拿到进程的所有资源,也就是说共享进程资源(代码、数据、文件操作符),而且每个线程中又有自己独立的资源(寄存器、栈)。

Linux进程管理相关命令

top命令

top命令相当于windows的任务管理器,显示所有进程的状态。属于动态

ps命令

查看当前操作系统某一瞬间净化才能的状态。

px aux

查看当前操作系统某一个瞬间所有进程的状态。

  1. user:表示这个进程是以哪一个用户启动的。
  2. command:进程的权限,是在用户身上继承下来的,如果以root身份启动,那么这个进程会获得root用户的所有权限。
  3. pid:进程编号
  4. stat : 当前一瞬间,进程的状态。(S:休眠状态,Z:僵尸状态(父进程已经死掉了,子进程没有被操作系统及时的回收))

特殊的进程:1号进程是用来管理其他进程的,这个进程是杀不了的,1号进程是所有其他进程的父进程,如果父进程死了,子进程一块死掉。

查找特定的进程
ps aux grep 服务名

管道命令 ‘|’ 符号: 把前面命令产生的结果,传给后面的命令。

  1. ps aux :查看当前操作系统某一个瞬间所有进程的状态。
  2. grep 服务名:筛选,在上面命令的结果中筛选出指定服务名的进程。

例如查看sshd服务 显示了三个服务,但是只有上面两个是sshd的服务,第一个是父进程,第二个是子进程,第三个是grep查找的服务。

区分父进程和子进程

看pid,谁的pid小,谁就有可能是父进程。

杀死进程

kill命令

kill 进程的pid

kill -9 进程的pid :强制杀死进程

原理: kill功能是向操作系统发一个信号过去,linux操作系统有32种信号(各有各的用途),-9 就表示9号信号,9号信号的意思就是强制关闭一个进程。不加 -9就是让进程自行退出的信号。

pkill命令

pkill命令和kill类似,主要是pkill后面跟的是进程的名称,kill后面跟的是进程的pid。

kill 进程的名称

w命令

显示当前谁登陆了远程服务器上。

Linux网络

重启网卡

如果有时候我们要重启网卡,一定要在图形化界面上重启,如果在终端中远程登录,就是直接掉线。

  1. 关闭网卡:ifdown 网卡名称
  2. 启动网卡:ifup 网卡名称
  3. 网卡的配置文件:/etc/sysconfig/network-scripts/ifcfg- [name]

排查网络故障

traceroute命令是更高级的ping命令。用于显示当我们想和一个网址通信的时候,中间的挑转路由器是什么。 ping命令 traceroute命令

查询Linux网络端口

ss命令

ss -an 输出进程的信息就会包括端口号

ss-anp 显示使用网络的进程

使用管道机制查询单个网络端口

ss -anp grep :22

netstat命令

netstat命令和ss命令用法相同。