1.Linux对内存的结构描述
1.1/proc/${pid}/ 存放进程运行时候所有的信息(包括内存结构)
任何程序的内存空间分成4个基本部分
代码区 全局栈区 堆 局部栈
进程查看 ps aue
2.理解程序的变量与内存空间的关系
结论:
1.内存分四个区.
2.各种变量对应存放区
3.堆栈是一种管理内存的数据结构.
4.查看程序的内存地址.
3.理解malloc的工作的原理
malloc使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.
对malloc分配的空间不要越界访问.因为容易破坏后台维护结构.导致malloc/free/calloc/realloc不正常工作.
4.C++的new与malloc的关系
malloc new new[]
realloc new()
calloc new[]
free delete delete[]?
结论:new的实现使用的是malloc来实现的.
区别:new使用malloc后,还要初始化空间.
基本类型,直接初始化成默认值.
UDT类型,调用指定的构造器
delete调用free实现.
delete负责调用析构器.然后在调用free
new与new[]区别
new只调用一个构造器初始化.
new[]循环对每个区域调用构造器.
delete 与delete[]
5.函数调用栈空间的分配与释放
5.1.总结:
1.函数执行的时候有自己的临时栈.
2.函数的参数就在临时栈中.如果函数传递实参.则用来初始化临时参数变量.
3.通过积存器返回值.(使用返回值返回数据)
4.通过参数返回值.(参数 必须是指针)
指针指向的区域必须事先分配.
5.如果参数返回指针.参数就是双指针.
5.2.__stdcall __cdecl __fastcall
1.决定函数栈压栈的参数顺序.
2.决定函数栈的清空方式
3.决定了函数的名字转换方式.
2文件的属性
1.属性的表达方式:绝对模式,字符模式
0 0 0 0
拥有者 组 其他用户
0666
2.文件的权限属性:
读 写 执行
粘附位权限 用户设置位权限 组设置位权限
0 0 0 0 0
特殊权限 Owner group 其他用户
s:
S
t
T
2.1. s设置位
2:组设置位
4:用户设置位
s对执行有效
无效的设置位使用S表示
设置位向其他用户开放拥有者权限的权限.用户设置位
设置位向其他用户开放组用户权限的权限.组用户设置位
设置位只对执行程序有意义(执行权限有意义)
2.2. t设置位
1:表示沾附位设置
t对写文件有意义
没有执行权限的沾附位使用T表示.
沾附的目的:防止有些权限的用户删除文件.
程序在执行的时候到底拥有的是执行者用户的权限
还是文件拥有者的权限.
程序执行中有两个用户:
实际用户
有效用户
总结:
沾附位的作用: 防止其他有写权限用户删除文件
设置位的作用: 向其他执行者开发组或者用户的权限.
3、与进程创建有关的函数及其区别。
int system(const char*filename);
建立独立进程,拥有独立的代码空间,内存空间。等待新的进程执行完毕,system才返回.(阻塞)
popen:创建子进程 在父子进程之间建立一个管道。
exec系列函数: 替换当前进程的代码空间中的代码数据。
pid_t fork(); 1.创建进程2.新进程的代码是什么:克隆父进程的代码而且克隆了执行的位置.3.在子进程不调用fork所以返回值=0; 4.父子进程同时执行。
4进程
1.父子进程的关系
独立的两个程 互为父子关系;
2.问题:
2.1.父进程先结束?
子进程就依托根进程init:孤儿进程
孤儿进程没有任何危害.
2.2.子进程先结束?
子进程会成为僵死进程.
僵死进程不占用内存,CPU.但在进程任务管理树占用一个节点.
3 僵死进程造成进程名额资源浪费.
所以处理僵死进程,僵死进程使用wait回收。
4.父进程怎么知道子进程退出?
子进程结束通常会向父进程发送一个信号
SIGCHLD
5.父进程处理子进程退出信号
signal(int sig,void(*fun)(int));
向系统注册:只要sig信号发生,系统停止进程,并调用函数fun
当函数执行完毕,继续原来进程
5.1.实现处理函数
5.2.使用signal邦定信号与函数
进程的数据交换,基于两种方式:
内存:有序/无序:mmap
文件:有序/无序:普通文件
基于内核对象:文件.内存.队列
5信号
Shell 中是 kill –l linux API中的 int kill(pid_t pid,int s)
作用:通知其他进程响应。进程之间通信机制.
信号:接受信号的进程马上停止.调用信号处理函数.
信号处理函数: 默认处理函数. 打印信号信息,退出进程.
用户处理函数.
可靠信号和非可靠信号 信号的屏蔽了解sigpending与 sigsuspend的使用.
IPC:
1.基于文件
1.1.无序文件
1.1.有序文件
1.1.1.管道
1.1.1.1.有名
1.1.1.2.匿名
1.1.2.socket
2.基于内存
2.1.无序内存
2.1.1.匿名内存
2.1.2.共享内存
2.2.有序内存
2.2.1.共享队列
3.同步:基于内存IPC应用(共享内存数组)
信号量/信号灯
管道文件
1.创建管道mkfifo
2.体会管道文件特点
案例:
fifoA fifoB
建立管道
打开管道 打开管道
写数据 读数据
关闭管道 关闭管道
删除管道
建立管道文件:
使用linux的指令mkfifo
总结:
1.read没有数据read阻塞,而且read后数据是被删除 2.数据有序
3.打开的描述符号可以读写(two-way双工) 4.管道文件关闭后,数据不持久.
5.管道的数据存储在内核缓冲中.
在父子进程之间:打开文件描述后创建进程. 父子进程都有描述符号. 管道文件没有价值,
所以在父子进程中引入一个没有名字的管道:匿名管道.
结论:
匿名管道只能使用在父子进程.
基于文件的通信
1.普通文件(io/mmap)
2.有名管道文件
3.匿名管道
4.Socket
基于内存的通信
1.普通的父子进程之间的匿名内存共享影射
2.内核共享内存
编程模型
2.1.创建共享内存,得到一个ID shmget
2.2.把ID影射成虚拟地址(挂载) shmat
2.3.使用虚拟地址访问内核共享内存 使用任何内存函数与运算符号
2.4.卸载虚拟地址 shmdt
2.5.删除共享内存 shctl(修改/获取共享内存的属性)
3内核共享队列(有序)
编程模型:
3.1.创建共享队列/得到队列msgget
3.2.使用队列(发送消息msgsnd/接收消息msgrcv)
3.3.删除队列msgctl
网络
2. OSI七层 TCP/IP
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口层
物理层
3.网络上用的是big endian(大端模式),所以有时候小端的计算机要字节序转换。
4. Socket:
服务器: 客户端:
1.创建socket() 1. .创建socket()
2.bind()绑定IP、端口号到socket 2.设置IP,端口号
3.设置允许最大连接 listen() 3.connect()连接服务器
4.等待连接请求 accept() 4.收发数据 write(),read()
5. 收发数据 read(),write() 5.关闭网络连接
6.关闭网络连接
网络常用的命令:
Ping netstat route lsof
2.TCP/UDP编程
对等模型:AF_INET SOCK_DGRAM 0:UDP
C/S 模型:AF_INET SOCK_STREAM 0:TCP
2.1.UDP编程的数据特点
UDP采用对等模型SOCK_DGRAM
socket socket:socket
绑定IP地址bind 连接目标(可选) conncect
read/recv/recvfrom 发送数据 write/send/sendto
关闭close
upd和tcp的区别
tcp协议和udp协议的差别
TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
应用场合 传输大量数据 少量数据
速度 慢 快
TCP服务器编程模式
TCP的服务器端维护多个客户的网络文件描述符号.
对服务器多个客户描述符号同时做读操作,是不可能.需要多任务模型完成.
多任务模型?
1.多进程
2.IO的异步模式(select模式/poll模式)
3.多线程模式
4.多进程池
5.线程池
TCP的服务器(在案例中使用浏览器作为客户程序)
socket建立服务器的文件描述符号缓冲
bind把IP地址与端口设置到文件描述符号中
listen负责根据客户连接的不同IP与端口,负责生成对应的文件描述符号及其信息
accept一旦listen有新的描述符号产生就返回,否则阻塞。
HTTP协议以及应用
1.HTTP协议版本HTTP1.0 HTTP1.1
2.HTTP是应用协议
3.HTTP协议分成:
请求协议
响应协议
4.请求协议的格式:
请求行(请求方法 请求资源 协议版本)
请求体(请求头:请求值)
空行
数据(querystring:key=value&key=value)
5.响应协议的格式
响应行(协议版本 响应码 响应码的文本描述)
响应体(响应头: 响应值)
空行
数据(普通数据/分块数据)
1XX 正在处理
2XX 响应成功200
3XX 继续处理
4XX 客户错误
5XX 服务器错误
多线程的库:
libpthread.so -lpthread
int pthread_join(
pthread_t tid,//等待子线程结束
void **re);//子线程结束的返回值
2.创建子线程后,主线程继续完成系统分配时间片。
3.子线程结束就是线程函数返回。
4.子线程与主线程有同等优先级别.
结束线程
内部自动结束:(建议)
return 返回值;(在线程函数中使用)
void pthread_exit(void*);(在任何线程代码中使用) 外部结束一个线程.
pthread_cancel(pthread_t)
多线程的问题 数据脏
解决的办法: 互斥量(互斥锁) mutex
二.多线程同步
互斥量/信号/条件量/信号量/读写锁
1.sleep与信号 2.条件量
pthread_kill向指定线程发送信号 信号量类似
signal注册的是进程的信号处理函数. 2.1.定义条件量
pthread_kill+sigwait控制进程 2.2.初始化条件量
1.1.定义信号集合 2.3.等待条件量
1.2.初始化信号集合 2.4.其他线程修改条件量
1.3.等待信号 2.5.释放条件量
1.4.其他线程发送信号
1.5.清空信号集合
调度算法:
1.先来先服务
2.短进程优先
3.高优先级先调度(linux中-20-19,数字越小,优先级越高。Windows中想反)
4.时间片轮转法
死锁:A有一要二,B有二要一
(IPC)进程间通信:目的:1.发数据。2.共享资源。3.通知事件。4.进程控制
ping命令工作原理
ping命令主要是用于检测网络的连通性。
Ping命令发送一个ICMP请求报文给目的IP,然后目的IP回复一个ICMP报文。
原理:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。
因为ping命令是使用ICMP协议,所以没有端口号,但是有两个域:类型和代码。
traceroute工作原理
traceroute是利用ICMP及IP头部的TTL。首先,traceroute送出一个TTL是1的IP数据包(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器收到IP数据包时,将TTL减1。此时,TTL变为0,所以将该路由器会将此IP数据包丢掉,并返回一个ICMP数据包(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),当traceroute收到这个消息后,接着继续发生TTL为2的IP数据包给第二个路由器。以此类推,直到IP数据包达到最后一台路由器时,会返回一个ICMP echo reply的数据包。
“多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。”
-------这个适用场景是,各个进程之间通讯交互少,藕荷少,很适合多进程方式
“多线程是平面交通系统,造价低,但红绿灯太多,老堵车。”
-------这个原因是业务决定了,各模块间交互频繁,藕荷性高,适合多线程。
linux知识点回顾
最新推荐文章于 2024-08-12 22:45:00 发布