面试题

c++

1、memset一个对象

     1、内存泄漏

     2、调用虚函数和dynamic_cast出现问题

2、宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变
量的功能。请看上面第一大点代码的第三行:

typedef    (int*)      pINT;

以及下面这行:
#define    pINT2    int*
#define    pINT2    int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b。


 typedef的四个用途和两个陷阱
用途一: 
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: 
char*   pa,   pb;     //   
char*   pa,   pb;     //   这多数不符合我们的意图,它只声明了一个指向字符变量的指针,   
//   
//   和一个字符变量;

 
以下则可行: 
typedef   char*   PCHAR;     //   
typedef   char*   PCHAR;     //   一般用大写 
PCHAR   pa,   pb;                 //   
PCHAR   pa,   pb;                 //   可行,同时声明了两个指向字符变量的指针 


虽然: 
char   *pa,   *pb; 
char   *pa,   *pb; 
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 
    

3、多态原理:关键字:静态绑定、动态绑定、内存模型、虚函数表、虚函数表

4、简述C++中虚继承的作用及底层实现原理?

         为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。
这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决
了二义性问题,也节省了内存,避免了数据不一致的问题。
         底层实现原理:底层实现原理与编译器相关,类B和类C通过虚继承的方式派生自类A,这两个对象的内存布局中,编译器在对象中添加了一个vbptr(virtual base pointer)指针,vbptr指向了一张表,这张表保存了当前的虚指针相对于虚基类的首地址的偏移量。类D派生与类B和类C,继承了两个基类的vbptr指针,并调整了vbptr与虚基类的首地址的偏移量,使得这种菱形问题在继承时只继承一份数据,并且解决了二义性的问题。
        当使用虚继承时,虚基类是被共享的,也就是在继承体系中无论被继承多少次,对象内存模型中都只会出现一个虚基类的子对象。

继承内存布局


6、封装定义和好处:隐藏对象的属性和实现细节,仅对外提供公共访问方式。

     (1)对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

     (2)不暴露内部细节,容易升级维护,当代码需要修改时只需要修改存取方法。

7、派生类是无法继承构造和析构函数。


8、复制构造函数什么时候调用

拷贝构造函数应用的场合由以下几个方面:
  1 函数的参数是一个对象,并且是值传递方式
  2 函数的返回值是一个对象,并且是值传递方式
  3 用一个对象初始化另外一个对象
赋值运算符则在一个现存的对象被赋予新的值时被调用,并且它有返回值。

Test test; //实例化test对象时调用了默认构造函数
Test test1=test;// test1使用了复制构造函数(因为这是一个新的对象产生)
Test test2(test);//test2时也是用了复制构造函数,
Test test3=test2=test1;//而test2=test1则使用了赋值构造函数(没有新的对象产生),
Test test3=test2=test1;//test3=test2则使用了复制构造函数,原因同上。


9、g++中-l -L 和-I

-l
参数就是用来指定程序要链接的库,-l参数紧接着就是库名
-L
表示:编译程序按照-L指定的路进去寻找库文件,一般的在-L的后面可以一次用-l指定多个库文件。
-I
表示:编译程序按照-I指定的路进去搜索头文件。


10、memcpy和strcpy的区别

extern char *strcpy(char* dest, const char *src);
头文件:#include <string.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
返回 值:返回dest的值
一个内存拷贝函数的实现体

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

4、strcpy中dst和src不能重叠,memcpy可以重叠

网络

1、阻塞read和非阻塞read

2、SYN攻击

3、对HTTP的了解

     1、定义:超文本传输协议,用于从WWW服务器传输超文本到本地浏览器的传输协议

                                                  是客户端浏览器和其他WEB服务器之间的应用层通信协议

          特点:

                     B/S模式

                     无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,即断开连接

                     无状态,协议对事务处理没有记忆能力,每个请求都是独立的

三种主要方法方式

GET         请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。             

GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.      

HTTP请求


