应用编程与网络编程篇

Posted 今天天气眞好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用编程与网络编程篇相关的知识,希望对你有一定的参考价值。


1.系统编程

详细见:Linux系统编程

1.异步IO与同步IO的区别?
答案:如果是同步IO,当一个IO执行操作的时候,应用程序必须等待,直到此IO执行完。相反,异步IO在后台运行,IO操作和应用程序可以同时运行,提供系统性能,提高IO流量

解读:在同步文件IO中,线程启动一个IO操作然后立刻进入等待状态,直到IO操作完成后才醒来继续执行。而在异步IO文件中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求之后,就会通知线程IO操作完成了。

2.进程间通信方式?
(1)管道:是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用,通常是父子进程。
(2)有名管道:也是半双工的通信方式,但是它允许用于无亲缘关系的进程之间的通信。
(3)消息队列:是一个消息链表,存放在内核中并且由消息队列标识符标识。消息队列克服了信号量传递少。管道只能承载无格式字符流以及缓冲区大小受限的缺点。(注意在使用的时候必须使用同一个队列ID)
(4)信号量:是一个计数器,通常作为一种同步机制,用于进程和线程间的同步。
(5)共享内存:一段能被多个进程共同访问的内存,由一个进程创建。共享内存是最快的IPC通信方式,他是针对其他进程间通信方式效率低而设计的,往往与其他通信方式如信号量来配合使用,用来实现进程间同步于通信。
(6)套接字:可用于不同主机间的通信。
(7)信号:用于通知接收进程某个事件已经发生,是一个比较复杂的通信方式。

3.子进程从父进程继承的资源有哪些?
答案:用户号和用户组、目录(当前目录、根目录)、打开的文件描述符、堆栈、共享内存
注意:父进程和子进程拥有独立的地址参数和PID参数、自己的文件描述符、不同的父进程号

4.什么是进行上下文、中断上下文?
(1)进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器值中的值、进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
(2)进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。
(3)中断上文:硬件通过中断触发信号,导致导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也会传递给内核,内核通过这些参数进行中断处理。中断上下文可以看做硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)
(4)中断下文:执行在内核空间的中断服务程序。

5.如何防止僵尸进程过多导致系统空间爆满?
答案:每当子进程退出,父进程就会收到SIGCHLD信号,故可在父进程中设置SIGCHLD信号的捕获函数,在捕获函数中回收子进程。

解读:
(1)僵尸进程是指当子进程比父进程先结束,而父进程没有结束子进程,释放子进程占用的资源,此时子进程就变成了僵尸进程。
(2)可以用top命令来查看僵尸进程的数量(zombie),也可用ps -aux|grep Z(僵尸进程的状态是Z)来查看僵尸进程的PID等信息。

6./proc目录下,以数字命名的目录是什么?
以数字命名的目录表示当前一个运行的进程,目录名即进程PID,其内的目录和文件给出了一下该进程的信息。

7.进程和线程有什么区别?
(1)进程是系统中程序执行和资源分配的基本单位,线程是CPU调度的基本单位。
(2)一个进程可以拥有多个线程,线程可以访问其所属进程的地址空间和系统资源(数据段,已经打开的文件,I/O设备等),同时拥有自己的堆栈。
(3)同一进程中的多个线程可以共享同一地址空间,因此他们之间的通信方式也比较简单,而且切换开销小,创建和消亡的开销也小。而进程间的通信就会比较复杂,而且开销大。

8.什么时候使用多线程?什么时候使用多进程?
(1)当程序安全性、稳定性要求较高时会使用多进程。
(2)需要频繁通信、切换程序、创建跟销毁程序时候使用多线程。

9.线程可以独立运行吗?一个线程崩溃会导致整个进程崩溃吗?
答案:线程不能独立运行,但是一个线程的崩溃并不一定会导致这个进程的崩溃

解读:
(1)线程属于进程,线程的运行需要依赖进程的地址空间和系统资源。
(2)线程崩溃的本质就是内存出错。若内存出错没有被其他线程访问,则不会导致其他线程出错,也就不会导致整个进程崩溃。

10.线程间通信和同步方式有哪些?
信号、信号量、互斥锁、条件变量、自旋锁、读写锁

11.如何防止产生大量的线程?
(1)方法就是创建线程池
(2)线程池可以提高调度效率和限制资源使用,线程池中的线程达到最大数时,其他线程就会排队等待。

12.互斥锁和信号量的区别?
(1)信号量用于线程同步、互斥锁用于线程互斥
(2)信号量可以为非负整数,可以实现多个同类资源的多线程同步;互斥锁只能为0/1,只能用于一个资源的互斥访问。
(3)信号量可以由一个线程释放,另一个线程得到。互斥锁的加锁和解锁必须由同一个线程对应使用,且多个线程使用多个互斥锁必须注意统一顺序,否则会造成死锁。

13.一个进程可以创建多少个线程?和什么有关?
(1)一个进程创建线程的个数由虚拟内存的大小分配给线程的调用栈大小决定。一个线程的栈大小可通过ulimit -s查看,一般书8~10M。
(2)假设一个线程需要占用10M内存,那么在3G的地址空间上大概可以创建300个线程。

14.父进程、子进程
父进程调用fork()以后,克隆出一个子进程,子进程和父进程拥有相同内容的代码段、数据段和用户堆
栈。父进程和子进程谁先执行不一定,看CPU。所以我们一般我们会设置父进程等待子进程执行完毕。

