每日面试训练题6

一、什么是进程?什么是线程?

进程是系统中正在运行的一个程序,程序一旦运行就是进程。

进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时,每个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。

线程是进程的一个实体,是进程的一条执行路径。线程是进程的一个特定执行路径。当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化。

1.进程是拥有资源的最小单位;线程是调度的最小单位。
2.进程拥有自己独立的地址空间,每启动一个进程,系统会为其配地址空间,建立数据来维护代码段、堆栈段、数据段;线程没有独立的空间地址,它使用相同的地址空间共享数据。
3.CPU切换一个线程比一个进程花费小。
4.创建一个线程比一个进程开销小。
5.线程占用的资源比进程少很多。
6.线程之间通信更方便,同一进程下,线程共享全局变量、静态变量等数据。
7.多进程程序更加安全、生命力更强,一个进程死掉不会影响另一个进程(它拥有独立地址空间);多线程程序不易维护,一个线程死掉,整个线程就结束了(共享地址空间)。
8.进程保护要求高,开销大,效率相对较低;线程效率就比较高,可以频繁切换。
 

二、lock的作用是什么?

lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。假设线程A先执行,线程B稍微慢一点。线程A执行到lock语句,判断obj是否已申请了互斥锁,如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了。这时假设线程B启动了,而线程A还未执行完lock里面的代码。线程B执行到lock语句,检查到obj已经申请了互斥锁,于是等待,直到线程A执行完毕,释放互斥锁,线程B才能申请新的互斥锁并执行lock里面的代码
 

三、什么是相对坐标?什么是绝对坐标?

相对坐标:以指定参照物为原点,相较于参照物的相对位置。

绝对坐标:以世界中心为原点,物体所处世界的位置。

四、射线检测的常用几种方法

1.普通射线检测(一般用于检测某一个物体)

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin ,ray.direction , Color.red);
RaycastHit hit;
if(Physics .Raycast (ray,out hit,int.MaxValue,1<<LayerMask .NameToLayer ("layername")))
{
    Debug.Log("检测到物体");
}

2.直线射线检测多个物体

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin ,ray.direction , Color.red);
RaycastHit[] hit = Physics.RaycastAll(ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("layername"));
if(hit .Length >0)
{
    for (int i = 0; i < hit.Length ; i++)
    {
        Debug.Log("检测到物体"+hit[i].collider.name );
    }
}

3.球形射线检测(一般用于检测周边物体)

int radius = 3;
Collider[] cols = Physics.OverlapSphere(this.transform.position, radius, LayerMask.NameToLayer("layername"));
if(cols.Length >0)
{
    for (int i = 0; i < cols.Length; i++)
    {
        Debug.Log("检测到物体" + cols[i].name);
    }
}

五、什么是封装?什么是继承?什么是多态?

封装就是将一些复杂的或是不想让你看到的事物包装起来,叫做封装。从程序的角度来说就是,把一些内部复杂的逻辑或是不想让其他人员修改程序内部进而把部分程序包装起来,叫做封装。比如将一些算法逻辑封装为一个方法,只需要调用这个方法即可重复使用这个算法。

继承,顾名思义,就是继承某个东西或者财产。比如,子代继承父代的财产,一个人继承他爸爸财产房产一类的东西,但是有些东西是不能继承的,比如这个人他爸爸年轻时学到的知识、经历,他不能继承(程序中的私有字段等)。从程序的角度来说,就是子类继承父类的一下字段属性方法等。
多态,即多种状态。也可以说是“一个接口,多种实现”或者说是父类的引用变量可以指向子类的实例,被引用对象的类型决定调用谁的方法,但这个方法必须在父类中定义。使用多态可以让写出通用的代码使得程序更加好维护便捷。譬如,游戏中有一百个怪物,他们都有不同的攻击方法,如果不使用多态,就需要写一百种不同的攻击方法,但如果使用多态,就可以用同一种方法去重写不同的攻击逻辑。

上一篇:加redis锁


下一篇:分析std::lock处崩溃问题