概要:本文是个人零碎时间整理的一些知识点,涉及Linux和C++。比较零碎,在此记录一下。
03/18/2018
Linux系统组成部分:内核,shell,文件系统,应用程序。
linux系统中,内核为每个新添加的文件分配一个iNode节点,文件属性保存在iNode里,iNode被复制在内存中,实现对文件的快速访问。
管道文件是一种特殊文件,独立于文件系统,常驻内存,进程通信。
软连接/硬链接:硬链接记录的是目标的iNode,软连接记录的是目标的路径。软连接就像快捷方式,硬链接类似于备份。源文件被删除后,软连接指向无效文件,硬链接则 依然有效;硬链接由于iNode的原因,只能指向本分区的文件,不能给目录创建硬链接,而软连接可以跨分区。
linux的分区和目录:
- 分区是物理的,目录是逻辑的,分区必须挂载在一定的目录上才能正确使用;
- Linux分区分为主分区,拓展分区:主分区不用再次划分,可以直接使用,拓展分区可以再分,再分后的分区称逻辑分区,可以理解为拓展分区是逻辑分区的容器,只有主分区和逻辑分区才存储数据;
- 主分区不论多少取值只在1-4,5+提供逻辑分区使用;sd指scsi/sata硬盘,hd指ide硬盘,a-z指示第几块硬盘,后面的数字代表分区号。
- 创建分区:fdisk,分区上创建文件系统:mkfs, 查看内存:free
Linux文件类型:
- 普通文件
- 目录文件
- 设备文件(块设备,字符设备)
- 链接文件
- 管道文件
- socket文件
双绞线连接方式:直通线用于连接不同设备,主机–交换机,交换机–路由器;交叉线用于连接相同设备;反转线用于主机连接路由器。
内存分配:页式(内部碎片),段式(外部碎片),请求页式,请求段式。
内部碎片:进程向系统请求内存分配时,系统分配的内存除满足其需求之外,还剩有一部分空闲内存,这部分空间属于该进程,不可被其他进程使用;
外部碎片:两块内存被两个进程占用,但两块内存之间存在一块空闲内存,虽然不属于任何进程,但由于空间太小无法被其他进程利用。
页式分配:内存分页,页面大小由系统固定,当进程请求时,系统按页面分配给进程足够的页面,尽可能大的满足进程需求,此时可能最后一个页面没有被利用完,由此 产生内部碎片。
段式分配:内存分段,段的大小由程序逻辑确定且不固定,进程申请多少,系统就分配多少,比如100K内存,A进程申请60K,剩下40K,然后进程B申请50K,此时40K虽不 属于任何进程,但无法满足进程B的请求,由此产生外部碎片。
/etc/mtab: 记录系统已加载的文件系统
/etc/fstab: 记录系统准备加载的文件系统,存储硬盘分区的相关信息,开机读取设备信息自动挂载,关系fsck,mount命令。
智能指针, 解决堆内存管理问题
auto_ptr,unique_ptr:都采用所有权(ownership)概念,特定对象只能有一个智能指针对象拥有它,区别在于:1)发生赋值时,unique_ptr编译报错,auto_ptr运行出错.2)unique_ptr允许将临时右值(如函数返回值)赋给智能指针。3)unique_ptr有 new/delete [] 版本。
shared_ptr:使用引用计数,赋值时计数+1,过期时计数-1,仅当最后一个指针过期时才调用delete。
03/19/2018
STL初探之vector:内部数组实现,动态内存分配。size()返回元素个数,begin()返回指向第一个元素的迭代器,end()返回指向最后一个元素后一个的迭代器,push_back(const val_type& val)追加元素内容扩充,erase(iter begin,iter end)删除[begin,end)区间的元素。insert(iter in_pos,iter val_begin,iter val_end)从in_pos位置开始插入 [val_begin,val_end)之间的元素。
非成员函数:for_each(iter begin,iter end,function_name func)用func定义的方法遍历[begin,end)之间的元素,要求func函数不能修改元素,只能访问。for(auto x:vector)func(x);效果同for_each,不过func函数可以修改元素。
sort()有两个版本:第一种接受两个迭代器参数,指示排序区间,排序方法使用类型元素定义的<运算符。第二种接受三个参数,前两参数同前,第三个参数指向要使用的函数指针,返回值可转换为bool,false。
random_shuffle()接受两个迭代器,指示随机重排列的区间。
du/df:du查看目录大小,df查看磁盘使用情况。
区别:df记录当前文件系统已存在(不包括被删除数据)的文件使用情况,du记录文件系统所有文件的使用空间。
nohup:允许退出账户后仍运行进程。
Linux用户分类:root(UID=0),系统用户(bin,deamon,adm,ftp,mail;UID1999),普通用户(UID=100060000);
/etc/passwd:任何用户都可以读取
/etc/shadow: 影子文件,不是由passwd文件产生,而是形成互补,只有root可以读取操作
useradd | usermod | userdel; groupadd | groupmod | groupdel
私有组群:只有一个用户(创建用户未指定组时自动创建一个同名的私有组)。标准组:包含多个用户。一个人用户可以存在多个组
su [user] 切换用户,不改shell 环境 ; su - [user] 更改shell 环境;
groups打印所有组; newgrp改变用户的当前工作组。
格式化:清空数据,建立磁道和扇区。linux支持文件系统:xfs,ext4,jfs,msdos,nfs,vfat.
mkfs在分区上创建各种文件系统
路由器每个端口是独立的广播域和冲突域;交换机每个端口是独立的冲突域,所有端口在一个广播域;集线器HUB所有端口在一个冲突域。
ICMP差错报文:时间超时(3),源抑制(11),重定向,终点不可达,参数问题。
不产生差错报告:icmp差错报文,广播或多播报文,链路层广播,非IP分片第一片。
03/20/2018
常规new/定位new: 定位new要使用不同内存单元,确保不重叠;delete可以与常规new搭配,不能与定位new搭配,除非指定内存是常规new出来的;
如何删除定位new指向的对象呢?答:显式调用析构函数。
指针即迭代器。 因此STL算法也适用于非STL容器(如数组,对象),只要在相应迭代器参数位置提供指针,超尾标识。
copy(iter begin,iter end,iter copy_start) //前两个是输入迭代器,最后个是输出迭代器
ostream_iterator
istream_iterator
指定cin输入流 无参表示输入失败 接收起始位置
预定义迭代器:
- ostream_iterator
- istream_iterator
- reverse_iterator
- back_insert_iterator
- front_insert_iterator
- insert_iterator
vector.rbegin()返回指向超尾的反向迭代器,意思是递增操作导致递减,它和end()返回的值一样,但类型不一样; 逆向输出copy(v.rbegin(),v.rend(),out_iter)
vector.rend()返回指向第一个元素的反向操作器
pr=v.rbegin();pr指向超尾,不是一个有效数据,*pr是什么呢? 策略:对反向迭代器,先递减再解引用
copy目标容器空间不足时不做动态内存分配。此时可以使用插入完成复制的功能;
back_insert_iterator–vector; front_insert_iterator–queue; insert_iterator–不限制
back_insert 模板参数:容器类型 构造函数参数:容器标识符
front_insert 同上,构造函数多一个指示插入位置的迭代器参数;
insert 同front_insert.
交换分区,即虚拟内存,一般是物理内存的1~2倍,内存越大,倍数越小。
虚存和cache:cpu<-->cache<-->内存<-->(虚存)<-->外存:
cache侧重cpu和主存之间的速度问题,虚存侧重内存的存储容量问题;cpu与cache,主存之间都有之间通路,而虚存在外存上,不存在直接数据通路;
cache是硬件机构,虚存则由软件实现。
systemd 是Linux系统所有进程的发起者和控制者,pid=1
MBR主引导记录,包括引导加载程序GRUB和分区表
dns欺骗:dns服务器返回错误的解析结果; dns污染:主机(不一定是dns服务器)截留查询报文,使其过期
03/21/2018
Apache服务器区分网站:ip,端口,域名三者之一;
移动构造和复制构造的区别是,移动构造可以修改源对象,转让所有权。
list,vector都是序列,可反转容器
list: remove(),merge(),unique(),sort()
list.splice(iterator pos,list& x)与序列的insert() 区别:insert插入原始区间的副本,而splice将原始区间移到目标地址。
STL底层实现:
- vector、queue、deque、priority_queue、stack(数组)
- list(双向链表),forward_list(单向链表),
- 关联容器(set,multi_set,map,multi_map)树,无序关联(哈希表)
string.c_str() returns a const char* that terminated with null
string.data() works same as c_str() but not include null character
string.copy(p,n,off=0)
03/23/2018
主机序/网络序:网络数据传输都使用大端序,主机多采用小端序(低字节存低地址),不过有的操作系统也使用大端
STL初探之vector array valarray