#2016-03-15
下列 java 程序输出结果
上题解释
有关下述Java代码描述正确的选项是
构造函数初始化时必须采用初始化列表一共有三种情况,
- 需要初始化的数据成员是对象(继承时调用基类构造函数)
- 需要初始化const修饰的类成员
- 需要初始化引用成员数据
基本有序的情况下:快排最慢,堆排最快。
将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列
#函数参数入栈顺序 C 程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体 编译器实现相关的。比如,Pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如Visual C++。即然两种方式都可以,为什么C语言要选择从右至左呢? 进一步发现,Pascal语言不支持可变长参数,而C语言支持这种特色,正是这个原 因使得C语言函数参数入栈顺序为从右至左。具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入 栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参 数个数的方向相反。 因此,C语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。换句话说,如果不支持这个特色,C语言完全 和Pascal一样,采用自左向右的参数入栈方式。可变参数 主要通过第一个定参数来确定参数列表,所以从右至左入栈后,函数调用时pop出第一个参数就是 参数列表的第一个确定参数,就OK了……
#进程和线程 定义 【进程】是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。大小只与处理机的位数有关,一16位处理机的空间大小为216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。单机系统中进程通信有 4 种形式:主从式,会话式,消息或邮箱机制,共享存储区方式,管道(共享大量内存中的数据)。
【线程】是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈,非共享),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
区别
- 包含关系:一个程序至少有一个进程,一个进程至少有一个线程.
- 内存共享:进程在执行过程中拥有独立的内存单元(一个进程崩溃后,在保护模式下不会对其它进程产生影响);而多个线程共享进程提供的内存(拥有自己的私有栈空间只是作为运行需要的极少内存),从而极大地提高了程序的运行效率,但一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮
- 执行过程:进程独立执行;线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程间通信 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。因为那些通信手段的效率太低了,而人们对进程间通信的要求是要有一定的实时性。
进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET.
管道包括三种:
- 普通管道PIPE, 通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用.
- 流管道s_pipe: 去除了第一种限制,可以双向传输.
- 命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯.
系统IPC的三种方式类同,都是使用了内核里的标识符来识别.
- 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的(共享大量内存中的数据)。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
- 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
常用的精简指令集 RISC 微处理器包括 DECAlpha 、 ARC 、 ARM 、 AVR 、 MIPS 、 PA-RISC 、 PowerArchitecture( 包括 PowerPC) 和 SPARC 等。 复杂指令 CISC如X86。
Big Endian and Little Endian
Struct
在N个乱序数字中查找第k大的数字,时间复杂度可以减小至
#集合和关系性质
假设集合A,以及基于A上的关系R
自反: 如果a是A的元素,那么<a,a>是R的元素
反自反: 如果a是A的元素,那么<a,a>不是R的元素
对称:如果<a,b>是R的元素,那么<b,a>是R的元素
反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等
传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素
#创建进程
- 申请空白PCB(进程控制块);
- 为新进程分派资源;
- 初始化PCB;
- 将新进程插入就绪队列;
fork
下列方法中,____不可以用来程序调优
下列 C 代码中,不属于未定义行为的有
把校园中同一区域的两张不同比例尺的地图叠放在一起
某路由器接受的 IP 报文的目的地址不是路由器的接口 IP 地址
MySQL 主从结构的主数据库中不可能出现以下哪种日志
C++ case
程序出错在什么阶段__?