Linux&C++学习随笔

概要:本文是个人零碎时间整理的一些知识点,涉及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_iteratorout_iter(cout,” “) // 通常将out_iter用作copy函数的最后一个参数,显示容器内容。

istream_iteratorin_iter(cin) copy(istream_iterator(cin),istream_iterator(),in_arr.begin())

指定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底层实现:

  1. vector、queue、deque、priority_queue、stack(数组)
  2. list(双向链表),forward_list(单向链表),
  3. 关联容器(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

你可能感兴趣的:(Linux&C++学习随笔)