牛客网: C++面试宝典——操作系统(2)

https://www.nowcoder.com/tutorial/93/7474823e71be4850a4b856290d230e20

● 请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别

1、互斥锁和读写锁区别:

互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

读写锁:rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时,读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。适用于读取数据的频率远远大于写数据的频率的场合。

互斥锁和读写锁的区别:

1)读写锁区分读者和写者,而互斥锁不区分

2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。

 

自旋锁的原理比较简单,如果持有锁的线程能在短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞状态,它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取,这样就避免了用户进程和内核切换的消耗。

这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源。

● A* a = new A; a->i = 10;在内核中的内存分配上发生了什么?

1)A *a:a是一个局部变量,类型为指针,故而操作系统在程序栈区开辟4/8字节的空间(0x000m),分配给指针a。

2)new A:通过new动态的在堆区申请类A大小的空间

3)a = new A:a是指向堆的指针,保存堆的地址

4)a->i:先找到指针a的地址0x000m,通过a的值0x000n和i在类a中偏移offset,得到a->i的地址0x000n + offset,进行*(0x000n + offset) = 10的赋值操作,即内存0x000n + offset的值是10。

● 给你一个类,里面有static,virtual,之类的,来说一说这个类的内存分布

https://www.cnblogs.com/jerry19880126/p/3616999.html

1.非static修饰的成员变量:在类内按照声明的顺序存储

2.static修饰的成员变量:静态存储区

用static修饰的变量在静态存储区生成的,

3.成员函数:代码区

4.虚函数:在类的最前面保存的是虚表指针,指向虚函数表(保存的函数指针)

虚函数表也是在数据段

5.如果是普通继承,

先先保存父类中的成员,继承虚函数表(重写的话会替换)

6.如果是virtual继承的话,会有两个虚表指针

先罗列自己的,再是父类的

● 请你回答一下软链接和硬链接区别

硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

● 请问什么是大端小端以及如何判断大端小端

https://blog.csdn.net/qq_38790716/article/details/84930081

大端是指低字节存储在高地址;小端存储是指低字节存储在低地址。

联合体union

利用union的共享内存特性

#include<iostream> 
using namespace std;
union m {
    int a;
    char b;
};
int main(){
	m tmp;
	tmp.a=1;
	if(tmp.b==1)	cout<<"small";
	else	cout<<"big";
	return 0;
}

● 请你回答一下静态变量什么时候初始化

静态变量存储在虚拟地址空间的数据段和bss段,C语言中其在代码执行之前初始化,属于编译期初始化。

而C++中由于引入对象,对象生成必须调用构造函数,因此C++规定全局或局部静态对象当且仅当对象首次用到时进行构造

因此何时执行全局或静态对象(C++)的构造和析构呢?这需要执行相关代码,无法在编译期完成

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值