示例三
结果为222
示意图
1、在执行func1的时候 会创建一个形参p即p2的副本 2、p和p2 指向同一个堆中对象 属性id=111 3、通过p指针修改对象的属性id为222 4、执行完func1 释放圈红部分内存 5、此时对象的id属性值为222
Linux用户态、内核态
程序处理的状态在运行过程中可能处于内核态也可能处于用户态 可能某一时刻处于用户态下一时刻切换到内核态
用户态在什么情况下能切换到内核态呢即触发条件
1、内核态的相关操作执行完了就会退回到用户态 2、外部资源: 打开机箱盖 放眼望去都是属于外部资源 内存条 网卡 磁盘 主板上的声卡 主板上的网卡 主板上的usb外设 主板上的声光同步的LED 想要操作这些硬件的话 都需要从用户态切换到内核态 比如读写文件(系统调用 open read write(系统调用的名称同时也是c语言内置的函数的名称))的时候 就会触发用户态到内核态 3、申请内存(堆内存) c语言通过malloc(c语言内置函数名称并没有一个系统调用名称与之对应)
分配内存 malloc
两者是虚拟内存空间并不是主存物理内存空间 真正拿到物理内存空间还要在第一次访问的时候 发现虚拟内存地址没有映射到物理内存地址 于是触发一个叫缺页中断(也叫缺页异常) 操作系统中的中断和异常有很多类似的地方 java在new对象的时候也经历了这样的过程
brk
小于128k内存申请调用brk
mmap
在内存的堆空间游标到栈最小内存地址之间申请内存
最常见就是系统调用
在linux系统通过man syscalls查看所有的系统调用命令 1、accept:套接字客户端连接套接字 2、bind套接字服务端监听端口 3、brk是macloc的一种实现形式 是申请内存的 4、chmod、chown、open、read、write 这些命令都是对文件进行操作 5、 open read wirte 也是对磁盘的操作也可以归为设备类,设备类还比如io、control 6、进程 fork 当前程序中再创建一个进程;exit进程退出 7、c语言打开文件用的是fopen fopen是一个库函数 并不是一个直接的系统调用 open是一个系统函数 fopen里面封装了open api比较原生 写起来比较复杂 fopen写起来比较简单
信息
比如获取当前cpu信息(getcpu)、操作系统信息 对应的函数getxxx
通信
通讯 进程之间的通信 pipe(管道)建立文件和内存的映射mmap mmap也属于设备类