GET /hello.txt HTTP/1.1    #请求行
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3  #请求头部
Host: www.example.com
Accept-Language: en, mi
                                           #空行
....                                       #请求数据

服务器响应消息


HTTP状态码

C/S和B/S架构

session和cookie

http 1.1

           1、HTTP1.0无连接,HTTP 1.1支持默认的长连接(PersistentConnection)和请求的流水线(Pipelining)处理

           2、100(Continue) Status(节约带宽)
                 HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。

           3、增加host字段
                 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。

http 2.0

            1、二进制分帧

                 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层,二进制更紧凑、更高效,错误更少。客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。               

            2、多路复用的,而非有序并阻塞的

在HTTP 1.x中,如果客户端想发送多个并行的请求以及改进性能,那么必须使用多个TCP连接。 HTTP 2.0通过让所有数据流共用同一个连接,可以更有效地使用TCP连接。HTTP 2.0不仅

能够减少网络延迟,还有助于提高吞吐量和降低运营成本!

           3、服务器推送

                  服务器除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求,缓存到客户端,避免往返延迟。

            4、首部压缩

                 HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

http 1.0/1.1/2.0区别

4、OSI七层和TCP/IP五层

应用层:为用户提供各种网络服务

表示层:数据转换、包括数据的加密、压缩、格式转换

会话层:负责建立、管理、终止实体间的会话

传输层(数据单segment):将上层的数据分段,提供端到端的传输

网络层(分组packet):负责对子网间的数据进行路由选择、分组转发、还可以实现拥塞控制、忘记互联

数据链路层(帧Frame):在不可靠的物理介质上提供可靠的传输,物理寻址、数据成帧、流量控制、差错检测

物理层(比特):为上层提供数据传输的物理媒体


从应用层到数据链路层的传输

会话层:点击打开链接

              点击打开链接

5、ping执行过程


6、reactor和proactor

数据库


mysql -u root -p

CREATE DATABASE 库名
DROP DATABASE 库名;


create table customers(
    id int not null auto_increment,
    name char(20) not null,
    address char(50) null,
    city char(50) null,
    age int not null,
    love char(50) not null default 'No habbit',
    primary key(id)
)engine=InnoDB;
drop table tablename;
#重命名表
rename table pet to animals;
#修改表结构
#增加一列
alter table pet add column des char(100) null;
#增加索引
ALTER TABLE parts ADD INDEX idx_model (model);
#删除
alter table pet drop column des;
#增
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
#删
delete from where...
#查
select
#改
UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;


1、查询没有选课的学生

select * from 学生表 where 学号 not in (select 学号 from 选课表)

2、Btree索引和HASH索引的区别


Btree索引使用Btree树,是一种多叉平衡树,可以利用Btree进行全关键字、关键字范围和关键字前缀查询

有Btree索引却不能使用Btree索引的场景:(1)以%开头的like查询;(2)数据类型出现隐式转换的时候;(3)复合索引下不符合最左原则;(4)如果Mysql估计索引比全表扫描更慢;(5)用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引


只有Memory和Heap引擎支持Hash索引,Hash索引社用于Key-Value查询,通过Hash索引要比通过BTree索引更迅速

(1) Hash 索引只能够用于使用 = 或者 <=> 运算符的相等比较(但是速度更快)。Hash 索引不能够用于诸如 < 等用于查找一个范围值的比较运算符。依赖于这种单值查找的系统被称为 "键-值存储";对于这种系统,尽可能地使用 hash 索引。

(2) 优化器不能够使用 hash 索引来加速 ORDER BY 操作。这种类型的索引不能够用于按照顺序查找下一个条目。

(3) MySql 无法使用 hash 索引估计两个值之间有多少行(这种情况由范围优化器来决定使用哪个索引)。如果你将一张 MyISAM 或 InnoDB 表转换成一个 hash 索引的内存表时,一些查询可能会受此影响。

(4) 查找某行记录必须进行全键匹配。而 B-tree 索引,任何该键的左前缀都可用以查找记录。

