在64位系统下,分别定义如下两个变量:char *p[10]; char(*p1)[10];请问,sizeof(p)和sizeof (p1)分别值为_80/8___。
重点理解p跟谁结合了,跟[]结合,则p就是一个数组;跟*结合,p就是一个指针;
首先[]()的优先级一样,均大于*
char *p[10],p与[]结合,所以p就是一个数组,数组的元素比较特殊,是指针,指针大小为8,所以是10*8=80;
char(*p1)[10],与*结合,所以是一个指针,大小为8
-----------------------
进程和线程区别,进程通信方式
进程是资源分配的基本单位。
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
进程间的通信方式,
1.管道(包括无名管道和命名管道)
2.消息队列
3.套接字
4.信号
5.共享内存
6.信号量
五种本地IPC通讯方式总结:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,
当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
------------------
线程间通信(同步):1.互斥锁 2. 读写锁 3. 条件变量 4.信号量
----------------------------------------------
内存分配方面:
堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下:new、malloc、delete、free等等。
注意:容易溢出内存
栈:由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
-----------------------
#include
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *p = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(p - 1));
return 0;
}
2,5
————————————————
内核和用户空间通信方式
1.系统调用
2.ioctl接口
3.netlink是一种特殊的socket
4.sysfs(/sys) 是 Linux 2.6 才引入的一种虚拟文件系统
5.procfs(/proc) 是 进程文件系统 的缩写,它本质上是一个伪文件系统
6.sysctl(/proc/sys) sysctl 是一个 Linux 命令,
7.seq_file
8.debugfs
9.relayfs
---
1.系统调用:提供一种便捷的用户和内核间的交互方式,一般用于调试日志以及配置参数
2.虚拟文件系统
proc文件系统
sysfs文件系统
debugfs文件系统
:提供一种便捷的用户和内核间的交互方式,一般用于调试日志以及配置参数
缺点:不够实时,无法传输大数据量 使用:创建proc文件驱动,然后像操作文件一样操作,驱动负责解析应用层的read write 请求
3.ioctl接口:不能交换大量的数据
4.netlink:提供了一组类似于BSD风格的API,用于用户态和内核态的IPC。相比于其他的用户态和内核态IPC机制,
优点:1.使用自定义一种协议完成数据交换,不需要添加一个文件等。2.可以支持多点传送。3.支持内核先发起会话。4.异步通信,支持缓存机制。
缺点:无法传输大数据量,例如视频数据
5.共享内存:效率高,可以交换大量数据,但是进程间的同步复杂
---------------
其中模块参数与sysfs、procfs、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户控件输出信息;
sysctl、系统调用是由用户空间发起的通信机制;
Netlink是基于socket的通信机制,由于socket本身的双共性、突发性、不阻塞特点,因此能够很好的满足内核与用户空间
小量数据的及时交互,因此在Linux 2.6内核中广泛使用,例如SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables,
netfilter与iptables的数据交换就是通过Netlink机制完成。
--------------
比如用192.168.1.0/24网段来划分子网bai:第一段:du192.168.1.0/27, 即掩码为255.255.255.224,主机地zhi址范围:192.168.1.1-192.168.1.30;
第二段:192.168.1.32/27,主机地址范围:192.168.1.33-192.168.1.62;
第三段:192.168.1.64/27,主机地址范围:192.168.1.65-192.168.1.94;
第四段:192.168.1.96/27,主机地址范围:192.168.1.97-192.168.1.126;
第五段:192.168.1.128/27,主机地址范围:192.168.1.129-192.168.1.158;
第六段:192.168.1.160/27,主机地址范围:192.168.1.161-192.168.1.190。
-----------------------
由于Linux进程分为用户空间和内核空间两个部分,它有时运行于用户空间,有时运行于内核空间,因此为了保护各自的现场数据,一个进程还需要两个堆栈:用户堆栈和系统堆栈
----------------------
.用户态如何切换到内核态?
用户态切换到内核态分两种:主动式和被动式
被动式:就是Linux在用户态(ARM在用户模式)工作,没有主动发起请求、而被动地进入内核态;包括硬件中断和程序异常。
主动式:就是Linux在用户态(ARM在用户模式)工作,通过发起用户态程序发起命令请求、ARM响应进入特权模式进而Linux切入内核态;就是系统调用。
---------------------------------
.用户态->系统调用->软中断->系统调用中断服务程序(传入系统调用号)->对应驱动程序。
--------------------------------------------
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
#include "stdafx.h"
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点。
//
#include
#include
using namespace std;
void print(vector
{
for (int i = 0;i < vec.size();++i)
{
cout << vec[i] << " ";
}
}
int main()
{
vector
vector
int num;
int flag;
cin >> num;
if (num > 1000)
{
flag = 1000;
num = 1000;
}
else
{
flag = num;
}
while (flag != 0)
{
flag--;
sources.push_back(flag);//从大到小存数据
}
//循环终止条件
int i = sources.size()-3;
int deleteNum= 0;//记录删除节点的个数
temp = sources;
while (sources.size() != 1)
{
// temp.clear();
num = 0;
while (i>=0)
{
temp.erase(temp.begin() + i );
i = i -3 ;
}
//cout << "sources:"; print(sources);cout << endl;
// cout << "temp:"; print(temp);cout << endl;
if (i== -1)
{
i = temp.size()-1;
}
else if (i == -2)
{
i = temp.size() - 2;
}
else
{
i = temp.size() - 3;
}
sources = temp;
}
cout << sources[0] << endl;
return 0;
}
//注意:遇到中循环删除指针的问题,可以倒着删除
------------------
单任务 c/s模式下 TCP、UDP通信的一般流程
应用层:socket fd
传输层:port
网络层:ip
-------
基于TCP的协议对应的应用层协议:
FTP:文件传输协议,使用端口21
Telnet:一种远程登录的端口,23.
SMTP:邮件传送协议,用于发送邮件,端口:25
POP3:用于发送邮件。端口110
HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
基于UDP的协议:
DNS:域名解析协议,将域名转换位IP地址,端口号:53
SNMP:简单网络管理协议:使用161号端口,是用来管理网络设备的
TFTP:简单文件传输协议,该协议在熟知端口69上使用UDP服务
---------------------
参考
https://blog.csdn.net/u012247418/article/details/80555416?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase
https://blog.csdn.net/QQ2558030393/article/details/96307590?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase
https://blog.csdn.net/vertor11/article/details/79622694?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase
https://blog.csdn.net/Ivan804638781/article/details/79892619
https://blog.csdn.net/qq_38410730/article/details/81173170
https://blog.csdn.net/qq_42787645/article/details/102527123