Week 16
本周学习主要内容包括上周内容补充知识,Linux系统历史操作及安装
补充知识
tracemalloc
- 标准库tracemalloc可以用作统计内存使用情况
- 下例中得出结论:字典比较占用空间
import tracemalloc
tracemalloc.start() #开始追踪内存分配
count = 1000000
x = [dict(zip('xy',(4,5))) for i in range(count)] #一个列表,列表中放了若干字典 237 MiB 空间换时间
y = [tuple(zip('xy',(4,5))) for i in range(count)] #容器中放了若元组 191 MiB
#如果内容不变,选择元组,减少内存
snapshot = tracemalloc.take_snapshot() #快照,当前内存分配
top_stats = snapshot.statistics('lineno')
for stat in top_stats:
print(stat)
__slots__
- 为了解决字典占用过多空间,提供了
__slots__
方法把属性字典__dict__
省掉
class A:
X = 'MN'
__slots__ = 'x','y' #类属性,控制实例的属性;如果提供了该类属性,则实例字典默认取消
# __slots__ = ['x','y']
# __slots__ = ('x','y') #元组
# __slots__ = 'y'
def __init__(self):
self.x = 4
self.y = 5 #y属性赋值,不允许了
def show(self):
print(self.X,self.y)
a = A()
print(a.x,a.y)
print(a.__dict__) #{'x':4,'y':5}
## 运行结果:
4 5
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-16a45a406294> in <module>
15 a = A()
16 print(a.x,a.y)
---> 17 print(a.__dict__) #{'x':4,'y':5}
AttributeError: 'A' object has no attribute '__dict__'
__slots__
告诉解释器,实例的属性都叫什么,一般来说,既然要节约内存最好还是使用元组- 一旦提供
__slots__
,就阻止了实例产生__dict__
来保存实例的属性 - 此时实例不可以动态增加属性了(但类属性不受影响)
__slots__
不影响子类实例,不会继承下去,除非子里面自己也定义了__slots__
操作系统
由来
- job:个人编写的程序(汇编、Fortran)
- 批处理系统:为了不让计算机限制,将多人提交的作业收集到一起,比如输入到磁带上,在计算机上运行一个特殊程序(监控程序),可以读取一个Job并执行将结果输出到另一个磁带上,再从输入磁带上再次读取下一个作业,这个特殊程序叫批处理系统(batch system)
- 为更有效地利用计算机,解决IO操作等待问题,出现了多道程序,他将内存划分为多个独立空间,每个作业独占一个(一个作业IO操作另一个作业运行)。如果存储多个作业在某作业IO时,通过调度程序进行调度来切换作业,就总有作业在运行,使得CPU利用更有效
- 为了使得大量用户可以同时使用计算机,出现了分时系统(Time sharing),之后出现MULTICS多用户系统,有进程管理
UNIX历史
- 名称由来:删减版的MULTICS,Ken Thompson简单编写
- Dennis Ritchie加入,以B语言为基础发明了C语言,并用C语言重写了Unix操作系统
Linux历史
- 荷兰教授为了方便教学,将庞大复杂的UNIX最简化写出MINIX,该系统采取微内核设计,只提供最基本最少的功能,使系统可靠高效
- 芬兰学生借鉴Minix很多思想,但舍弃了Minix的微内核,将整个操作系统功能都包含在内核中,编写了一个类Unix系统,即Linux
- Linux使用了GPL许可,用户可以自由使用、复制、修改、传播源代码和二进制代码,但以Linux内核为基础开发的产品不能之一二进制形式出售和分发,必须将源代码一并发出,要么可以随意索取源代码
Linux发行版
- 两大主要阵营:Redhat(红帽)和Debian
- 红帽系有RHEL(RedHat Enterprise Linux)、Centos(社区版)、Fedora(桌面版),国内用户极多
- Debian也是很早的Linux分发版,基于他的发行版Ubuntu是广受欢迎的桌面系统
- Android也是Linux的发行版
- 发行版使用不同的Linux内核版本
概念
操作系统OS(Operation System),是特殊的计算机程序,他管理计算机硬件,并提供一个人机交互界面,供用户更方便的使用计算机资源
- ABI:Application Binary Interface
描述了应用程序和OS之间的底层接口,规定了数据类型大小、布局、对齐、规定了函数调用约定,以及目标文件二进制格式等,使得编译好的程序可以在兼容ABI环境中都可以直接运行 - API:Application Programming Interface
应用程序定义的面向开发人员的编程接口,不需要了解内部工作机制,就可以通过其API函数来使用其功能
文件系统
- 磁盘有多片盘片和一组磁头组成,盘片被划分出同心圆磁道,多个盘片的同磁道构成柱面,磁道上每512字节划分为扇区,数据都存储在扇片上
- 主分区:主分区可以有多个
- 扩展分区:为了能分出更多分区,但不想多占分区数,可以划分扩展分区,他站一个分区数。扩展分区不能直接存数据,他就是为了在里面在划分分区,一块硬盘只能拥有一个扩展分区
- 逻辑分区:在扩展分区中分的分区
- 文件系统格式:FAT、NTFS、ext2、ext3、ext4
- 文件系统中可以存储很多数据,这些数据被组织成文件,但文件很多,有提供了目录,目录可以包含子目录和文件
- 文件系统构建了一棵倒置的树来描述文件的组织结构,从根开始,根一般用/表示
File System Hierarchy(FSH,Linux文件系统)
目录 | 说明 |
---|---|
/ | 根目录,FSH从此开始 |
/boot | 启动相关文件 |
/bin | 所有用户使用的基本命令,不能关联独立分区,OS用到 |
/sbin | 基本管理类命令,不能关联独立分区,OS用到 |
/etc | 系统配置 |
/lib | 共享库、内核模块 |
/usr | 全局共享只读文件 |
/usr/local | 第三方软件 |
/usr/bin | 非启动的命令 |
/usr/sbin | 非启动的命令 |
/root | root用户家目录 |
/home/USERNAME | 普通用户家目录 |
/opt | 第三方软件和配置 |
/tmp | 临时文件 |
/var | 可变文件 |
/var/run | 运行时文件 |
/var/cache | 应用程序缓存文件 |
/var/log | 日志(可能很大) |
/dev | 设备目录 |
/mnt | 文件系统挂载点 |
/media | 可移动设备挂载点 |
/proc | 内核、进程相关信息的虚拟文件系统 |
/sys | 当前系统硬件相关信息的虚拟文件系统 |
- 在Windows下需要把分区映射成为逻辑驱动器(盘符),每个盘符都有自己的根,Win系统可以使用\表示根,路径分隔符默认是\,但也可以识别/
- Linux必须把所有分区挂在mount到文件系统的目录上,就是建立分区和目录的映射关系
- 特殊目录:
- . 指当前目录
- … 指上一级目录
- bash中~波浪线 代表当前用户家目录
- Windows文件名不区分大小写
- Linux文件名区分大小写,最长255字节,包括路径在内文件名称最长4095字节,文件名可以使用斜杠和null之外的所有字符
Linux操作系统
建立虚拟机及基础设置
虚拟机中操作:
- ip a:(a代表address,即ip地址)查看网络配置,无ip地址不能通信,需要手动分配ip地址,对所有server进行静态分配(不要用动态),靠DHCP完成
- 网关(Gateway ip):192.168.233.2 (不要随便更改使用!!!)
- ping 192.168.233.128:测试是否可以ping通,通即可以通信(按ctrl+c中止运行)
- cd /etc/sysconfig/network-scripts/ (查看目录)
ls
接入Xshell:
- nmcli
nmcli --help
nmcli c --help 或 nmcli c help - nmcli c show:显示NAME UUID TYPE DEVICE
- nmcli c modify (填入UUID)ipv4.dns 114.114.114.114
- cd /etc/sysconfig/network-scripts/ ==> ifcfg-Wired_connection_1(tab补全)
- cat ifcfg-Wired_connection_1(查看目录)
- 服务器一般不重启!!
- Centos7中可以使用(Cnetos8已取消):systemctl restart network
- Centos8:nmcli c reload
- 回到并查看家目录:cd~ + pwd
- alias cdif=“cd /etc/sysconfig/network-scripts/”
cdif
pwd - mv ifcfg-Wired_connection_1 ifcfg-ens36:改名,用mv
- vi ifcfg-ens36:进入vi编辑模式
- 关机:shutdown -h now
进入vi编辑模式:
- I – insert模式,光标在哪儿从哪儿插入
A – append模式,从当前行尾部追加
X或delete – 删除模式 - Esc:退出编辑
- shift + g:来到最后一行
- o:新起一行,并进入编辑模式
- 重要定义:
- BOOTPROTO=static
- NAME=“ens36”
- ONBOOT=yes
- 不要碰UUID和DEVICE
- 增加:
- IPADDR=192.168.233.130(修改ip地址)
- NETMASK=255.255.255.0(子网掩码)
- GATEWAY=192.168.233.2
- 保存退出:Esc 退出编辑;在最后一行输入:wq(写入并退出)
- 查看是否更改成功:
- nmcli c reload
- ip a
- reboot(重启)
- 回到虚拟机用ip a查看ip地址是否更改生效
防火墙设置(Xshell中)
- systemctl status firewalld:用于查看防火墙状态
- systemctl stop firewalld:停用防火墙
systemctl disable firewalld:停止开机时启用防火墙 - getenforce
vi /etc/selinux/config:修改为SELINUX=disabled
Esc + :q:退出编辑
shutdown -h now:关机 - 回到虚拟机拍摄快照关机
命令
- 内部命令,随shell启动,常驻内存
- 外部命令,需要找到文件夹在进程,查找路径就是$PATH
- hash,外部命令路径可以保存在一个hash表中
- PATH有很多目录,逐个去这些目录,找到就立即返回
- 外部命令是文件,找文件需要到目录里面去翻,hash:
{key}
hash(vi) -> 路径
命令格式
命令 [options…][arguments…]
命令本身可以接受选项和参数,而选项可以有自己的参数:
- 短选项:-h 使用-加一个字母,短选项可以合并,但如果选项需要提供参数,必须放后面。短选项往往都是最常用的选项,为了简化而提供
- 长选项:--all 使用--加单词,不可以合并写
- Ctl + c:可以结束正在运行的命令
- \:命令续行符
- ;:一行多个命令使用分号分割
- 使用tab键补全,tab两次可以提示所有可能候选
命令扩展
bash具有的功能
$ echo a/b/x a/c/x a/d/e/x 可以写成 $ echo a/{b,c,d/e}/x
常用命令
- 查帮助
- help:内部命令
- man:查看Man文档
- 命令 -h或者命令 --help
- 命令
- type命令类型
- 主机名
- 主机名非常重要
- 临时修改,hostname主机名
- 永久修改:
- 主机名可以修改配置文件/etc/hostname
- CentOS7 可以用hostnamectl命令
- who:查看登录信息,who am i或whoami,w
- whatis:命令有什么功能
- which:命令在哪里
- whereis:命令程序二进制文件、man文档
- uname
- -a:查看操作系统信息
- -r:内核版本
- alias 别名:
alias cdif=“cd /etc/sysconfig/network-scripts/”
- echo:回显字符
- -n:取消自动附加最后的换行符
- -e:使用解释功能,$ echo -e “a\tb\nc” 使用转义符
- date:日期
- date+“%Y%m%d%H:%M:%S"
date [MMDDhhmm[[CC]YY][.ss]]
修改时间
- 开关机:
- halt,poweroff
- reboot:重启
- 计划关机:
- shutdown [option]… TIME
- -r:重启
- -h:关机
- TIME:now立即执行;+n n分钟后执行;hh:mm 几点几分开始执行
- -c:未执行前还可以取消(cancel)
- 网络:
- ping
- -c:count;-w:deadline几秒截止
- ping -c 20 -w 5 www.baidu.com:5秒内ping20下,否则截止
- ip a:查看ip;ip route查看路由
- ss -tanlp
- ping
绝对路径和相对路径
- 相对路径,不以/开头的路径
- 绝对路径,以/开头的路径
- 编写软件的时候,当前软件文件集中放置在某目录下,该目录称为工作路径,且在这个目录下使用子目录组织。本软件内可以使用相对路径,因为工作路径下的文件和子目录相对关系一般不变
- 绝对路径因为固定,只在约定好路径、路径不变的场景下使用
- basename基名和dirname目录名
文件类型
- -或f普通文件
- d:目录directory
- l:符号链接或软连接,symbolic link,相当于快捷方式
- b:块设备,block device,随机访问,磁盘
- c:字符设备,character device,线性访问,键盘
- p:管道pipe
- s:socket文件
权限
- 属主(Owner):文件拥有者
- 属组(Group):文件的分组,组内的用户对该文件有一定权限
- 其他用户(Other Users)
- 如果有该权限,则显示对应字母;如果没有该权限,则显示。注:root用户不受权限设置
- rwx是三个字符,如果看作二进制位就是三位,每一位都可以用0或1表示,由此可以用一个8进制数表示。例:rw-rw---- 用八进制表示就是660
通配符Wildcard
- *:匹配0个或多个字符(bash默认不支持 ** 为递归)
- ?:匹配一个字符
- [a-z][A-z][0-9][acdf]匹配一个字符;[^a-z]匹配a-z之外的任意一个字符
- [:space:]空白字符、[:digit:]表示0-9、[:lower:]小写、[:upper:]大写、[:alpha:]字母、[:alnum:]字母和数字等
- 当一个字符用,所以 ls test[[:alnum:]]
文件系统命令
- ls:列出目录内容
- -a:显示所有文件,包括隐藏文件,即以 . 开头的文件
- -l:长格式显示,别名ll即ls-l,显示了stat的部分内容
- -h:–human-readable 配合-l,人可以阅读的,size显示为K\M\G等
- -R:递归目录
- -d或-ld:显示目录自身
- -i:显式inode号
- touch:没有文件创建空文件,如果文件存在,改变时间戳
- -a:改变atime、ctime
- -m:改变mtime、ctime
- -c:如果文件不存在,则不创建
- stat:显示文件的信息(元数据metadata)
- access time,atime,读取文件内容则设置
- modify time,mtime,改变文件自身内容则设置。ls-l显示的时间就是mtime
- change time,ctime,元数据发生变化则设置
- cd切换目录(change directory)
- cd 或 cd~ 回到家目录
- cd -:最后两次目录相互切换
- pwd:显示当前工作路径
- file:显示文件格式
- cat:读取文件或stdin到stdout;tac每个文件倒着读取行(与cat相反)
- more:less比more功能更强
- 回车向后一样,y向前一行
- 空格向后一页,b向前一页
- d向后半页,u向前半页
- g首行,G末行
- /或? 搜索
- q 退出
- head -n 20 /etc/passwd
- tail -n10 /etc/passwd;tail -f /var/log/messages
- mkdir:创建目录
- -p:创建父目录
- -v:详情
- tree:递归显示目录树
- rmdir:删除空目录
- rm:慎用!!
- -i:交互式提醒
- -f:强制不提醒
- -r:递归删除
- rm -rf /
- ln:创建链接文件
- s:创建符号链接
- -v:详情
- cp:复制目录或文件,从源复制到目标,默认不递归复制
- 如果源是文件:
- 目标是文件,目标不存在,直接创建指定名称文件;如果目标存在,直接覆盖
- 目标是路径,复制到指定路径下,不存在新建;存在则覆盖
- 如果源是目录:
- 目标是文件,不可以
- 目标是目录:
- 如果目标存在,就在该目标目录下复制源目录内容
- 如果不存在,创建目标目录,复制源的内容
- 如果有多个源,目标只能是目录,且目标必须存在
- -i:交互式提醒;-f:强制覆盖不提示
- -R,-r:递归复制
- –preserv:保留指定的元数据信息,all保留所有,即包含权限、属主、属组等
- -d:表示–no-dereference --preserv=links:不复制源文件,只复制链接名
- -a:归档,相当于-dR --preserve=all,递归复制所有文件包含软连接,但不跟踪软连接
- 如果源是文件:
- mv:移动或重命名,和cp很像
find[指定目录][指定条件][指定动作]
- find /-name *.py
符号链接
$ ln -sv test test.link
$stat test
$stat test.link
$stat -L test.link
- 使用ln命令加-s选项就可以创建符号链接(软链接)
- 软链接也是文件,60字符以内,在软连接的inode entry中记录着链接到的文件路径(相对或绝对路径字符串),而大多数软链接记录的路径字符串长度都小于60,应当尽量避免为软连接分配块(浪费空间!!!)
- 软连接里记录路径字符串,所以软链接的size就是路径字符串的长度
- stat的-L选项跟进符号链接