(5)Hash 索引在任何时候都不能避免表扫描。

(6)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。


一般来说,应该在这些列上创建索引:

(1)在经常需要搜索的列上,可以加快搜索的速度;

(2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引:

第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。

第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。


3、模拟死锁

session1session2
set autocommit=0;
	set autocommit=0;
select first_name, last_name from actor
where actor_id=1 for update;
 
 
insert into country(country_id, country)
values(110, 'test');
insert into country(country_id, country)
values(110, 'test');
 
 
select first_name, last_name from actor
where actor_id=1 for update;
insert into country(country_id, country)
values(110, 'test');
!!!死锁
 

解决死锁:

1、约定以相同的顺序来访问表

2、事先对数据排序,保证每个线程按固定的顺序来处理记录

3、


4、分页查询

两种方法

(1)
SELECT COUNT(*) FROM foo WHERE b = 1;#查出符合条件的记录总数
SELECT a FROM foo WHERE b = 1 LIMIT 100,10;#查询当页要显示的数据

(2)
SELECT SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10;
SELECT FOUND_ROWS();
#这样只要执行一次较耗时的复杂查询可以同时得到与不带limit同样的记录条数
#第二个 SELECT返回一个数字,指示了在没有LIMIT子句的情况下,第一个SELECT返回了多少行 (若上述的 SELECT语句不包括 SQL_CALC_FOUND_ROWS 选项,则使用LIMIT 和不使用时,FOUND_ROWS() 可能会返回不同的结果)。
分页性能优化,利用覆盖索引

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20 #在id上有主键
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

5、去重

#单列去重
select distinct name from table
#distinct只能放在最开头,此时只有所有字段都不相同才不相同
select distinct name, id from table
#要查询多列时去重,使用group by
select *, count(distinct name) from table group by name



6、查询班级人数前三的班级

select class, count(*) from school group by(class) order by count(*);

7、Union和Join

Union:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。Union all包含重复字段

Join:基于这些表之间的共同字段,把来自两个或多个表的行结合起来。join 是两张表做交连后里面条件相同的部分记录产生一个记录集,
union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。

INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;DDL


8、在表A不在表B中

#方法一
#  使用 not in ,容易理解,效率低  ~执行时间为:1.395秒~
select distinct A.ID from  A where A.ID not in (select ID from B)
#方法二
#  使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录  ~执行时间:0.739秒~

1 select A.ID from A left join B on A.ID=B.ID where B.ID is null


9、DDL

#创建用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 
#说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器. 
#删除用户
DROP USER 'username'@'host'; 
CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456'; 
CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; 
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%'; 
#授权
GRANT privileges ON databasename.tablename TO 'username'@'host' GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; 
GRANT ALL ON *.* TO 'pig'@'%'; 

#撤销权限
REVOKE privilege ON databasename.tablename FROM 'username'@'host'; REVOKE SELECT ON *.* FROM 'pig'@'%'; 
#设置与更改用户密码
 SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');#当前用户SET PASSWORD = PASSWORD("newpassword"); 
#其他用户SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456"); 

	

10、exist和in区别

       not exists 和 not in

11、ACID

       事务优缺点:

       事务处理的引入是为了解决操作的原子性,正如fita所提到的转帐中的动作,如果后一个动作失败,可以通过事务回滚(rollback)回到事务开始的状态。
       事务和无事务各有优缺点
       有事务:安全,可一次提交多个操作,可回滚,可恢复
       无事务:高速,节省磁盘空间,操作节省内存

       索引优缺点:

       优点:
        可以提高检索数据的速度;
        对有依赖关系的子表和父表之间的联合查询时,可以提高查询速度
        使用分组和排序子句进行数据查询时,同样可以显著节省分组和排序的时间
         缺点:
        创建和维护索引需要耗费时间,耗费的数量随着数据量的增加而增加;
        索引需要占据物理空间;


表结构为:  
---------------------  
class    name    score  
班级     姓名     分数   
  
查询每个班级中, 及格和不及格学生的人数   
SELECT  `class`,  
        SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END) as gt60,  
        SUM(CASE WHEN score>=60 THEN 0 ELSE 1 END) as lt60  
