C++底层机制-第二天


系统如何将一个信号通知到进程?


内核给进程发送信号,是在进程所在的进程表项的信号域设置对应的信号的位。


进程检查信号的时机是:进程即将从内核态返回用户态时。如果进程睡眠了,要看睡眠能不能被中断,如果能被中断则唤醒。


进程有一个链表的数据结果,维护一个未决信号的链表。


信号在进程中注册,其实就是把该信号加入到这个未决信号链表当中。


可靠信号不管链表中是否已经有这个信号了,还是会加进去。不可靠信号,如果链表中已经有这个信号了,就会忽略。


进程处理信号的时机就是从内核态即将返回用户态度的时候。


执行用户自定义的信号处理函数的方法很巧妙。把该函数的地址放在用户栈栈顶,进程从内核返回到用户态的时候,先弹出信号处理函数地址,于是就去执行信号处理函数了,然后再弹出,才是返回进入内核时的状态。


被屏蔽的信号,取消屏蔽后还会被检查。


共享内存实现原理

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问


多线程和多进程的区别(考察!)


(从CPU调度、上下文切换、数据共享、多核CPU利用率、资源占用等方面回答。然后,有一个问题必须会被问到:哪些东西是一个线程私有的?答案中一定得包含寄存器。)


(1)进程与进程之间的数据空间是分开的,如果要在进程之间进行通信,需要使用特殊的IPC机制,比如管道、信号量、共享内存、消息队列。


线程是存在于进程内的,线程之间共享进程的堆区间、全局静态存储区,而各自享有自己独立的栈空间。线程之间共享数据比较简单,但是线程之间的同步比较复杂,线程同步方法比如说使用互斥量mutex、信号量semaphore。


(2)进程的创建、销毁、切换复杂,速度比较慢。线程的创建、销毁、切换简单,速度快。


(3)进程占用内存多,CPU利用率较低。线程占用内存少,CPU利用率高。


(4)进程之间不会相互影响。进程的一个线程挂掉则会导致整个进程挂掉。


(5)进程适应于多核多机分布,线程适应于多核。


线程所私有的内容:


线程ID号、寄存器的值、栈内存、线程的调度策略、线程的私有数据、信号屏蔽字、errno 变量。


什么是僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。


http的链接过程

1.域名解析

2.发起TCP的三次握手

3.Web浏览器向服务器发送http请求命令

4.Web浏览器向服务器发送http请求头信息

5.Web服务器应答

6.Web服务器发送应答头信息

7.服务器向浏览器发送数据

8.服务器关闭TCP连接


线程和协程的区别总结:

协程属于线程,即一个线程下面可以开辟多个协程。


协程是用户态的轻量级线程。


协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。


当多个协程切换时,由于其同属于一个线程,所以可以看作是同步执行的,不存在同时共享资源的情况,可以不加锁的访问全局变量,切换上下文非常快。


对于不需要cpu大量参与的业务场景来说,比如io广泛的业务,建议使用协程。


辅助类-智能指针实现

在创建智能指针类之前,我们先创建一个辅助类。这个类的所有成员皆为私有类型,因为它不被普通用户所使用。为了只为智能指针使用,还需要把智能指针类声明为辅助类的友元。这个辅助类含有两个数据成员:计数count与基础对象指针。也即辅助类用以封装使用计数与基础对象指针。

class U_Ptr

{private:


friend class SmartPtr;

U_Ptr(Point *ptr) :p(ptr), count(1) { }

~U_Ptr() { delete p; }


int count;

Point *p;

};


https://www.cnblogs.com/QG-whz/p/4777312.html


TCP三次握手和四次挥手:


C++底层机制-第二天


红黑树与AVL树的区别

黑树与AVL树都是平衡树,但是AVL是完全平衡的(平衡就是值树中任意节点的左子树和右子树高度差不超过1);

红黑树效率更高,因为AVL为了保证其完全平衡,插入和删除的时候在最坏的情况下要旋转logN次,而红黑树插入和删除的旋转次数要比AVL少。

AVL树 [1] ,它或者是一颗空二叉树,或者是具有下列性质的二叉树:


(1) 其根的左右子树高度之差的绝对值不能超过1;


(2) 其根的左右子树都是二叉平衡树。


31. stl各容器的实现原理

) Vector顺序容器,是一个动态数组,支持随机插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间,增加为原来的两倍。vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下。

注:vector动态增加大小时是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector空间重新配置,指向原vector的所有迭代器就都失效了。

2) Map关联容器,以键值对的形式进行存储,方便进行查找。关键词起到索引的作用,值则表示与索引相关联的数据。红黑树的结构实现,插入删除等操作都在O(logn)时间内完成。

3) Set是关联容器,set每个元素只包含一个关键字。set支持高效的关键字检查是否在set中。set也是以红黑树的结构实现,支持高效插入、删除等操作。


假如给你一个新产品,你将从哪些方面来保障它的质量?

出题人:阿里巴巴出题专家:晨晖 /阿里云中间件技术部测试开发专家

参考答案:

可以从代码开发、测试保障、线上质量三个方面来保障。

在代码开发阶段,有单元测试、代码Review、静态代码扫描等;

测试保障阶段,有功能测试、性能测试、高可用测试、稳定性测试、兼容性测试等;

在线上质量方面,有灰度发布、紧急回滚、故障演练、线上监控和巡检等。


分享到:


相關文章: