波奇学专题

波奇学Linux:ip协议

ip报头是c语言的结构体 报头和有效载荷如何分离? 固定长度+四位首部长度 4位版本号就是IPV4 8位服务类型:4位TOS位段和位保留字段 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本 给路由器提供转发依据,相互冲突只能选择一个 8位协议:把ip的有效载荷交给上层的哪个协议 构建子网:分配设备ip地址 上面的是内网ip

波奇学Linux:http协议

2 个简单预备知识         https://www.baidu.com/ -域名-字符串-域名解析--ip地址 http请求和响应 格式画出来,两个工具见一见 https协议绑定端口号443 http协议绑定端口号 80 url 统一资源定位符 所有网络的资源都可以用唯一的一个字符串标识,并且可以获取到 少量的情况,提交获取的数据本身可能包含和url冲突的字符,要求bs双方进程

波奇学Linux:网络接口

127.0.0.1本地回环ip,用于本地测试,不会进行网络通信 TCP是面向连接的,服务器比较被动 需要服套接字监听 listen状态  正常通信默认会进行主机序列和网络序列的转换 TcpServer.cc #pragma once#include<iostream>#include<string>#include<cstring>#include<sys/types.h>

波奇学Linux:网络套接字

domain:ipv4 还是ipv6 type:面向字节流还是... 虚拟机 云服务器禁止直接bind公网ip 服务器可以有多个ip,如果只绑定一个ip,只能收到来自一个ip的信息 任意地址绑定 关于port的问题 [0,1024]:系统内定的端口号,一般要用固定的应用层协议,http:80 err string : Permission denied 网络

波奇学Linux:线程安全和自选锁和读写锁

STL不是线程安全的   单例模式的线程安全 自选锁:当线程申请锁失败时,不是挂起,而是一直申请 挂起等待锁 :当线程申请锁失败时,把锁挂起 一般临界区时间短的适合自选锁,长的适合挂起等待锁

波奇学Linux:

死锁 一组进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放资源,而处于一种永久等待的状态 进程一占有资源A不释放,进程二占有资源B不释放,进程一申请资源B,进程二申请资源A,两个进程都属于阻塞状态 形成死锁的条件: 互斥条件:一个资源每次只能被一个执行流使用 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得资源保持不放 不剥夺条件:一个执行流已获得的资源,在未使用完之前

波奇学Linux:线程