2.网络编程

相关协议见:TCP/IP HTTP Socket

1.tcp通信建立连接和释放的过程?端口的作用?
(1)连接三次握手。释放四次挥手
(2)端口是一个软件结构,被客户进程或者服务进程用来当发送和接受消息。一个端口对应一个16位的比特数。服务进程通常使用一个固定的端口。

2.应用程序ping发出的是什么报文?
ICMP

3.epoll是什么?
(1)epoll是Linux网络编程中用于处理大量文件描述符的机制,是对selete/epoll的改进。
(2)selete监听的fd是有上限的,32位处理器一般是1024,;且selete/epoll每次调用都会遍历所有的fd,时间复杂度为O(n),效率太低。而epoll监听的fd数量没有限制,且能在O(1)的时间复杂度内完成操作。
(3)epoll相关的系统调用有:epoll_createpoll_ctlepoll_wait/epoll_pwait(可屏蔽特定信号),分别用来创建一个epoll文件描述符、添加/删除/修改需要侦听的文件描述符及事件、接收被侦听描述符的IO事件。epoll文件描述符用完之后直接close关闭即可。

4.tcp,udp的区别?
(1)TCP是面向连接的,UDP是面向无连接的。
(2)TCP是面向字节流的,UDP是基于数据报的。
(3)TCP提供可靠服务(正确性、顺序性),UDP提供不可靠服务。
(4)TCP程序结构复杂,占用资源多;UDP程序结构简单,占用资源少。
(5)TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使得源主机的发送速率降低,适合于实时应用;如IP电话、实时视频会议。
(6)TCP只支持一对一;UDP支持一对一,多对一、多对多、
一对多。

5.TCP和UDP的优缺点?
(1)TCP
优点:稳定可靠。在传输数据之前会有三次握手来建立连接;在数据传输时候,有检验和、确认、重传、序列号、窗口、拥塞控制机制;在数据传输结束后,还会有四次挥手来断开连接,节省系统资源。

缺点:效率低、占用系统资源多、易受攻击。建立连接和确认、重传、窗口、拥塞控制机制都会消耗大量的时间;每台设备维护连接都会占用CPU、内存等资源;三次握手机制、确认机制导致TCP易受到利用和攻击。

(2)UDP
优点:效率高、占用资源数较少、比TCP稍安全。没有各种复杂机制,传输速率快,占用系统资源数较少,被利用的漏洞也少一些。

缺点:不稳定、不可靠。没有各种复杂机制,网络质量不好时很容易丢包。

6.TCP,UDP使用的场景?
(1)TCP:对网络质量有要求时,比如:HTTPS、UTTP、FTP等文件传输协议,POP、SMTP等邮件传输协议。
(2)UDP:对网络质量要求不高时,要求网络通讯速度要快的场景,比如在线视频、网络语音电话、广播通信。

7.TCP为什么是可靠连接?
因为TCP传输的数据满足四大条件:不出错、不丢失、不失序、不重复。而且拥有窗口机制,拥塞控制机制来提高传输效率。

8.网络编程的作用?
网络编程的本质是使用套接字来进行进程间通信,但是这些进程是分布在不同主机上的进程,因此网络编程在物联方面具有比较大的作用。

9.什么是TCP粘包?
TCP粘包就是指发送方发送的若干个数据包到达接收方时粘成了一个包。从缓冲区来看,后一包数据的头紧接着前一个包的尾。

10.造成TCP粘包的原因?
1、发送方原因:TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),Nagle算法主要做两件事:
(1)只有上一个分组得到确认,才会发送到下一个分组
(2)收集多个小分组,在一个确认到来时一起封装并发送。

2、接收方原因:TCP接收到数据包,应用层并不会立即处理。实际上,TCP将收到的数据包保存在接收缓存中,然后应用程序主动从缓存中读取收到的分组。这样一来,如果TCP接收到数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就会有可能读取到多个收尾相接的包。

11.什么时候需要处理粘包现象?
(1)如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象。
(2)如果多个分组毫不相关,甚至是并列关系,那么就一定要处理粘包现象。

12.如何解决粘包问题?
1、发送方:可以使用TCP_NODELAY选项来关闭Nagle算法。
2、接收方:接收方无法处理,只能将问题交给应用层来处理。
3、应用层:方法简单可行
(1)格式化数据:每条数据都有固定的格式(开始符、结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含这两种符号。
(2)发送数据包长度:发送每条数据时,将数据长度一并发送,例如规定数据的前4位是数据的长度,这样接收方应用层在处理时就可以根据长度来判断每个分组的开始和结束位置。

13.路由器、交换机、集线器的区别?
(1)路由器工作在网络层,根据网络提供的信息(IP地址)来选择路由。
(2)交换机工作在数据链路层,通过数据链路层提供的信息(MAC)地址来选择端口。
(3)集线器工作在物理层,只对信号进行整形,放大后再重放(广播给其他的所有端口)。

以上是关于应用编程与网络编程篇的主要内容,如果未能解决你的问题,请参考以下文章

[从零开始学习FPGA编程-48]:视野篇 - 智能传感器的发展与应用

Java高级工程师进阶学习:kafka应用场景

网络编程之基础篇一

走进windows编程的世界-----入门篇

Java高级篇——网络通信

iOS开发网络篇—网络编程基础