FROM tb1  
GROUP BY class  
  
SELECT  class,  
        SUM( IF(score >= 60, 1, 0) ) as gt,  
        SUM( IF(score < 60, 1, 0 ) ) as lt  
FROM tb1  
GROUP BY class;  


Linux

1、文件夹中文件个数

ls -l |grep "^-"|wc -l #文件夹下文件个数
ls -l |grep "^d"|wc -l #文件夹下目录个数
ls -lR |grep "^d"|wc -l #文件个数,包括自文件夹里的

2、批量杀死进程
ps -ef|grep aaa|grep -v grep| cut -c 9-15 | xargs kill -9
#grep -v grep过滤掉含有grep的行

#或者
ps -ef|grep aaa|grep -v grep|awk  '{print "kill -9 " $2}' |sh
#sh用于执行命令


3、判断IP地址是否合法

6、统计文件中出现次数最多的前10个单词
cat words.txt | sort | uniq -c | sort -k1,1nr | head -10
7、在当前目录及子目录下查找含有“abc”的文件
find . -name "*abc*" #名字带有abc
find .|xargs grep -ri "abc" #内容带有abc

xargs:很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令
grep:
     -i 胡列字符大小写的差别。
     -r 搜索子目录

8、查看CPU

top #动态显示CPU利用率
ps  #显示瞬间进程的动态
vmstat #展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
cat /proc/cpuinfo  #查看CPU信息
sar

9、grep

-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-v 显示不包含匹配文本的所有行。
-C显示匹配行的前后几行

#查询文件名中包含abc的文件
ls -lR | grep "abc"
#查看前后n行
grep  -c2  "abc"
grep -A 5 可以显示匹配内容以及后面的5行内容
grep -B 5 可以显示匹配内容以及前面的5行内容
grep -C 5 可以显示匹配内容以及前后面的5行内容

10、统计日志文件a.log中有多少行包含error

cat $1 | grep -i -c '\<error\>' 
          -i :忽略大小写的匹配
          -c:输出总共匹配到多少行
          \<:单词开始的位置
          \>:单词结尾的位置

11、从file文件中读取文件的内容并输出

#!/bin/bash  
while read line     #read是以换行符作为分割符的  
do  
    echo $line  
done <$1    

12、如何统计日志里面访问次数最多的IP

要处理的内容

[root@server2 ~]# netstat -ntu
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 127.0.0.1:8652 127.0.0.1:40193 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40192 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40196 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40199 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40201 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40204 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40207 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40210 TIME_WAIT
tcp 0 0 192.168.32.62:41682 192.168.47.207:5432 TIME_WAIT
tcp 0 0 192.168.32.62:41685 192.168.47.207:5432 TIME_WAIT


 netstat -ntu | tail -n +3 | awk '{ print $5}' | cut -d : -f 1 | sort | uniq -c| sort -n -r | head -n 5
    tail -n +3 :去掉上面用红色标明的两行。
    awk '{ print $5}':取数据的低5域(第5列),上面蓝色标明。
    cut -d : -f 1 :取蓝色部分前面的IP部分。
    sort:对IP部分进行排序。
    uniq -c:打印每一重复行出现的次数。(并去掉重复行)
    sort -n -r:按照重复行出现的次序倒序排列。
    head -n 5:取排在前5位的IP 。

13、将文本文件里的多行合成同一行

$cat test.txt
001
002
003
004
005
006
0000999
cat test.txt | xargs
tr -s "\n" " " < test.txt;echo
awk '{printf("%s ",$0);}END{print}' test.txt

14、查看半连接状态

netstat -ntu | grep "FIN_WAIT2"

15、gdb

