如何理解c/c++和php语言的区别(11)


6.32位系统一个进程最多有多少堆内存
32位意味着4G的寻址空间 , Linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身 , 成为“系统空间” , 而较低的3G字节(从0x00000000到0xbffffff)用作各进程的“用户空间” 。每个进程可以使用的用户空间是3G 。虽然各个进程拥有其自己的3G用户空间 , 系统空间却由所有的进程共享 。从具体进程的角度看 , 则每个进程都拥有4G的虚拟空间 , 较低的3G为自己的用户空间 , 最高的1G为所有进程以及内核共享的系统空间 。实际上有人做过测试也就2G左右 。
7.写一个c程序辨别系统是64位 or 32位
void* number = 0; printf("%dn",sizeof(&number));
输出8就是64位 输出4就是32位的 根据逻辑地址判断的
8.写一个c程序辨别系统是大端or小端字节序
union{ short value; char a[sizeof(short)];}test;
test.value= https://www.isolves.com/it/cxkf/yy/C/2021-12-15/0x0102;
if((test.a[0] == 1) && (test.a[1] == 2)) cout << "big"<<endl; else cout << "little" << endl;
9.信号:列出常见的信号 , 信号怎么处理?
1).进程终止的信号 2).跟踪进程的信号 3).与进程例外事件相关的信号等
对于信号的处理或者执行相关的操作进行处理或者直接忽略
10.i++ 是否原子操作?并解释为什么?
答案肯定不是原子操作 , i++主要看三个步骤
首先把数据从内存放到寄存器上 , 在寄存器上进行自增处理 , 放回到寄存器上 , 每个步骤都可能会被中断分离开!
11.说出你所知道的各类linux系统的各类同步机制(重点) , 什么是死锁?如何避免死锁(每个技术面试官必问)
1).原子操作 2).信号量(其实就是互斥锁也就是锁的机制)3).读写信号量(就是读写锁) 4).自旋锁 5.内核锁 6).顺序锁
死锁就是几个进程申请资源 , 出现了循环等待的情况!
避免死锁的方法:
1).资源是互斥的 2).不可抢占 3)占有且申请 4).循环等待
12、exit() _exit()的区别?
13、如何实现守护进程?
1)创建子进程 , 父进程退出
2)在子进程中创建新会话
3)改变当前目录为根目
4)重设文件权限掩码
5) 关闭文件描述符
6) 守护进程退出处理
当用户需要外部停止守护进程运行时 , 往往会使用 kill命令停止该守护进程 。所以 , 守护进程中需要编码来实现kill发出的signal信号处理 , 达到进程的正常退出 。
14、linux的任务调度机制是什么?
Linux 分实时进程和普通进程 , 实时进程应该先于普通进程而运行 。实时进程:
1) FIFO(先来先服务调度)
2) RR(时间片轮转调度) 。
每个进程有两个优先级(动态优先级和实时优先级) , 实时优先级就是用来衡量实时进程是否值得运行的 。非实时进程有两种优先级 , 一种是静态优先级 , 另一种是动态优先级 。实时进程又增加了第三种优先级 , 实时优先级 。优先级越高 , 得到CPU时间的机会也就越大 。
15、标准库函数和系统调用的区别?
系统调用:是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口 , 即就是设置在应用程序和硬件设备之间的一个接口层 。inux内核是单内核 , 结构紧凑 , 执行速度快 , 各个模块之间是直接调用的关系 。linux系统上到下依次是用户进程->linux内核->硬件 。其中系统调用接口是位于Linux内核中的 , 整个linux系统从上到下可以是:用户进程->系统调用接口->linux内核子系统->硬件 , 也就是说Linux内核包括了系统调用接口和内核子系统两部分;或者从下到上可以是:物理硬件->OS内核->OS服务->应用程序 , 操作系统起到“承上启下”作用 , 向下管理物理硬件 , 向上为操作系服务和应用程序提供接口 , 这里的接口就是系统调用了 。
库函数:把函数放到库里 。是把一些常用到的函数编完放到一个lib文件里 , 供别人用 。别人用的时候把它所在的文件名用#include<>加到里面就可以了 。一类是c语言标准规定的库函数 , 一类是编译器特定的库函数 。


推荐阅读