Unix C 一些常见问题解析
in linuxC/C++ with 0 comment

Unix C 一些常见问题解析

in linuxC/C++ with 0 comment

下边结构体包含字节数

#parama pack(4)
struct node{
    int p1;
    char p2;
    double p3;
} Node;

16

内存对齐的问题不难,也好理解,就是容易乱,这篇文章讲的很详细,尤其图画的很好。

http://blog.csdn.net/mbh_1991/article/details/10241785

linux 命令行统计处于"ESTABLISHED"状态的连接数量

netstat -ant | grep "ESTABLISHED" | wc -l

wc 实现统计功能

-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。

浏览器中输入网址后执行的全部过程

网址请求--> 浏览器提取域名+路径+其他-->DNS域名解析为ip-->建立TCP连接-->请求对应ip的路径对应文件-->服务器返回http协议头和解析所请求文件内容-->返回html。

至此一个请求执行完毕。

描述红黑树

进程间通信方式

线程死锁的必要条件

产生死锁的四个必要条件:

题目

给一个字符串,例如 “ababc” 要求返回"ab",因为"ab"连接重复出现,且最长,用c/c++语言写一函数完成改算法,给出复杂度。

多路复用技术

多路复用就是多个网络等流操作共用一个io

多路复用技术要解决什么问题:

由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞在这个调用上,不能执行其他操作。
一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将阻塞直到客户端调用write(sockfd,but,size)发来数据. 在一个客户和服务器通信时这没什么问题,当多个客户与服务器通信时,若服务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达套接字sockfd2时,服务器不能处理,仍然阻塞在read(sockfd1,...)上;此时问题就出现了,不能及时处理另一个客户的服务,这时候就需要进行io多路复用技术。

io多路复用技术如何实现:

至于多路复用,这又要牵扯到同步和异步,阻塞和非阻塞的问题上了。
什么是同步和异步,什么又是阻塞和非阻塞。在这个文章的最后一个点就是。
多路复用在linux下提供了3种方式,selectpollepoll
其中的具体细节较为复杂,这里暂时只说说概念,具体的使用,有机会再开文章。
selectpoll的实现基本一致,在多个文件描述符(fd),需要轮询每个fd,直到有fd完成操作返回为止,看似解决了异步阻塞的问题,但是当有大量的连接操作时,selectpoll会变的非常占用cpu资源,因此,selectpoll是有缺陷了。

能解决这个缺陷的就是epoll函数,epoll函数
虽然也有轮询操作,但是它只会对内核中有io操作的对象进行操作,因为在监听的文件描述符fd中,当有io操作时,这个fd会执行一个回调函数,通知opell模型,这样,轮询就对有意义的io操作,从而避免了select模型对无意义的fd的轮询。

简单说epollselect/poll最大区别是
1.epoll内部使用了mmap共享了用户和内核的部分空间,避免了数据的来回拷贝
2.epoll基于事件驱动,epoll_ctl注册事件并注册callback回调函数,epoll_wait只返回发生的事件避免了像selectpoll对事件的整个轮寻操作。

线程同步的几种方式

互斥锁(mutex
条件变量(cond)
信号量(sem)

同步,异步,阻塞和非阻塞

小李喝了想喝水,于是去煮开水。

1、小李把水壶放到炉子上,等待水烧开。(同步阻塞)

小李感觉这样太费时间。

2、小李把水壶放到炉子上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)

小李还是觉得自己这样太累,于是买了把会响笛的那种水壶。水开之后,能发出声音。

3、小李把响水壶放到炉子上,等待水壶发出声音。(异步阻塞)

觉得这样傻等意义不大

5、小李把响水壶放到炉子上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

ps:先埋个坑,这篇文章将解析一些常见的面试,笔试题目(暂时不做具体代码编写,太硬)

timg.jpeg

Responses