gdb 调试高级命令


16、lsof

17、定时执行

crontab

at


18、清空文件内容

> /var/log/asterisk/messages 
#或者 
:> /var/log/asterisk/messages #(文件大小被截为0字节)
cat /dev/null > /var/log/asterisk/messages (文件大小被截为0字节)

echo "" > /var/log/asterisk/messages
#(文件大小被截为1字节)
清空文件夹下所有文件内容
ls -l | grep "^-" | awk '{ print "cat /dev/null>" $9}' |sh

19、su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;
而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。

20、不同主机间copy

21、对于一个日志文件

2012-09-05 01:48:47,150 WARN  [WorkManager(3)-72] [service.PhoneRangeManager] phone range domain object not found id 1834930
2012-09-05 02:48:47,293 WARN  [WorkManager(3)-28] [service.PhoneRangeManager] phone range domain object not found id 1834930
2012-09-05 03:50:14,085 WARN  [WorkManager(3)-61] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 04:50:14,223 WARN  [WorkManager(3)-67] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 05:50:14,361 WARN  [WorkManager(3)-14] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 06:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 07:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 08:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 10:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
BasicAction: -3f57fefa:8d29:50463160:ddaee80 status: ActionStatus.RUNNING >, lock :com.wxxr.common.service.UserAccountLockService$Lock@10b3d72
2012-09-05 11:52:02,732 WARN  [WorkManager(3)-46] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 12:52:02,873 WARN  [WorkManager(3)-19] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 09:52:03,010 WARN  [WorkManager(3)-95] [service.PhoneRangeManager] phone range domain object not found id 1881137

(1)取出某一时间段的

awk 'BEGIN{FS="[-| |:]"}$4 >= 9 && $4 <= 12{print $4}' log.txt
(2)某时间段个数

#!/bin/bash
awk 'BEGIN{FS="[-| |:]"}{a[$4]++}
END{
   for(i in a){
      print i "," a[i]
   }
}' log.txt



操作系统

1、死锁

死锁
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
 产生死锁的原因主要是
       1) 因为系统资源不足。
       2) 进程运行推进的顺序不合适。
       3) 资源分配不当等
死锁发生的必要条件(Coffman条件)
       (1) 资源独占(mutual exclusion),即一个资源在同一时刻只能分配给一个进程。
            如果进程申请某一资源, 而该资源正被另一进程占用, 则申请者需等待, 直到占有者释放该资源。
       (2) 不可剥夺(non-preemption),即资源申请者不能从资源占有者手中抢夺资源。
       (3) 保持申请(hold-while-applying),进程已经保持申请了至少一个资源,但又提出了新资源的请求,而新资源又被其他进程占有,此时进程阻塞,但对自己已获得资源保持不放。
       (4) 循环等待(circular wait),即存在一个进程等待序列{p1,p2,…,pn}, 其中p1等待p2占用的某一资源, p2等待p3占用的某一资源,…,pn等待p1占用的某一资源。
        仅当四个条件 同时满足死锁才会发生。
注意:
        1.只要破坏一个条件, 死锁就不会发生.
        2.每类资源只有一个时, 为充要条件.
处理死锁的基本方法:
        (1)预防死锁:预防策略,事先预防,破坏产生死锁的必要条件
                                   资源一次性分配:(破坏保持申请)
                                   可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
                                   资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
                                   
        (2)避免死锁:预防策略,实现不采取各种限制措施破坏死锁产生的必要条件,而是利用动态资源分配策略,使每次资源分配都安全,避免死锁
        (3)检测死锁:化简 资源分配图
                                   资源分配图的简化过程:(1)在图中找到一个进程顶点Pi,Pi没有请求边或请求变均能立即满足;(2)若找到这样的Pi,则将与Pi相连的边全部删去,转(1);否则化简结束
                                   如果化简后所有的进程定点都成了孤立点,则称该图可以完全化简;否则,则称该图是不可完全化简的。
        (4)死锁恢复:允许死锁发生,检测出后将发生的死锁清除掉。
                                   
                                   剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
                                   撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

