面试笔试基础1

Linux 下进程间的通信方式有以下几种
(1)管道/无名管道
(2)信号
(3)共享内存
(4)消息队列
(5)信号量
(6)socket
这是书上说的六种通信方式,通过文件锁的方式也可以实现进程间的通信(上网查了一下)所以要记住文件锁

无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

有名管道:不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。

int *p[4];  //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int (*p)[4];  //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP代理ARPNDP用于在IPv6中代替地址解析协议。

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3.  不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
  •         死锁的预防
死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。

   〈1〉打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。

   〈2〉打破不可抢占条件。即允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。    

    〈3〉打破占有且申请条件。可以实行资源预先分配策略。即进程在运行前一次性地向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。
  • 死锁避免

1.安全序列

  我们首先引入安全序列的定义:所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{P1,P2,...,Pn}就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。

  安全序列{P1,P2,...,Pn}是这样组成的:若对于每一个进程Pi,它需要的附加资源可以被系统中当前可用资源加上所有进程Pj当前占有资源之和所满足,则{P1,P2,...,Pn}为一个安全序列,这时系统处于安全状态,不会进入死锁状态。

  虽然存在安全序列时一定不会有死锁发生,但是系统进入不安全状态(四个死锁的必要条件同时发生)也未必会产生死锁。当然,产生死锁后,系统一定处于不安全状态。 

面试笔试基础1

- 撤销所有的死锁进程 
进程回退(Roll Back)再启动 
按照某种原则逐一撤销死锁的进程直到。。。 
按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前对应的状态),直到。。。
两个。第一个在堆中,第二个在字符串常量池中!如果在Java字符串常量池中已经存在,就只会创建一个

Java语言中,String s =new String(“xyz”);创建了几个string object?

在.NET中,CLR会为应用程序使用的每个类型创建一个内部数据结构,这种数据结构成为:类型对象(type Object)。 具有泛型类型参数的类型仍然是类型,CLR同样会为它创建一个内部类型对象。无论是引用类型(类)、值类型(结构)、接口类型,还是委托类型,这一点都是成立的。然而,具有泛型类型参数的类型称之为:开放类型(open type),CLR禁止构造开发类型的任何实例。这一点类似于CLR禁止构造结构类型的实例。 代码引用一个泛型类型时,可指定一组泛型类型实参,假如所有类型实参传递的都是实际数据类型,类型就称为封闭类型(closed type)。CLR允许构造封闭类型的实例,然而,当代码引用一个泛型类型的时候,可能会留下一些泛型类型实参未指定,这会在CLR中创建一个新的开放类型的对象,而且不能创建该类型的实例,以下代码说明了这一点  internal sealed class DictionaryStringKey<TValue> : Dictionary<String, TValue> { }      public static class Program    {        static void Main(string[] args)        {            Object o = null;              //Dictionary<,>是一个开放类型,它有两个类型参数            Type t = typeof(Dictionary<,>);            //尝试创建该类型的一个实例失败            o = CreateInstance(t);            Console.WriteLine();              //DictionaryStringKey是一个开放类型,他有一个类型参数            t = typeof(DictionaryStringKey<>);            //尝试创建该类型的一个实例失败            o = CreateInstance(t);            Console.WriteLine();              //DictionaryStringKey<Guid>是一个封闭类型            t = typeof(DictionaryStringKey<Guid>);            //尝试创建该类型的一个实例成功            o = CreateInstance(t);            //证明它确实能够工作            Console.WriteLine(" 对象类型:"+o.GetType());        }          private static Object CreateInstance(Type t) {            Object o = null;            try            {                o = Activator.CreateInstance(t);                Console.WriteLine("已创建{0}的实例。",t.ToString());            }            catch (ArgumentException e)            {                Console.WriteLine(e.Message);            }            return o;        }    }



  • 1.主键约束(PRIMARY KEY)

    1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键。 
    2) 是不可能(或很难)更新. 
    3) 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL).
    4) 主健可作外健,唯一索引不可;

    2.唯一性约束(UNIQUE)
    1) 唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,一个表上可以放置多个唯一性约束.
    2) 只要唯一就可以更新. 
    3) 即表中任意两行在  指定列上都不允许有相同的值,允许空(NULL).
    4) 一个表上可以放置多个唯一性约束

    3.唯一索引(INDEX)

       创建唯一索引可以确保任何生成重复键值的尝试都会失败。

       唯一性约束和主键约束的区别:
        (1).唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。
        (2).在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引

     

       约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
       唯一性约束与唯一索引有所不同:

       (1).创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。

       (2).创建唯一索引只会创建一个唯一索引,不会创建Constraint。

       也就是说其实唯一约束是通过创建唯一索引来实现的。

       在删除时这两者也有一定的区别:

       删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,

       而删除了唯一索引的话就可以插入不唯一的值
    发表于 2017-10-27 10:13:34回复(1)
  • 2

    唯一索引不允许两行具有相同的索引值。

    如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在 employee 表中的职员姓氏(lname) 列上创建了唯一索引,则所有职员不能同姓。
    唯一索引可为空。
    发表于 2017-08-21 14:13:02