线程的概念 进程的一个执行分支,线程执行粒度,要比进程要细 进程的一个执行分支:线程是在进程内部执行,任何执行流都要执行,都要有资源,地址空间是进程的资源窗口,线程共享进程的地址空间。 cpu只关心执行流,对于cpu进程和线程都看作执行流。 线程是操作系统调度的基本单位 进程:内核数据结构(task_struct)+代码和数据->进程是分配操作系统资源的实体(每个线程都分配一点进程的一点

波奇学Linux: 信号捕捉

sigaction:修改信号对应的handler方法 act输入型参数,oldact输出型参数 void (*sa_handler) (int) //修改的自定义函数 sigset_t sa_mask //  void handler(int signo){cout<<"catch a signal, signal number: "<<signo<<endl;}int

波奇学Liunx:信号的产生,保存,处理

信号的产生,信号的保存,信号的处理 在操作系统中进程接受到信号会保存,产生 进程必须识别和能够处理信号,处理信号是进程的内置功能 进程收到信号时不一定会立即执行,所以进程必然有一套识别,保存,处理信号操作 前后台进程 前后台进程:前台进程可以用ctrl + C删掉,后台进程用kill指令。 前后台的区别是进程能否获取键盘输入,且前台进程允许会阻止命令行输入。 (当进程运行,bash进程

波奇学Linux:共享内存

进程通信的前提:不同的进程看到同一份的资源 直接原理:同一块物理内存映射到不同进程的共享区 共享内存拆解: 1.申请内存,通过页表映射到进程地址空间 2.返回首地址,便于进程利用 3.释放共享内存,去关联 4.内存的申请必须要系统调用,确保空间不是私有的 5.利用先管理再组织,不难猜到内核有个struct结构体管理起来 申请共享内存系统调用接口 size_t 创建共享内存大小

波奇学Linux:动态库加载和进程通信

进程加载的地址 逻辑地址加载到物理内存时,每一条指令有自己的地址。此时指令有逻辑地址和物理地址 如何执行第一条指令? 代码有entry入口地址,cpu的eip寄存器保存入口地址,进程获得入口地址后运行,同时页表建立物理地址和虚拟地址的映射关系,然后开始执行代码。 cpu读取的地址时虚拟地址,虚拟地址经过页表映射变成物理地址。 动态库的地址:相对偏移地址 动态库被加载到固定地址空间

波奇学Linux:动静态库

创建静态库 Makefile文件 mymath.c文件   mymath.h文件 编译main.c文件 gcc 编译时会把在系统目录中寻找头文件和库文件,文件不在系统目录中用参数 -I 头文件所在文件夹/ -L 库的地址文件夹 -l+除去lib和后缀。 拷贝文件到系统目录即可不用参数 库的安装类似于把头文件和库文件拷贝到系统文件中 库可以提供一个全局变量,

波奇学Linux:软硬链接

ln指令建立链接 软链接 硬链接 所属者的前的数字表示硬链接数,引用计数,file.txt和soft_link是软链接所以都为2 软链接有独立inode,硬链接没有,所以硬链接不是独立文件,软链接是独立文件,且硬链接的属性会保持一致。 所谓的硬链接本质是在特定目录的数据块中新增文件名和指向的文件的inode编号的映射关系。 即多个不同的文件名指向同一个inode 任意一个

波奇学Linux:文件系统

磁盘认识 磁盘被访问的基本单元是扇区-512字节。 磁盘可以看成多个同心圆,每个同心圆叫做磁道,多个扇区组成同心圆。 我们可以把磁盘看做由无数个扇区构成的存储介质。 要把数据存到磁盘,先定位扇区,用哪一个磁头,哪一个磁道。 磁盘抽象 磁盘可以抽象成线性结构,基于扇区的数组,任意一个扇区都有抽象地址LBA,相当于数组下标。 磁盘寻址是CHS(磁道,磁头,扇区),通过扇区的抽象地址LBA

波奇学Linux:文件缓冲区

问题导入 文件流输出直接向显示器和重定向文件有不一样的表现 分别向显示器文件输出四个语句,最后fork创建子进程。 当程序运行时和程序重定向到文件中,输出的内容不一样。 重定向时c库函数(printf,fprintf,fwrite)调用了两次,而系统调用write函数只调用了一次 关闭对应的虚拟文件,只有系统调用可以输出 屏蔽系统调用,同时关闭显示器对应的虚拟文件 运行程

波奇学Linux:文件重定向和虚拟文件系统

重定向 文件描述符所对应的分配规则,从0开始,寻找最小没有使用的数组位置。 如图所示,关闭文件描述符的0,新打开的文件描述符为0,而关闭2,文件描述符为2。 重定向:文件输出的对象发生改变 例子 如图,write的参数fd是1,即向显示器文件打印内容,如果close(1)则,1对应新的文件 输出的对象由显示器变成新文件log.txt。实现了重定向。 本质上是files_str

波奇学Linux:Linux进程状态,进程优先级

编写一个程序模拟进程 查看进程状态 修改代码后发现进程状态为由S+变成R+  R为运行态,S为阻塞态 第一次为S是因为调用了外设(printf调用屏幕外设),实际上应该为R,S状态轮换,但是R太快了,所以每次查到了都为S。 R+为前台运行,运行bash指令无反应。 R加入& 为后台运行,可以运行bash指令,此时只能用kill指令来取消进程 大部分的程序都

波奇学Linux:进程等待

僵尸进程(Z状态)无法被kill指令杀死,通过进程等待杀掉它,解决内存泄漏问题(进程处于僵尸态,仍然维护pcb结构体来解决问题) 通过进程等待,获得进程退出情况 wait回收僵尸态进程   我们可以看到进程由五秒后子进程从僵尸态销毁,wait可以杀掉僵尸态的进程 wait每次只能回收一个僵尸进程 循环等待回收多个僵尸态进程 阻塞等待 如果子进程不是僵尸态,父进程

波奇学Linux:进程终止

写时拷贝底层原理图   子进程谁先运行,由调度器决定 进程退出场景 代码运行完毕,结果正确:有返回值,返回0 代码运行完毕,结果不正确:有返回值,返回非0 代码异常终止。没有返回值 return 0的含义 0 表示进程的退出码,表示进程运行结果是否正确,0->success 0会给父进程拿到,父进程可以根据退出码,提醒用户出错原因 可以用不同的返回值数字,表示不同的出错原因

波奇学Linux:环境变量,本地变量和内建命令

Windows下的环境变量 echo $PATH 查看指令搜索命令路径 在bash命令行输入的指令,系统根据PATH中的路径查询。 增加PATH指令 $PATH等于上面的路径 :表示不同路径分割符 /home/boki/lesson13代表新的路径 相当于一个赋值语句。 相当于指令,可以直接使用。 env命令查看环境变量 HISTSIZE=1000,xhell

波奇学C++:类型转换和IO流

隐式类型转换 int i=0;double p=i; 强制类型转换 int* p=nullptr;int a=(int)p; 单参数构造函数支持隐式类型转换 class A{public:A(string a):_a(a){}private:string _a;};A a("xxxx"); //"xxx" const char* 隐式转换为string 多参数也可以通过{

波奇学C++:类型转换和IO流

隐式类型转换 int i=0;double p=i; 强制类型转换 int* p=nullptr;int a=(int)p; 单参数构造函数支持隐式类型转换 class A{public:A(string a):_a(a){}private:string _a;};A a("xxxx"); //"xxx" const char* 隐式转换为string 多参数也可以通过{

波奇学C++:智能指针(二):auto_ptr, unique_ptr, shared_ptr,weak_ptr

C++98到C++11:智能指针分为auto_ptr, unique_ptr, shared_ptr,weak_ptr,这几种智能都是为了解决指针拷贝构造和赋值的问题 auto_ptr:允许拷贝,但只保留一个指向空间的指针。 管理权转移,把拷贝对象的资源管理权转移给拷贝对象,导致被拷贝对象悬空,不能访问出问题 ap1置空 auto_ptr<Test> ap1(new Test());aut

波奇学C++:functional包装器和智能指针(一)

functional包装器 相当于适配器,用于对可调用对象(函数指针,仿函数,lambda)进行封装,使得他们的类型统一。 double func(double d){return d / 4;}struct func1{double operator()(double d){return d / 4;}};int main(){function<double(double)>

波奇学C++:哈希

哈希本质是的值和位置建立关联起来,这种关联关系就是哈希函数 示例:除留余数:对输入的数字取模。 哈希冲突:多个不同的值指向同一个位置 解决方法: 闭散列:开发地址法。 把24放在下一个位置 哈希桶 闭散列法 闭散列的负载因子:表元素个数/散列表长度(size),当负载因子达到一定范围时就进行扩容。 扩容会涉及重新映射,取模的范围变大了。 闭散列的元素搜索:闭散列

波奇学C++:用红黑树模拟实现map和set

用同一个树的类模板封装map(key/value)和set(key) 红黑树的Node template<class T>struct RBTreeNode{RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;T _data;Colour _col;RBTreeNode(const T& data):_left