c语言编译原理及IPC通信经典面试题

来源:互联网 发布:fps录像软件 编辑:程序博客网 时间:2024/05/30 23:33

1. 1 大致描述一个进程在内存中的分布情况

1)代码区:储存程序代码

2)data段:已初始化的全局变量和static变量以及常量字符串。程序结束后自动释放

3)bss段:未初始化的全局变量和static变量

4)栈区:局部变量

5)堆区:程序中动态分配的内存

代码区

data段

bss段

堆区

 

栈区

1.2 heap和stack的区别

heap(堆区)stack(栈区)  并不是数据结构中的堆和栈
堆区空间需要自己开辟自己释放,栈区由系统自动分配和释放

2.  如何查看一个正在运行的程序的内存分布

终端输入命令cat /proc/[pid]/maps

maps文件保存的就是进程内存分布情况。

3.  如何在一个程序里创建一个新进程

fork():子进程和父进程运行顺序无法确定

vfork():父进程会阻塞,等待子进程调用exec或exit之后,父进程才会运行。若子进程的运行需求于父进程的下一动作,则会导致死锁。

4.  进程间哪些资源是共享的,哪些是独有的

fork()后的父子进程会共享正文段和文件共享,不共享数据段和堆栈空间。

5.  进程间有哪些通信机制(IPC)

1)管道:

   (1)  只能用于公共祖先的两个进程

   (2)  pipe()创建匿名管道;mkfifo创建有名管道FIFO.

2)消息队列

    (1)ftok -> key_t   获取key值

    (2)msgget -> mgid  得到一个实例消息队列

    (3)msgrcv/msgsen   接收发送数据

    (4)msgctl         销毁

3)共享内存

    (1)shmget     获取实例(key,大小,要求)

    (2)shmat      映射地址

    (3)shmdt      解除映射

    (4)shmctl     移除

4)信号量:是一个计数器,为多个进程提供对共享数据对象的访问,常作为锁,防止多个进程同时访问一个资源

5)信号量数组

    (1)ftok       获取key值

    (2)semget     得到实例(key,信号量个数,要求)

    (3)semop      操作

    (4)semctl     放置信号灯/销毁

 

6.按下ctrl+c会导致进程结束,为什么?

   给前台进程发送信号:SIGINT信号,(2)号信号

7.如果在bash里输入./a.out回车之后发生了哪些事情

bash调用fork()创建一个子进程,在子进程中执行a.out,并等待子进程结束

(1)  bash调用fork()

(2)  sys_execve进行参数的检查复制

(3)  do_execve检查文件是否存在

(4)  prepare_binprm进行文件格式判断

(5)  search_binary_handler根据文件格式搜索装载程序

(6)  load_elf_binary装载程序开始执行可执行文件

8.如何在一个程序里创建一个新线程

    pthread_creat()

    由于pthread库不是linux默认库,所以编译时要加-lpthread

9.线程间哪些资源是共享的?哪些是独有的?

   线程共享gid,uid,文件描述符,堆空间。

   线程有独立的栈,局部变量,寄存器,程序计数器,线程ID。

10.线程同步有哪些机制?

   互斥量:引入锁,得到锁的执行操作,未得到锁的等待,不能共享数据。

    条件变量:触发条件才会执行,等待条件挂起线程直到其他线程触发条件

    信号量

11.描述网络协议的分层概念,以及常用TCP/IP协议族的大致框架结构

osi七层结构

TCP/IP四层

应用层

应用层(http/ftp)

表示层

传输层(udp,tcp)

会话层

网络层(ip)

网络层

数据链路层

传输层

 (物理层)

数据链路层

 

 物理层

 

12.简述TCP/IP协议簇中的TTL,SEQ,SYN,ACK,FIN,MTU是什么?

    TTL:网络数据包的生存周期

    SEQ:

    SYN:表示建立连接(TCP格式段的标志位)

    ACK:表示响应 (TCP格式段的标志位)

    FIN:关闭连接(TCP格式段的标志位)

    MTU:传输数据包的最大字节数

13.描述三次握手,四次挥手,为什么要握手三次呢?

    1)

    客户端向服务器端发送SYN包,请求连接;

    服务器端向客户端发送SYN+ACK,为连接分配资源;

    客户端为连接分配资源,并回复ACK。

    2)

    客户端向服务器端发送FIN报文,请求断开连接;

    服务器端回复ACK,并进入wait状态;

    服务器端确认数据传输完毕,发送FIN报文

    客户端收到回复ACK,断开连接。

    3)

    为了防止因为延迟,使服务器端再进入等待连接状态而浪费资源。

14.常用socket通信大致需要哪几个步骤

1)UDP

    主动段                      被动端

    socket()                   socket()

    sendto()                  bind()

    close()                     recvfrom();

                                     close();

2)TCP

    主动段                 被动段

    socket()                socket()

    bind()//可省略       bind()

    connect()               listen()//监听请求连接

                                    accept()//接受请求

    send()/write()        recv()/read()

    close                  close()

 

15.什么情况下适合用UDP,什么情况下适合用TCP

    1)UDP

        提供高效率服务;如音频和多媒体应用

   2)TCP

提供稳定的服务;需要可靠稳定的连接时,如远程登陆,文件传输

16.在后台静默的ping某个ip地址,命令行该如何输入

   ping xxx.xxx.x.xxx

17.c语言源代码变成a,out经历哪些过程

   C语言编译大致过程:预处理 -->编译 -->汇编 --> 可执行文件

    具体过程:预处理 -->编译优化 -->汇编 -->链接过程 --> 可执行文件

    格式变化:.c -->.i -->.s -->.o -->可执行文件

19.udp如何确认被动端已收到数据

被动端用recvfrom来接收数据,如果成功接收数据,返回接收到的字节数,若失败则返回-1.

20.线程和进程的区别

1.进程是程序的执行过程,线程是进程的一个执行路径

2.在系统中,进程是系统资源分配的单位,线程是CPU调度的单位

3.进程之间不共享资源,线程会共享所属进程的地址空间和其他资源

4.进程切换开销大,线程较小

21.线程和进程的应用场景

1.当需要频繁销毁核创建时就用线程

2.单应用多任务时

原创粉丝点击