笔试题错题本

1.以下三条输出语句分别输出什么? 

int main (void) {

    char str1[] = “abc”;

    char str2[] = “abc”;

    const char str3[] = “abc”;

    const char str4[] = “abc”;

    const char* str5 = “abc”;

    const char* str6 = “abc”;

    cout << (str1 == str2) << endl;

    cout << (str3 == str4) << endl;

    cout << (str5 == str6) << endl;

    return 0;

    }

第一个,第二个存放的是地址   第三个是指针指向的字符串

2.已知函数fun的原型为int fun(int,int,int);下列重载函数原型中错误的是

char fun(int,int);
double  fun(int,int,double);
int fun(int,char*);
float  fun (int,int,int);
函数重载和返回类型无关,参数列表不同即可
3.

不同进程加载同一个动态库时,不能共享的部分是

RO段
RW段
ZI段
RW和ZI段
在ARM集成开发环境中:
    1)只读的代码段和常量被称作RO段,是程序中的指令和常量;
    2)可读写的全局变量和静态变量称为RW段,是程序中已初始化变量;
    3)RW段中要被初始化为0的变量称为ZI段,是程序中未初始化变量。
    只有只读的指令和常量可以共享。
4. 线程共享的进程环境包括:
  • 进程代码段
  • 进程的公有资源(如全局变量,利用这些共享的数据,线程很容易的实现相互之间的通信)
  • 进程打开的文件描述符
  • 消息队列
  • 信号的处理器
  • 进程的当前目录
  • 进程用户ID
  • 进程组ID
线程独占资源:
  • 线程ID
  • 寄存器组的值
  • 用户栈、内核栈(在一个进程的线程共享堆区(heap))
  • 错误返回码
  • 线程的信号屏蔽码
  • 线程的优先级

堆: 是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放

5.请问linux系统发送信号的系统调用是

系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。
这 两个调用可以形成信号的基本操作。
后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时。
6.在定点二进制运算器中,减法运算一般通过(   )来实现
 补码运算的二进制加法器
7.操作系统在控制和管理进程过程中,涉及到(   )这一重要数据结构,这是进程存在的唯一标志。

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
/usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 结构体定义。其内部成员有很多,重点:

  • 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表- 示,其实就是一个非负整数。
  • 进程的状态,有就绪、运行、挂起、停止等状态。
  • 进程切换时需要保存和恢复的一些CPU寄存器。
  • 描述虚拟地址空间的信息。
  • 描述控制终端的信息。
  • 当前工作目录(Current Working Directory)。
  • umask掩码。
  • 文件描述符表,包含很多指向file结构体的指针。
  • 和信号相关的信息。
  • 用户id和组id。
  • 会话(Session)和进程组。
  • 进程可以使用的资源上限(Resource Limit)。
进程控制块(Processing Control Block),是操作系统进程中一种数据结构,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位或一个能与其他进程并发执行的进程。
 
8.已知代码char* p=(char*)malloc(val);其中p在运行的时候获得了一个空指针,请列举三种可能的原因?()()()
(1) 空间太小
(2) 内存碎片
(3) val取值过大
9.两个进程间需要交换1KB的数据,请列出三种进程间通讯的方法()()()
 
进程间IPC的方法:
1. pipe 又分为匿名和命名pipe,前者用于具有一定关系的进程间的通信,(通过fork进制)后者FIFO可以用于不具有任何关系的进程通信
2. socket 其实有些平台的pipe的底层实现就是使用unix socket。
3. signal 通过信号处理机制也能使两个进程进行通信(同步)
4. message 通过消息队列,可以使任何两个进程进行通信
6. shared memory 其也是通信速率最快的一种方式,但是多个进程同时访问该区域,就需要读写控制,使用进程间锁或者信号量来搭配使用。
7. file       通过对一个文件的读写,来通信也是一种手段,但是需要同步控制。

 10.Android四大组件是:Activity、Service、Broadcast Receiver、Content Provider

11.JAVA中,final修饰的类、成员函数、变量分别有什么特点?

类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。

将变量声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。

将方法声明为final,则方法只能使用,而不能在子类重写。

12.java中Thread.sleep()和 Object.wait() 有什么区别?

sleep是使线程休眠一段时间。在sleep休眠时间到期后,线程不一定立即恢复执行,除非系统没有其它更高优先级的任务正在执行

wait是线程间实现同步的一种机制。调用wait的线程会主动进入等待状态,直到被其它线程唤醒或者等待超时

13.sprintf、strcpy、strncpy及 memcpy 函数,请问这些函数功能有什么区别?从安全角度考虑一般应该用哪个函数复制字符串? 

sprintf为格式化字符串函数

strcpy为字符串复制函数

strncpy也是字符串复制函数,但是可以指定最大复制长度

memcpy为内存复制函数

从安全角度应该选strncpy,不易出现越界异常

14.算法 最长公共子串

function findSubStr(s1,s2){
   var S=sstr= "" ,L1=s1.length,L2=s2.length;
   if (L1>L2){ var s3=s1;s1=s2,s2=s3,L1=s2.length;}
   for ( var j=L1;j> 0 ;j--)
     for ( var i= 0 ;i<=L1-j;i++){
       sstr = s1.substr(i,j);
       if (s2.indexOf(sstr)>= 0 ) return sstr;
     }
   return "" ;
}
document .writeln(findSubStr( "aaa3333" , "baa333cc" )); //aa333
document .writeln(findSubStr( "aaaX3333--" , "baa333ccX3333333x" )); //X3333
 
 
 

猜你喜欢

转载自www.cnblogs.com/mengmengya/p/9472341.html