预防死锁
            a、摈弃“请求和保持条件”
                  静态资源分配法,所有进程在开始之前,都必须一次性申请所需全部资源,充足则分配,如果一种资源不满足,即时其他资源都空闲,也不分配给该进程,摈弃保持条件
            b、摈弃“不可剥夺”条件
                  当进程需猪哥的提出对各个资源的请求,如果一个已经获取,再提出另一种资源请求而不能立即满足时,必须释放它已经保持了的所有资源,以后重新申请。这意味着某一进程已经占有的资源,在运行过程中会被暂时释放,摈弃了“不剥夺”
            c、摈弃“环路等待”条件

避免死锁银行家算法


2、互斥量和临界区的区别

四种进程或线程同步互斥的控制方法
1、临界区:每个进程中访问临界资源的那段代码称为临界区,一次仅允许一个进程/线程使用的资源称为临界资源
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。


临界区(Critical Section)(同一个进程内,实现互斥)
保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。


互斥量(Mutex)(可以跨进程,实现互斥)
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。


信号量(Semaphores)(主要是实现同步,可以跨进程)
信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出


事件(Event)(实现同步,可以跨进程)
事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。

3、线程安全(1)

      线程安全(2)

      可重入

算法

1、各种排序优化

插入排序:二分查找

快排优化

冒泡优化:(1)bool变量记录上次交换了没;(2)记录上次交换位置


shell

dd#删除某行
:1,10d 删除1到第10行
ndd #删除光标所在行及以下下n行
yy#复制光标所在行,其他如上
gg#移动光标到到第一行
nG #到第n行
G #到最后一行
:n1,n2s/word1/word2/g #替换
:1,$/word1/word2/g #替换到最后一行
:w
:wq!
:q!
r#撤销
ctrl+r#取消撤销
:/s/a.*/xyz/g#替换

1、vim四种模式


测试
1、洗牌算法评价
时间复杂度、空间复杂度、混乱度:测试一个洗牌程序的正确性:运行该洗牌程序m次,然后计算每张牌在每个位置出现的次数,这个次数应该接近m/n,其中n为牌的数目

测试算法1~3以及STL洗牌的函数:


2、软件测试的目的

     使用人工或自动手段,来运行或测试某个系统的过程。其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。

软件生命周期

软件测试的基本流程


一:单元测试、集成测试、系统测试和验收测试(确认测试);
二:测试需求分析,测试计划编写,测试用例编写,测试,缺陷记录,回归测试,判断测试结束,测试报告提交。
三:
测试流程依次如下:
1.需求:阅读需求,理解需求,与客户、开发、架构多方交流,深入了解需求。--testing team
2.测试计划: 根据需求估算测试所需资源(人力、设备等)、所需时间、功能点划分、如何合理分配安排资源等。---testing leader or testing manager
3.用例设计:根据测试计划、任务分配、功能点划分,设计合理的测试用例。---testing leader, senior tester
4.执行测试:根据测试用例的详细步骤,执行测试用例。--every tester(主要是初级测试人员)
5.执行结果记录和bug记录:对每个case记录测试的结果,有bug的在测试管理工具中编写bug记录。--every tester(主要是初级测试人员)
6.defect tracking:追踪leader分配给你追踪的bug.直到 bug fixed。--every tester
7.测试报告:通过不断测试、追踪,直到被测软件达到测试需求要求,并没有重大bug.
8.用户体验、软件发布等……

测试方法总结

计算机组成原理

硬盘和内存的区别


数据结构

红黑树和AVL区别

红黑树是牺牲了严格的高度平衡的优越条件为代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,插入最多需要两次旋转,删除最多需要三次旋转,染色的复杂度都是O(logn),AVL插入最多需要一次旋转,但删除最多需要O(logn)次旋转。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高.

其他

MVC


百度搜索框的测试


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值