linux知识点回顾
来源:互联网 发布:单片机仿真需要程序吗 编辑:程序博客网 时间:2024/05/29 09:54
1.Linux对内存的结构描述 1.1/proc/${pid}/ 存放进程运行时候所有的信息(包括内存结构) 任何程序的内存空间分成4个基本部分 代码区 全局栈区 堆 局部栈 进程查看 ps aue2.理解程序的变量与内存空间的关系 结论: 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的数据包。 “多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。” -------这个适用场景是,各个进程之间通讯交互少,藕荷少,很适合多进程方式 “多线程是平面交通系统,造价低,但红绿灯太多,老堵车。” -------这个原因是业务决定了,各模块间交互频繁,藕荷性高,适合多线程。
0 0
- linux 知识点回顾
- linux知识点回顾
- DOS命令回顾及Linux知识点
- 知识点回顾
- 知识点回顾
- 知识点回顾
- 知识点回顾
- 面试知识点回顾
- 汇编语言 知识点回顾
- java 知识点回顾
- c++知识点回顾
- java 知识点回顾2
- C++ 基本知识点回顾
- servlet知识点回顾
- Java知识点回顾一
- hibernate知识点回顾
- Android知识点回顾
- web知识点回顾
- 短小精干,大道至简-----Sikuli截图尝试
- Android优化之bitmap图片
- Java abstract class vs interface
- UI控件
- [win7系统]telnet服务
- linux知识点回顾
- 图片上传,android ios Java服务器整合
- c++ primer读书笔记-第六章 语句
- iOS并发编程指南
- hmac-sha1加密算法C源码示例
- c/c++模板的定义和实现分开的问题(一)
- [Binary Hacking] ABI and EABI
- Java基础:数组
- socket的半包,粘包与分包的问题