笔试题笔记一

1,C++中struct的成员默认属性是public,class的成员默认属性是private;

2,Linux中父子进程的

3,冒泡排序、选择排序、插入排序O(n方);希尔排序O(n3/2),堆排序O(nlogn),归并排序时间复杂度O(nlogn),空间复杂度O(n+logn),快速排序时间复杂度O(nlogn),空间复杂度O(logn);

4,MYSQL索引

索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容。在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找。找到的这些符合条件的字段后再读取字段A所指向真实的数据记录的物理地址,再把对应的数据内容输出。 如果你查找的不是索引的字段那么他会从数据表里面查找。因为数据表有很多不相关的字段,数据库程序是不会省略不查找。要判断那些不相关的字段以及多次在记录中跳转是花费一定的资源的。 当然不是设置越多索引就越好。因为索引都放到这个独立区间S,独立区间S越大搜索所占的资源就越大。如果你只有一个字段为索引,那么你搜索这个字段是非常快速的。
假如你有一个表,
  SQL> CREATE TABLE test_tab (2 id INT,
  3 name VARCHAR(10),
  4 age INT,
  5 val VARCHAR(10)6 );你的业务,有一个查询,是
  SELECT * FROM test_tab WHERE name = 一个外部输入的数据
  刚开始,数据不多的时候,执行效果还不错。
  随着数据量的增加,这个查询,执行起来,越来越慢了。
  然后在 name 上面 建立了索引
  CREATE INDEX idx_test4_name ON test_tab (name );
  这样, 可以加快前面那个查询的速度。
  但是,某天,你执行了下面这个SQL, 发现速度又慢了
  SELECT * FROM test_tab WHERE age = 25
  为啥呢? 因为 age 字段上面,没有索引
  索引只在 name 上面有
  换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。
  多列索引,就是一个索引,包含了2个字段。
  例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE '张%'
  AND age = 25
  这样的查询,将能够使用上面的索引。
  多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:SELECTAVG( avg ) AS 平均年龄FROMtest_tabWHEREname LIKE '张%'
  这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。
索引类型分类:①主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索 引的关键字绝对不允许有重复值。②候选索引:和主索引类似,它的值也 不允许在指定的字段或表达式中重复。一个表中可以有多个 候选索引。③唯一索引:唯一索引允许关键字取重复的值。当有重复值 出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的 版本。④普通索引:普通索引允许关键字段有相同值。在一对 多关系的多方,可以使用普通索引
授予权限的格式是grant on(表名)to(角色名),@localhost(本地主机)是指这台计算机的用户张三。

5,

(1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。

(2.普通成员函数与sizeof无关。

(3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节。

(4.类的总大小也遵守类似class字节对齐的,调整规则。

6,若一个算法的时间复杂度用T(n)表示,其中n的含义是问题规模。

7,一个类只能有一个析构函数。

8,在引入线程的操作系统中,线程是进程中的一个实体,是系统独立调度和分派的基本单位。但是线程自己基本上不拥有系统资源,所以它不是资源分配的基本单位,它只拥有一部分在运行中必不可少的与处理机相关的资源,如线程状态、寄存器上下文和栈等,它同样有就绪、阻塞和执行三种基本状态。它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。由于用户线程不依赖于操作系统内核,因此,操作系统内核是不知道用户线程的存在的,用户线程是由用户来管理和调度的,用户利用线程库提供的API来创建、同步、调度和管理线程。所以,用户线程的调度在用户程序内部进行,通常采用非抢先式和更简单的规则,也无须用户态和核心态切换,所以速度很快。由于操作系统不知道用户线程的存在,所以,操作系统把CPU的时间片分配给用户进程,再由用户进程的管理器将时间分配给用户线程。那么,用户进程能得到的时间片即为所有用户线程共享。

9,c++中规定,重载运算符必须和用户定义的自定义类型的对象一起使用。

10,Linux进程状态:

R (TASK_RUNNING),可执行状态。

S (TASK_INTERRUPTIBLE),可中断的睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。

T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。

Z (TASK_DEAD – EXIT_ZOMBIE),退出状态,进程成为僵尸进程。在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。
子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。

X (TASK_DEAD – EXIT_DEAD),退出状态,进程即将被销毁。

进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。

如果给一个TASK_INTERRUPTIBLE状态的进程发送SIGKILL信号,这个进程将先被唤醒(进入TASK_RUNNING状态),然后再响应SIGKILL信号而退出(变为TASK_DEAD状态)。并不会从TASK_INTERRUPTIBLE状态直接退出。

进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。执行唤醒的进程设置被唤醒进程的状态为TASK_RUNNING,然后将其task_struct结构加入到某个CPU的可执行队列中。于是被唤醒的进程将有机会被调度执行。

而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径:
1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态;
2、执行系统调用主动进入TASK_INTERRUPTIBLE状态(如nanosleep系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态(如select系统调用)。
显然,这两种情况都只能发生在进程正在CPU上执行的情况下。

10, 

平衡二叉查找树:AVL树和红黑树它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。

排序总结:http://blog.csdn.net/edward_wong/article/details/40376053

11,time_wait状态

让4次握手关闭流程更加可靠;4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。

  如果主动关闭端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么当主动端ACK丢失,被动方将重发最终的FIN,而主动端将响应RST,被动端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。

  因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值