Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

介绍:什么是线程,线程的优点是什么

线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。

线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,完成相关任务的不同代码间需要交换数据。如果采用多进程的方式,那么通信就需要在用户空间和内核空间进行频繁的切换,开销很大。但是如果使用多线程的方式,因为可以使用共享的全局变量,所以线程间的通信(数据交换)变得非常高效。

Hello World(线程创建、结束、等待)

创建线程 pthread_create

线程创建函数包含四个变量,分别为: 1. 一个线程变量名,被创建线程的标识 2. 线程的属性指针,缺省为NULL即可 3. 被创建线程的程序代码 4. 程序代码的参数 For example: - pthread_t thrd1? -

pthread_attr_t attr? - void thread_function(void argument)? - char *some_argument?

pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument);

结束线程 pthread_exit

线程结束调用实例:pthread_exit(void *retval); //retval用于存放线程结束的退出状态

线程等待 pthread_join

pthread_create调用成功以后,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度,如果我们需要等待指定线程结束,需要使用pthread_join函数,这个函数实际上类似与多进程编程中的waitpid。 举个例子,以下假设 A 线程调用 pthread_join 试图去操作B线程,该函数将A线程阻塞,直到B线程退出,当B线程退出以后,A线程会收集B线程的返回码。 该函数包含两个参数:pthread_t th //th是要等待结束的线程的标识

void **thread_return //指针thread_return指向的位置存放的是终止线程的返回状态。

调用实例:pthread_join(thrd1, NULL);

example1:

1 /*************************************************************************

2 > F i l e N a m e: t h r e a d_h e l l o_w o r l d.c

3 > A u t h o r: c o u l d t t(f y b y)

4 > M a i l: f u y u n b i y i@g m a i l.c o m

5 > C r e a t e d T i m e: 2013年12月14日 星期六 11时48分50秒

6 ************************************************************************/

7

8 #i n c l u d e

9 #i n c l u d e

10 #i n c l u d e

11

12 v o i d p r i n t_m e s s a g e_f u n c t i o n (v o i d *p t r)?

13

14 i n t m a i n()

15 {

16 i n t t m p1, t m p2?

17 v o i d *r e t v a l?

18 p t h r e a d_t t h r e a d1, t h r e a d2?

19 c h a r *m e s s a g e1 = "t h r e a d1"?

20 c h a r *m e s s a g e2 = "t h r e a d2"?

21

22 i n t r e t_t h r d1, r e t_t h r d2?

23

24 r e t_t h r d1 = p t h r e a d_c r e a t e(&t h r e a d1, N U L L, (v o i d *)&p r i n t_m e s s a g e_f u n c t i o n, (v o i d *) m e s s a g e1)?

25 r e t_t h r d2 = p t h r e a d_c r e a t e(&t h r e a d2, N U L L, (v o i d *)&p r i n t_m e s s a g e_f u n c t i o n, (v o i d *) m e s s a g e2)?

26

27 // 线程创建成功,返回0,失败返回失败号

28 i f (r e t_t h r d1 != 0) {

29 p r i n t f("线程1创建失败\n")?

30 } e l s e {

31 p r i n t f("线程1创建成功\n")?

32 }

33

34 i f (r e t_t h r d2 != 0) {

35 p r i n t f("线程2创建失败\n")?

36 } e l s e {

37 p r i n t f("线程2创建成功\n")?

38 }

39

40 //同样,p t h r e a d_j o i n的返回值成功为0

41 t m p1 = p t h r e a d_j o i n(t h r e a d1, &r e t v a l)?

42 p r i n t f("t h r e a d1 r e t u r n v a l u e(r e t v a l) i s %d\n", (i n t)r e t v a l)?

43 p r i n t f("t h r e a d1 r e t u r n v a l u e(t m p) i s %d\n", t m p1)?

44 i f (t m p1 != 0) {

45 p r i n t f("c a n n o t j o i n w i t h t h r e a d1\n")?

46 }

47 p r i n t f("t h r e a d1 e n d\n")?

48

49 t m p2 = p t h r e a d_j o i n(t h r e a d1, &r e t v a l)?

50 p r i n t f("t h r e a d2 r e t u r n v a l u e(r e t v a l) i s %d\n", (i n t)r e t v a l)?

51 p r i n t f("t h r e a d2 r e t u r n v a l u e(t m p) i s %d\n", t m p1)?

52 i f (t m p2 != 0) {

53 p r i n t f("c a n n o t j o i n w i t h t h r e a d2\n")?

54 }

55 p r i n t f("t h r e a d2 e n d\n")?

56

57 }

58

59 v o i d p r i n t_m e s s a g e_f u n c t i o n( v o i d *p t r ) {

60 i n t i = 0?

61 f o r (i? i<5? i++) {

62 p r i n t f("%s:%d\n", (c h a r *)p t r, i)?

63 }

64 }

编译

gcc thread_hello_world.c -otest -lpthread 一定要加上-lpthread,要不然会报错,因为源代码里引用了pthread.h里的东西,所以在gcc进行链接的时候,必须要找到这些库的二进制实现代码。

运行结果

结果分析: 1.这段程序我运行了两次,可以看到,两次的运行结果是不一样的,从而说明,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度。 2.另外,我们看到,在thread2的join结果出现了错误,打印出cannot join with thread2其实这个是个小错误,因为,我pthread_join传进去的th是thread1,在上面的结果中,thread1早已经结束了,所以我们再次等待thread1结束肯定会出现无法取到状态的错误的。

3.pthread_join(thread1, &retval)确实等待了thread1的结束,我们看到,在print_message_function函数循环了5遍结束以后,才打印出thread1 end

这是一个非常简单的例子,hello world级别的,只是用来演示Linux下C多线程的使用,在实际应用中,由于多个线程往往会访问共享的资源(典型的是访问同一个全局变量),因此多个县城间存在着竞争的关系,

这就需要对多个线程进行同步,对其访问的数据予以保护。

多线程的同步与互斥

方式一:锁

在主线程中初始化锁为解锁状态

pthread_mutex_t mutex?

pthread_mutex_init(&mutex, NULL)?

在编译时初始化锁为解锁状态

锁初始化 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER?访问对象时的加锁操作与解锁操作

加锁 pthread_mutex_lock(&mutex)

释放锁 pthread_mutex_unlock(&mutex)

不加锁,数据不同步

我们先来看一个不加锁,多个线程访问同一段数据的程序。

1 /*************************************************************************

2 > F i l e N a m e: n o_m u t e x.c

3 > A u t h o r: c o u l d t t(f y b y)

4 > M a i l: f u y u n b i y i@g m a i l.c o m

5 > C r e a t e d T i m e: 2013年12月15日 星期日 17时52分24秒

6 ************************************************************************/

7

8 #i n c l u d e

9 #i n c l u d e

10 #i n c l u d e

11

12 i n t s h a r e d i = 0?

13 v o i d i n c r e s e_n u m(v o i d)?

14

15 i n t m a i n(){

16 i n t r e t?

17 p t h r e a d_t t h r d1, t h r d2, t h r d3?

18

19 r e t = p t h r e a d_c r e a t e(&t h r d1, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

20 r e t = p t h r e a d_c r e a t e(&t h r d2, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

21 r e t = p t h r e a d_c r e a t e(&t h r d3, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

22

23 p t h r e a d_j o i n(t h r d1, N U L L)?

24 p t h r e a d_j o i n(t h r d2, N U L L)?

25 p t h r e a d_j o i n(t h r d3, N U L L)?

26

27 p r i n t f("s h a r e d i = %d\n", s h a r e d i)?

28

29 r e t u r n 0?

30

31 }

32

33 v o i d i n c r e s e_n u m(v o i d) {

34 l o n g i,t m p?

35 f o r(i=0? i<=100000? i++) {

36 t m p = s h a r e d i?

37 t m p = t m p + 1?

38 s h a r e d i = t m p?

39 }

40 }

编译

gcc no_mutex.c -onomutex -lpthread

运行分析

从上图可知,我们no_mutex每次的运行结果都不一致,而且,运行结果也不符合我们的预期,出现了错误的结果。 原因就是三个线程竞争访问全局变量sharedi,并且都没有进行相应的同步。

举个例子,当线程thrd1访问到sharedi的时候,sharedi的值是1000,然后线程thrd1将sharedi的值累加到了1001,可是线程thrd2取到sharedi的时候,sharedi的值是1000,这时候线程thrd2对sharedi的值进行加1操作,使其变成了1001,可是这个时候,sharedi的值已经被线程thrd1加到1001了,然而,thrd2并不知道,所以又将sharedi的值赋为了1001,从而导致了结果的错误。

这样,我们就需要一个线程互斥的机制,来保护sharedi这个变量,让同一时刻,只有一个线程能够访问到这个变量,从而使它的值能够保证正确的变化。

加锁,数据同步

通过加锁,保证sharedi变量在进行变更的时候,只有一个线程能够取到,并在在该线程对其进行操作的时候,其它线程无法对其进行访问。

1 /*************************************************************************

2 > F i l e N a m e: m u t e x.c

3 > A u t h o r: c o u l d t t(f y b y)

4 > M a i l: f u y u n b i y i@g m a i l.c o m

5 > C r e a t e d T i m e: 2013年12月15日 星期日 17时52分24秒

6 ************************************************************************/

7

8 #i n c l u d e

9 #i n c l u d e

10 #i n c l u d e

11

12 i n t s h a r e d i = 0?

13 v o i d i n c r e s e_n u m(v o i d)?

14

15 p t h r e a d_m u t e x_t m u t e x = P T H R E A D_M U T E X_I N I T I A L I Z E R?

16

17 i n t m a i n(){

18 i n t r e t?

19 p t h r e a d_t t h r d1, t h r d2, t h r d3?

20

21 r e t = p t h r e a d_c r e a t e(&t h r d1, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

22 r e t = p t h r e a d_c r e a t e(&t h r d2, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

23 r e t = p t h r e a d_c r e a t e(&t h r d3, N U L L, (v o i d *)i n c r e s e_n u m, N U L L)?

24

25 p t h r e a d_j o i n(t h r d1, N U L L)?

26 p t h r e a d_j o i n(t h r d2, N U L L)?

27 p t h r e a d_j o i n(t h r d3, N U L L)?

28

29 p r i n t f("s h a r e d i = %d\n", s h a r e d i)?

30

31 r e t u r n 0?

32

33 }

34

35 v o i d i n c r e s e_n u m(v o i d) {

36 l o n g i,t m p?

37 f o r(i=0? i<=100000? i++) {

38 /*加锁*/

39 i f (p t h r e a d_m u t e x_l o c k(&m u t e x) != 0) {

40 p e r r o r("p t h r e a d_m u t e x_l o c k")?

41 e x i t(E X I T_F A I L U R E)?

42 }

43 t m p = s h a r e d i?

44 t m p = t m p + 1?

45 s h a r e d i = t m p?

46 /*解锁锁*/

47 i f (p t h r e a d_m u t e x_u n l o c k(&m u t e x) != 0) {

48 p e r r o r("p t h r e a d_m u t e x_u n l o c k")?

49 e x i t(E X I T_F A I L U R E)?

50 }

51 }

52 }

结果分析

这一次,我们的结果是正确的,锁有效得保护了我们的数据安全。然而:

1. 锁保护的并不是我们的共享变量(或者说是共享内存),对于共享的内存而言,用户是无法直接对

其保护的,因为那是物理内存,无法阻止其他程序的代码访问。事实上,锁之所以对关键区域进行了保护,在本例中,是因为所有线程都遵循了一个规则,那就是在进入关键区域钱加同一把锁,在退出关键区域钱释放同一把锁

2. 我们从上述运行结果中可以看到,加锁是会带来额外的开销的,加锁的代码其运行速度,明显比不

加锁的要慢一些,所以,在使用锁的时候,要合理,在不需要对关键区域进行保护的场景下,我们便不要画蛇添足,为其加锁了

方式二:信号量

锁有一个很明显的缺点,那就是它只有两种状态:锁定与不锁定。

信号量本质上是一个非负数的整数计数器,它也被用来控制对公共资源的访问。当公共资源增加的时候,调用信号量增加函数sem_post()对其进行增加,当公共资源减少的时候,调用函数sem_wait()来减少信号量。其实,我们是可以把锁当作一个0-1信号量的。

它们是在/usr/include/semaphore.h中进行定义的,信号量的数据结构为sem_t, 本质上,它是一个long型整数

相关函数

在使用semaphore之前,我们需要先引入头文件#include

初始化信号量: int sem_init(sem_t *sem, int pshared, unsigned int value);

成功返回0,失败返回-1

参数

sem:指向信号量结构的一个指针

pshared: 不是0的时候,该信号量在进程间共享,否则只能为当前进程的所有线程们共享

value:信号量的初始值

信号量减1操作,当sem=0的时候该函数会堵塞 int sem_wait(sem_t *sem);

成功返回0,失败返回-1

参数

sem:指向信号量的一个指针

信号量加1操作 int sem_post(sem_t *sem);

参数与返回同上

销毁信号量 int sem_destroy(sem_t *sem);

参数与返回同上

代码示例

1 /*************************************************************************

2 > F i l e N a m e: s e m.c

3 > A u t h o r: c o u l d t t(f y b y)

4 > M a i l: f u y u n b i y i@g m a i l.c o m

5 > C r e a t e d T i m e: 2013年12月15日 星期日 19时25分08秒

6 ************************************************************************/

7

8 #i n c l u d e

9 #i n c l u d e

10 #i n c l u d e

11 #i n c l u d e

12

13 #d e f i n e M A X S I Z E 10

14

15 i n t s t a c k[M A X S I Z E]?

16 i n t s i z e = 0?

17 s e m_t s e m?

18

19 // 生产者

20 v o i d p r o v i d e_d a t a(v o i d) {

21 i n t i?

22 f o r (i=0? i< M A X S I Z E? i++) {

23 s t a c k[i] = i?

24 s e m_p o s t(&s e m)? //为信号量加1

25 }

26 }

27

28 // 消费者

29 v o i d h a n d l e_d a t a(v o i d) {

30 i n t i?

31 w h i l e((i = s i z e++) < M A X S I Z E) {

32 s e m_w a i t(&s e m)?

33 p r i n t f("乘法: %d X %d = %d\n", s t a c k[i], s t a c k[i], s t a c k[i]*s t a c k[i])?

34 s l e e p(1)?

35 }

36 }

37

38 i n t m a i n(v o i d) {

39

40 p t h r e a d_t p r o v i d e r, h a n d l e r?

41

42 s e m_i n i t(&s e m, 0, 0)? //信号量初始化

43 p t h r e a d_c r e a t e(&p r o v i d e r, N U L L, (v o i d *)h a n d l e_d a t a, N U L L)?

44 p t h r e a d_c r e a t e(&h a n d l e r, N U L L, (v o i d *)p r o v i d e_d a t a, N U L L)?

45 p t h r e a d_j o i n(p r o v i d e r, N U L L)?

46 p t h r e a d_j o i n(h a n d l e r, N U L L)?

47 s e m_d e s t r o y(&s e m)? //销毁信号量

48

49 r e t u r n 0?

50 }

运行结果:

因为信号量机制的存在,所以代码在handle_data的时候,如果sem_wait(&sem)时,sem为0,那么代码会堵塞在sem_wait上面,从而避免了在stack中访问错误的index而使整个程序崩溃。

Linux运维面试题

北京华宇信息技术有限公司 BEIJING THUNISOFT INFORMATION TECHNOLOGY CORPORATION LIMITE 北京华宇信息技术有限公司 应聘人员笔试题目 (对应聘系统服务工程师人员适用) 姓名: 性别: 年龄: E-Mail: 考试日期: 考试开始时间: 考试结束时间: 须知及要求: 1.本套试题对应聘运维服务部系统服务工程师适用; 2.笔试时间不得超过90分钟; 3.笔试开始前应聘者须如实填写本页中有关应聘者信息; 4.答题请注意字迹清晰,叙述简练明了,绘图力求准确; 5.笔试题共150分,84道题,分为六部分,包括: 1)系统服务工程师调查 2)理论知识部分 3)实践知识基础部分 4)实践知识扩展部分 5)运维管理和信息服务部分 6)综合素质和沟通管理部分 6.应届毕业生以1、2、3、5、6部分为主,其他部分为辅;非应届毕业生以2、3、 4、5、6部分为主,其他部分为辅; 7.请笔试者本着“知之为知之,不知为不知”的态度; 笔试者承诺: 我已经阅读并同意笔试要求,同意如实答题,并同意不将题目内容告知他人。 签名:

CORPORATION LIMITE 应聘登记表 填表要求:应聘登记表是公司了解应聘人员情况的重要途径之一,所以请应聘人员根据自己的实际情况尽可能的填写详细,填写结束后,请务必阅读声明并签字确认。谢谢您的合作! 填写说明:家庭背景情况请至少填写2位直系亲属的基本情况 填写说明:教育经历请按照时间顺序由近至远填写(最低学历填写到高中即可)

CORPORATION LIMITE 填写说明:工作经历请按照时间顺序由近至远来填写 请您在以下招聘途径中勾“√”:我是通过以下招聘途径了解此次招聘信息的:□公司主页招聘信息□现场招聘会□熟人介绍 □网上招聘(请具体描述网站名称,例如:前程无忧等__________________)声明: 本人保证以上表内所填内容的真实性,自愿承担因隐瞒事实而造成的一切后果。 签名:日期:

linux笔记

1.ls:查看当前路径下的文件以及文件夹的名字 2.ls /bin:查看根目录下的bin文件夹的东西 3.cd Desktop进入到Desktop文件夹 4.cd ..跳转到当前路径的上一层 5.pwd:显示当前操作的路径(绝对路径) 6.clear:清屏 7.绝对路径:/home/python 8.相对路径:cd downloads 9..表示当前路径 10...表示上一层路径 11.c d -:跳转到上一层所在的路径 12.t ab自动补全 13.t ouch 1.txt 创建文件 14.l s * 表示显示所有文件 15.l s *.txt 表示显示以所有.txt结尾的文件 16.l s*.t[xn]t 表示显示以txt或者tnt结尾的所有文件 17.m ore 查看文件的内容 18.l s–alh | more 查看文件的内容并以管道符号进行连接 19.c d ~切换到当前用户的主目录 20.m kdir 创建文件夹 21.m kdira/b/c –p 连续创建文件夹 22.t ree 以目录数的方式显示

23.r mdir 删除文件夹(必须是空目录) 24.实物图操作的文件不会被删除直接进回收站 25.用命令删除的文件是不会进入回收站的 26.r m 删除文件/文件夹 27.r m haha.txt –r 直接删除文件夹(-r表示递归的删除) 28.r m haha.txt –i 给将删除的文件一个删除提示 29.r m haha.txt –f 强制删除 30.l inux建立链接影响(相当于创建windows下的快捷方式) 31.l n 01.txt 创建快捷方式 32.g edit 01.txt 编辑文件的内容 33.c at 01.txt 查看所编辑的内容 34.c at 01.txt > 02.txt 合并文件 35.g rep–n ‘a’grep.txt 搜素文件当中带a的文件 36.g rep–i ‘a’grep.txt搜素文件当中带a的文件(忽略大小写) 37.–-help 查找帮助文档 38.f ind 查找文件 39.c p a b 将a文件下的内容整体复制到b文件夹下(无效的文 件无法复制) 40.c p a/* b 将a文件夹下的所有内容复制到b文件夹下 41.m v a b 将a文件夹整体移动到b文件夹下 42.–v 显示移动进度 43.–I 表示操作的时候显示的提示(y表示确定)

什么是嵌入式linux系统

什么是嵌入式linux系统? 一、什么是嵌入式linux? Linux从1991年问世到现在,短短的十几年时间已经发展成为功能强大、设计完善的操作系统之一,不仅可以与各种传统的商业操作系统分庭抗争,在新兴的嵌入式操作系统领域内也获得了飞速发展。嵌入式Linux(Embedded Linux)是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几K或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。嵌入式Linux既继承了intelnet上无限的开放原代码资源,又具有嵌入式操作系统的特性。 二、嵌入式Linux的特点版权费:免费; 购买费用:媒介成本; 技术支持:全世界的自由软件开发者提供支持; 网络特性:免费而且性能优异; 软件移植:容易,代码开放,有许多应用软件支持; 应用产品开发周期:短,新产品上市迅速,因为有许多公开的代码可以参考和移植; 实时性能:RT_Linux,hardhat Linux 等嵌入式Linux支持实时性能; 稳定性:好; 安全性:好。 三、嵌入式Linux的市场前景和商业机会 嵌入式Linux有巨大的市场前景和商业机会,出现了大量的专业公司和产品,如Montavista、Lineo、Emi等。有行业协会,如Embedded Linux Consortum等。得到世界著名计算机公司和oem板级厂商的支持,例如IBM、Motorola、Intel等。传统的嵌入式系统厂商也采用了Linux策略如Lynxworks 、Windriver、QNX等。还有intelnet上的大量嵌入式Linux 爱好者的支持。嵌入式Linux支持几乎所有的嵌入式cpu和被移植到几乎所有的嵌入式oem板。 四、嵌入式Linux的应用领域嵌入式Linux的应用领域非常广泛,主要的应用领域有,信息家电:PDA,STB-Set-stopbox,Digital Telephone,Answering Machine,Screen Phone、数据网络:Ethernet switches,Router,Bridge,Hub,Remote access servers,ATM,Frame relay、远程通信、医疗电子、交通运输、计算机外设、工业控制、航空领域等。 五、嵌入式linux的优势嵌入式Linux的开发和研究是操作系统领域中的一个热点,目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux。Linux之所以能在嵌入式系统市场上取得如此辉煌的成果,与其

上海Linux运维工程师面试题个人总结)

这下面的是一个企业发的面试题 1你常上的相关技术站有哪些? 2简述你所理解运维工程师的主要职责? 3你管理过的服务器数量级? 1台 2台 2-5台 5-10 台 10台以上 4描述一次你印象深刻的服务器运维经历。 5有一台服务器出现安全问题,你会采取什么样的方法处理?说出你的诊断处理思路。 6有多台服务器需部署相同应用文件,文件会持续更新,你用什么方式实现不同服务器间的文件同步。 7某一台服务器部署多个Web站点,其中有一个w3wp的CPU占用达到100%如何找出有问 题的Web站点? 8你眼中的沪江是怎样的?谈谈你对沪江的理解。 9是否有以下相关经验?如有请简要说明掌握情况。 a、S quid相关经验 b、N ginx、Lighttpd 等 c、Memcached d、负载均衡 e、分布式文件处理 f、Email Server 上午-10点雷傲普文化传播有限公司 1. DNS使用的端口号和协议,简单描述一下DNS正向解析和反向解析的工作原理和作用还 有应用场景? 2. 编写IPTABLES使用内网某台机器的80端口可以在公网访问,假设公网IP为10.10.1.1 , 实现192.168.1.0/32 段的NAT. 3. 举出三个以上的主流WEB服务器,并简述他们的特性和优缺点不限操作系统? Apache 源代码开放可以欲行在unix , windowns , linux 平台上,可移植性,而且模块很是丰富缺点:性能,速度上不及其他轻量级的web服务器,但是也是重量级产品,所消耗的内存,cpu也比其他的要高

Ngi nx 源代码开放发高性能的http和反向代理服务器,在高并发的情况下,ngi nx 是apache不错的替代品,他能够支持高达50000个并发连接响应,内存,cpu等系统资 apache稳定,支持动态页面源消耗也是很低的。缺点,支持模块比较少吧,相对没有不是很 强。 Tomcat对高并发跟静态页面处理还不是很强 Microsoft IIS 配置很简单,只能运行在windows。Linux上,如果要使用还购买商业 win dows server 操作系统。 4, 举出两个主流代理服务器,简述工作模式和优缺点? 5, 举出两个负载均衡的软件,并简述工作模式和优缺点? 6,IE,FF,chrome游览器最大并发请求数是多少?, 7,简单举例一下linux和windows系统今年都有哪些漏洞? 8, mysql数据库备份都有哪一些,部署一个高可用mysql应用环境,并说明他的高可用性? 9, 什么是裸设备,他的好处是什么?,mysql支持裸设备吗?10, 如果给你一个100g的INNODB类型数据库,你会用什么备份方案来做备份。 11,写一个简单的shell脚本,脚本运行时让CTRL+(无法中断的该shell脚本? 12、如何快速编译单一的内核模块? 13、如何动态增加apache和PHP模块? 14、说出linux开机流程? 15、具体说说cacti的安装过程? 16、cacti 与nagios 的区别?cacti 如何监控mysql ? 17、mysql主从复制如何实现? 18、raid 0 与raid 的区别? 19、DNS解析详细过程?从主机访问域名(三家公司都问这个问题)让写出来? 20、脚本会多少?掌握程度?sed awk区别? 人事问题(下面的都是每一个企业问的最多的问题,这些问题是我自己经历的,都是我自己的回答,仅供参考,每个人经历不一样,回答的时候一定要和写在网上的还有自己写的简历保持一致,他们好多都是把你投的简历下载下来,然后看着下载下来的简历问你问题)1. 先问问你写的工作经历,在以前公司主要做什么,是什么公司,多少人,主要负责什么, 还有你写的项目经验,项目具体怎么实施的,(一定要明白原理性的东西,把他说出来就可以) 2. 问完工作经历后,问你为什么辞职?。 我说因为以前的公司的工作接触到了linux。被linux的开源所吸引,对linux的开源产 生了兴趣,但是靠自己去学有点吃力,就辞去工作在郑州找了一家培训机构培训RHCE 3. 问为什么不在本地工作,来上海有什么规划? 4. 谈谈你对运维工程师的理解

一篇非常好的linux学习笔记分享(Linux入门绝佳)

作者:佚名字体:[增加减小] 来源:互联网时间:03-06 21:54:44我要评论 一篇非常好的linux学习笔记分享,对于常用命令整理的比较详细,推荐使用。 linux目录架构 / 根目录 /bin 常用的命令binary file 的目錄 /boot 存放系统启动时必须读取的档案,包括核心(kernel) 在内 /boot/grub/menu.lst GRUB设置 /boot/vmlinuz 内核 /boot/initrd 核心解壓縮所需RAM Disk /dev 系统周边设备 /etc 系统相关设定文件 /etc/DIR_COLORS 设定颜色 /etc/HOSTNAME 设定用户的节点名 /etc/NETWORKING 只有YES标明网络存在 /etc/host.conf 文件说明用户的系统如何查询节点名 /etc/hosts 设定用户自已的IP与名字的对应表 /etc/hosts.allow 设置允许使用inetd的机器使用 /etc/hosts.deny 设置不允许使用inetd的机器使用 /etc/hosts.equiv 设置远端机不用密码 /etc/inetd.conf 设定系统网络守护进程inetd的配置 /etc/gateways 设定路由器 /etc/protocols 设定系统支持的协议 /etc/named.boot 设定本机为名字服务器的配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP /etc/resolv.conf 设置DNS /etc/X11 X Window的配置文件,xorg.conf 或XF86Config 這兩個X Server 的設定檔/etc/fstab 记录开机要mount的文件系统 /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel /etc/issue 记录用户登录前显示的信息 /etc/group 设定用户的组名与相关信息 /etc/passwd 帐号信息 /etc/shadow 密码信息 /etc/sudoers 可以sudo命令的配置文件 /etc/securetty 设定哪些终端可以让root登录 /etc/login.defs 所有用户登录时的缺省配置

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.360docs.net/doc/3b12578555.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

ubuntu学习linux笔记

使用Xshell连接Ubuntu Xshell是一个安全终端模拟软件,可以进行远程登录。我使用XShell的主要目的是在Windows环境下登录Linux终端进行编码,非常方便。本文简单介绍下它的使用方法。 1.下载后在安装时选择个人/学校免费版即可。 2.安装完毕后先在要连接的Ubuntu主机下开启SSH服务,如果没有开启需要安装openssh-server: sudo apt-get install openssh-server 使用ps -e | grep ssh,如果只有ssh-agent表示还没启动,需要/etc/init.d/ssh start;有sshd说明已启动。 3.打开Xshell,选择“新建”,“连接”设置里选择SSH,主机填入需要连接的主机的IP 地址。 在“用户身份验证”中填入可用的登录Ubuntu的用户名和密码。 设置完这两步就可以使用XShell控制Ubuntu主机了。 4.中文乱码的解决方法: 在确认Ubuntu支持中文的前提下(即,直接使用Ubuntu可以显示中文),在“文件”菜单的“属性”中选择“终端”,“编码”选择“UTF-8”,并勾选“韩中日语言中的不确定字符处理为宽字符”,重新连接即可。还有一种解决方式,不过本人没有试过 (https://www.360docs.net/doc/3b12578555.html,/s/blog_65d642220100kjqi.html): [root@localhost ~]# cd /etc/sysconfig/ [root@localhost sysconfig]# cp i18n i18n.bak #备份i18n文件 [root@localhost sysconfig]# echo "" >i18n [root@localhost sysconfig]# vi i18n #加入以下内容 LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="lat0-sun16" 重新连接后中文显示正常 Linux 防火墙关闭启用 1) 重启后生效 开启:chkconfig iptables on 关闭:chkconfig iptables off

2013年最新Linux系统运维面试题(附答案)

一、有文件file1 1、查询file1 里面空行的所在行号 awk ?{if($0~/^$/)print NR}‘ file or grep -n ^$ file |awk ?BEGIN{FS=‖:‖}{print $1}‘ 2、查询file1 以abc 结尾的行 grep abc$ file1 3、打印出file1 文件第1 到第3 行 sed -n ‘1,3p‘ file1 head -3 file1 二、如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1 Iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.2.1:8080 三、crontab 在11 月份内,每天的早上6 点到12 点中,每隔2 小时执行一次/usr/bin/httpd.sh 怎么实现 0 6-12/2 * 11 * /usr/bin/httpd.sh 四、编写个shell 脚本将/usr/local/test 目录下大于100K 的文件转移到/tmp 目录下 #!/bin/bash for file in `ls /root` do if [ -f $file ]; then if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then mv $file /tmp/ fi fi done 五、简述raid0 raid1 raid5 三种工作模式的工作原理及特点。 RAID 0:连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID 结构。RAID 0 只是单纯地提高 性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0 不能应用于数据安全性要求高的场合。 RAID 1:它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1 可以提高读取性能。RAID 1 是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时, 系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。简单来说就是:镜象结构,类似于备份模式,一个数据被复制到两块硬盘上。 RAID10:高可靠性与高效磁盘结构 一个带区结构加一个镜象结构,因为两种结构各有优缺点,因此可以相互补充。 主要用于容量不大,但要求速度和差错控制的数据库中。 RAID5:分布式奇偶校验的独立磁盘结构,它的奇偶校验码存在于所有磁盘上,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。支持一块盘掉线后仍然正常

linux基本命令学习笔记

一、常用系统工作命令 1.echo 用于在终端输出字符串或者变量提取后的值 2.date 用于显示系统的时间或者日期 date "+%Y-%m-%d %H:%M:%S" 指定格式查看当前系统时间 date -s "20180901 8:53:00" 设置系统当前时间 date "+%j" 3.reboot 4.poweroff 5.wget(暂时了解即可) 6.ps 查看系统中的进程状态ps aux -a 显示所有进程 -u 用户以及其他详细信息 -x 显示没有控制终端的进程 //linux系统中有长短格式之分长长不能合并,长短不能合并,短短可以合并; 合并后保留一个- 号、ps命令允许参数不加减号(-),因此直接写成ps aux ·五种常见进程状态: R (运行)S(中断)D(不可中断)Z(僵死)T(停止) 7.top 动态的监视进程活动与系统负载等信息“Linux中的强化班的Windows任务管理器” 8.pidof 用于查询某个指定服务进程的PID值,格式为“pidof[参数][服务名称]” 9.kill 终止某个指定的PID的服务进程。 10.killall 用于终止某个指定名称的服务所对应的全部进程、killall[参数][进程名称] 如果我们在系统终端中执行一个命令后想立即停止它,可同时按下Ctrl+C组合键,这样将立即终止该命令的进程。或者有些命令在执行时不断的在屏幕上输出信息,影响后续命令的输入,则可以在执行命令时在末尾加上一个&符号,这样命令将进入系统后台来执行。 二、系统状态检测命令 1.ifconfig 查看本机当前网卡配置与网络状态的信息 主要查看网卡名称inet参数后面的ip地址ether参数后面的网卡物理地址(MAC 地址)以及RX TX的接受数据包和发送数据包的个数及累计流量 2.uname 用于查看系统内核与系统版本等信息 uname -a 若要查看当前系统版本的详细信息,则需要查看redhat-release文件 cat /etc/redhat-release 3.uptime 用于查系统的负载信息 显示当前系统时间系统已运行时间启用终端数量以及平均负载值 平均负载值:系统在最近一分钟五分钟十五分钟内的压力情况 4.free用于显示当前系统的内存使用量信息free -h 5.who 用于查看当前登入主机的用户终端信息 https://www.360docs.net/doc/3b12578555.html,st 用于查看所有系统的登录记录。(日志文件形式保存在系统中,因此黑客很容易对其进行篡改,不要用该命令的输出信息判断系统有无被恶意入侵) 7.history 显示历史执行过的命令(1000条)如果不够,可自定义/etc/profile文件中的HISTSIZE变量值。使用-c参数会清除所有命令历史记录。还可以使用“!编码数字”的方式重复执行某一次命令。

linux运维面试题中级

linux面试题 1.解释top命令和vmstat命令 top 动态 vmstat静态 2.请写出iptables语句iptables [-t 表名] -命令 -匹配 -j 动作/目标 1)本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1 iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -dport 80 -j DNAT -to 192.168.2.1:8080 2)允许本机对外连接80端口(本机能连外界服务器为80) iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT 3)开放本机的3306端口 iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 4)禁止外界ping本服务器 iptables -A INPUT -p icmp -j DROP 5)防止SYN攻击(轻量级预防) iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT 3.mysql高可用方案有哪些?mysql备份方案有哪些?有什么优缺点? 4.写出apache 2.x的两种工作模式,以及各自的工作原理。如何查看apache当前支持的模块。并查看在哪种模式下工作。prefork和worker #apachectl -l 5.linux基础问题 1)linux怎么查看用户登陆日志 who /var/log/wtmp cat /var/log/secure

运维工程师笔试题及答案

运维工程师笔试题及答案 第一部分:Linux系统知识 填空题: 1.创建目录用mkdir命令,创建文件用touch命令。 2.移动文件用mv命令,复制文件用cp命令。 3.使用history命令查看用过的命令列表。 4.查看各类环境变量用env命令。 5.终止进程用kill命令。 6.编写的Shell程序运行前赋予该脚本文件读和执行权限。 7.链接分为:硬链接和软链接/符号链接。 8.在Linux系统中,以文件方式访问设备。 9.当前用户主目录用~/表示。 10.L inux下命令可使用的通配符有“?”和“*”。 选择题: 1.某文件的组外成员的权限是只读、属主是全部权限、组内权限是可读可写、该文件权限为?(D) A.467 B.674 C.476 D.764 2.Linux配置文件一般放在什么目录?(A) A.etc

B.bin C.lib D.dev 3.什么命令常用于检测网络主机是否可达?(C) A.ssh C.ping D.exit 4.对所有用户的变量设置,应当放在哪个文件下?(B) A./etc/bashrc B./etc/profile C.~/.bash_profile D./etc/skel/.bashrc 5.什么命令解压缩tar文件?(B) A.tar-czvf filename.tgz B.tar-xzvf filename.tgz C.tar-tzvf filename.tgz D.tar-dzvf filename.tgz 第二部分:数据库 填空题: 1.数据库系统的核心是___数据库管理系统___。 2.事务四大特性分别是原子性、隔离性、一致性、持久性。 3.索引字段值不唯一,应该使用的索引类型为普通索引。

Linux读书笔记

Linux读书笔记 Linux读书笔记 /.bashrc 就可以看到文件的内容 二进制文件: linux中的可执行文件就是这种格式的,命令cat就是一个二进制文件 数据格式文件: 这些程序在运行过程中,会读取某些特格式的文件,那些特定格式的文件可以称数据文件。如linux在用户登录时,都会将登录数据记录在/var/log/wtmp文件内,该文件是一个数据文件,它能通过 last 命令读出来。但使用cat 时,会读出乱码,因为它属于一种特殊格式的文件。 2.目录: 就是目录,第一个属性为,例如。 3.连接文件: 类似windows下面的快捷方式。第一个属性为,例如 4.设备与设备文件: 与系统外设及存储相关的一些文件,通常都集中在/dev目录下。该文件又分为两种: 块设备文件: 就是存储数据以供系统访问的接口设备,简单而言就是硬盘。例如一号硬盘的代码是/dev/hdal等文件,第一个属性为。 字符设备文件:

即串行端口的接口设备,例如键盘、鼠标等。第一个属性为。 5.套接字: 这类文件通常用在网络数据连接。第一个属性为 6.管道: FIFO也是一种特殊的文件类型,其主要目的是,解决多个程序同时访问一个文件所造成的错误,第一个属性为。 二、文件扩展名 *.sh:批处理文件,因为批处理文件使用shell写成,所以扩展名就是.sh。 *.z *.tar *.tar.gz *.zip *.tgz : 经过打包的压缩文件。 *.html *.php: 网页相关文件,分别表示HTML语法与PHP语法的网页文件。 三、如果当前在\home目录下,如果想进入/var/log目录时,怎么写呢? 1.cd /var/log 一定由根目录/写起 2.cd ../var/log回为在\home中,要回到上一层之后,才能继续向/var移动,不是由/写起,例如由/usr/share/doc到 /usr/share/man,可以写成 cd ../man ,相对路径是指相对于当前工作目录的路径。 四、常用的命令 ls:例文件 mv rm 删除文件

(完整版)美团Linux运维工程师面试真题答案.doc

美团对 Linux运维工程师招聘岗位的面试题与答案分析 1、 LINUX 系统软件安装和卸载的常见方法 答:有3种方式安装与卸载软件包: rpm 包卸载: rpm -e XXX.rpm (如果想忽略依赖,可加上–nodeps) yum remove xxx.rpm这种方法非常不建议使用,卸载过程会将待卸载的软件包所依赖的软件包一并卸载掉,很容 易造成系统缺少某些包而崩溃等问题 源码包卸载: cd 命令进入编译后的软件目录,即安装时的目录,执行 make uninstall 命令即可;或者直接删除安装目录 2、 Windows 和 LINUX 常用的远程连接工具有那些 答: 命令远程连接工具:图形远程连接工具:自带的远程桌面( Xshell、 SecureCRT、Putty 、 SSH Secure Shell Client等 xmanager(需安装配置服务并打开 177 端口)、VNC-Viewer(linux 需安装 vncserver)、windows linux 需安装 xrdp 和 vnc) 3、如何修改LINUX 的 IP 地址、网关和主机名: 答: A、修改 IP 地址、网关:编辑/etc/sysconfig/network -scripts/ifcfg -eth0 ,修改里面IPADDR和 GATEWAY内容,没有这两行,则添加即可,添加时确保BOOTPROTO=static,静态地址,如IPADDR=192.168.1.100GATEWAY=192.168.1.1 B、修改主机名称:编辑/etc/sysconfig/network,修改里面的HOSTNAME 内容,如设置主机名称为mysql,则:HOSTNAME=mysql即可; 4、编写脚本实现以下功能 每天早上 5 点开始做备份 要备份的是 /var/mylog里所有文件和目录可以压缩进行备份 备份可以保存到别一台器上192、168、 1、 2 FTP帐号aaa 密码bbb 要示每天的备份文件要带有当天的日期标记 答:脚本内容如下: [root@haojiu ~]#cat /root/mylogbak.sh #!/bin/bash #scripts for dirbakup and upload to ftp server. #author by haojiu #create by bakdir=mylog date=`date +%F` cd /var tar zcf ${bakdir}_${date}.tar.gz ${bakdir} sleep 1 ftp -n <<- EOF open 192.168.142.129#远程 ftp 服务器 IP user aaa bbb put mylog_*.tar.gz bye EOF

老男孩linux笔记[整理版]

老男孩linux笔记[整理版] 老男孩linux笔记 设定目标、寻找方法、勤奋努力、坚持不懈 学习运维六重 1、重目标:设定具体的短期目标,今天要完成哪些内容,本周要完成的内容,具体到每天的学习规划 2、重思路:工作中结果重要,学习时过程重要,要思考,多问个为什么。 3、重方法: (1)通过具体的时间案例来学习记忆,远胜过直接记枯燥的理论。 (2)通过画逻辑图帮助记忆枯燥的难以记忆的理论知识(如管道的概念) (3)睡觉前回顾当天的学习内容,早晨醒来后计划今天的学习内容 4、重实践:自己提出问题,自己通过实践验证,自己得出结论 (1)问:centos5.9执行yum upgrade会不会升级到6.0以上。答:实践一下便知。 (2)linux运维应用性偏多,要多实践:命令、服务、架构。 5、重习惯 (1)操作文件之前要备份,并确认备份成功正确,“备份名字.源文件名.操作用户.日期“ #cp /etc/hosts /etc/hosts.bldon.20140528 复制文件 #diff /etc/hosts /etc/hosts.bldon.20140528 比较两个文件的不同 #vimdiff /etc/hosts /etc/host,bldon.20140528 对照比较文件的不同 (2)操作后要检查,并确认操作的正确,不能想当然的认为是正确的。 (3)无故不要在“root”下操作命令,少用rm –ft,,mv移动到临时目录,可以用find替换(定时任务)。

(4)命令行操作命令后,确认是否生效达到预期。 (5)启动服务前检查语法, 启动服务后立刻检查启动结果 6、重总结 人类的历史如果没有前人的总结(数学、计算机、历史、地理),给自己总结, 让书本变薄。 系统中常用的安装包,每个安装包可能包含若干个组件,F2可查看包含的组件: base editors development librarys development tool x software development system tools #yum grouplist 查看已安装和未安装的组件#yum groupinstall “develop tools” 装完系统后独立安装安装包 #yum install 软件名称安装单个软件 #rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY* #rpm upgrade 配置yum源 查看包组的用途 # setup 调出配置界面 #ifconfig 查看网络配置 #/etc/init.d/network restart 重启网卡配置,输入命令可以用Tab键补全#cat /etc/redhat release 查看系统版本 #uname –r 查看内核 #uname –m 查看32 or 64位系统 #uname –a 查看内核完整信息 Alt+F2 切换终端 常用软件:

linux运维笔试题

linux运维笔试题 [键入文档标题] Linux 参加面试人 : 面试时间: 北京京泰昊驰网络科技有限公司 | Linux系统运维面试题 一、填空题 1、CD-ROM标准的文件系统类型是 ________ 2、在Linux系统中,测试DNS服务器是否能够正确解析域名的的客户端命令,使用命令 ________ 3、将/home/ixdba目录做归档压缩,压缩后生成ixdba.tar.bz2文件,并将此文件保存到/home目录下, 实现此任务的tar命令格式________ 4、在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为______ 5、Vim编辑器基本上可以分为3种模式,分别为________ 、________插入模式_____和_________ 6、ping命令用于测试网络的连通性,ping命令通过________协议来实现。 7、dns(域名系统)实际上是分布在internet上的主机信息的数据库,其作用是实现_______和________ 之间的转换。 二、判断题 1、,分区越大约好,因为/越大,Linux启动速度越快。( ) 2、在进行网络配置时,netstat命令用于测试网络中主机之间是否连通 ( )

3、可以在/etc/fstab中的文件系统在系统启动的时候自动加载 ( ) 4、通过ping命令就可以知道此IP是否处于激活状态( ) 5、 dns是专为基于tcp/ip的网络提供主机名到ip地址翻译的专用域名解析 系统。( ) 6、在shell命令行方式下,一行只能写一个指令,每次只能使用一个命令( ) 7、邮件系统由三部分组成:用户代理、传输代理、和投递代理。其中传输代 理功能是将邮件放入用户 的邮箱。( ) 8、在linux系统上做备份时,有两种备份形式:系统备份和用户备份。其中 用户备份的目的是尽量在 系统崩溃后能快速、简单、完全地恢复系统的运行。( ) 9、当需要中断一个进程时,可以使用键( ) 三、选择题 1、一个文件名字为rr.gz,可以用来解压缩的命令是 A.tar B.gzip https://www.360docs.net/doc/3b12578555.html,press D.uncompress 2、查看以太网mac地址的命令为: A.ping B.ifconfig C.arp D.traceroute 3、在vi编辑器中的命令模式下,键入可在光标当前所在行下添加一新行。 A. B. C. D.a 4、你使用命令“vi /etc/inittab”查看该文件的内容,你不小心改动了一些 内容,为了防止系统出问题, 你不想保存所修改内容,你应该如何操作 A.在末行模式下,键入:wq B.在末行模式下,键入:q! C.在末行模式下,键入:x! D.在编辑模式下,键入“ESC”键直接退出vi

嵌入式Linux课程学习心得

第一篇、嵌入式系统学习心得 嵌入式Linux课程学习心得 篇一嵌入式心得体会 这学 期才接触嵌入式系统感觉还称不上入门,我通过学习知道了嵌入式的发展前景很大,各个领 域都用到了嵌入式,学好嵌入式不愁没饭吃。 广义上讲,凡是带 有微处理器的专用软硬件系统都是嵌入式系统。如各类单片机和dsp系统。从狭义上讲,那 些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的

专用软硬件系统称为嵌入式系统。嵌入式系统由嵌入式硬件与嵌入式软件组成; 嵌入式硬件 以芯片、模板、组件、控制器形式埋藏于设备内部。 理解“嵌入”的概 念主要从三个方面上来理解。 1、从硬件上,将基 于cpu的处围器件,整合到cpu芯片内部,比如早期基于x86体系结构下的计算机,cpu只 是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部 的16c550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到cpu内部,还 有pc机有显卡,而多数嵌入式处理器都带有lcd控制器,但其种意义上就

相当于显卡。比较 高端的arm类intel xscale架构下的ixp网络处理器cpu内部集成pci控制器(可配成支持 4个pci从设备或配成自身为cpi从设备);还集成3个npe网络处理器引擎,其中两个对应 于两个mac地址,可用于网关交换用,而另外一个npe网络处理器引擎支持dsl,只要外面 再加个phy芯片即可以实现dsl上网功能。ixp系列最高主频可以达到8g,支持2g内存, 1g×10或10g×1的以太网口或febre channel的光通道。ixp系列应该是目标基于arm体系 统结构下由intel进行整合后成xscale内核的最高的处理器了。 2、从软件上前,就 是在定制操作系统内核里将应用一并选入,编译后将内核下载到rom中。而

运维面试题(含答案)

运维工程师面试题 姓名: 答题时间: 1.新安装MYSQL后怎样提升MYSQL的安全级别? A.修改mysql默认端口 B.linux下可以通过iptables来限制访问mysql端口的IP地址 C.对所有用户设置较复杂密码并严格指定对应账号的访问IP(可在mysql库中user表中指定用户的访问可访问IP地址) D.root特权账号的处理(建议给root账号设置强密码,并指定只允许本地登录) E.开启二进制查询日志和慢查询日志 F.mysql安装目录及数据存储目录权限控制:给mysql安装目录读取权限,给mysql日志和数据所在目录读取和写入权限 G.删除无用mysql账号和删除无用的数据库(安装好的mysql默认会有个test库,可将其删除) 2.MYSQL的主从原理,怎么配置文件? 整体上来说,复制有3个步骤: A.master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); B.slave将master的binary log events拷贝到它的中继日志(relay log); C.slave重做中继日志中的事件,将改变反映它自己的数据。 3.mysql主从复制的优点 <1> 如果主服务器出现问题,可以快速切换到从服务器提供的服务; <2> 可以在从服务器上执行查询操作,降低主服务器的访问压力; <3> 可以在从服务器上执行备份,以避免备份期间影响主服务器的服务。 4.Mysql复制的基本原理过程 (1)Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; (2)Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master端binary log文件的名称以及在Binary log中的位置; (3)Slave的IO线程收到信息后,将接收到的日志内容依次写入到Slave端的RelayLog 文件(mysql-relay-lin.xxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我” (4)Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在Master端真实执行时候的那些可执行的查询或操作语句,并在自身执行那些查询或操作语句,这样,实际上就是在master端和Slave端执行了同样的查询或操作语句,所以两端的数据是完全一样的。

linux简单操作笔记

1.创建一个目录文件/data。 解答: 方法一: [root@localhost ~]# cd / #切换到根 [root@localhost /]# mkdir data #在根目录下创建data目录 方法二:使用绝对路径 [root@localhost ~]# mkdir /data 方法三:使用;分号连接多个命令,顺次执行 [root@localhost ~]# cd /;mkdir data 递归创建目录 mkdir –p /tmp/new/ldh #在tmp目录下创建目录new,在new目录下创建ldh 目录 ll /tmp/new #查看ldh目录的属性 2.在/data下面创建一个名叫shizhi.txt的文件。 解答: [root@localhost ~]# touch /data/shizhi.txt touch:创建空文件如果文件已经存在更新时间戳 touch后所跟文件名,可使用绝对路径或相对路径 [root@localhost ~]# cd /data ; touch shizhi.txt 3.为shizhi.txt文件增加内容为“I am studying linux.”。 解答: 方法一: [root@localhost ~]# vim /data/shizhi.txt 按i、a或o进入插入模式, 输入文字I am studying linux. 按Esc键退出插入模式,输入:wq,保存并退出。 [root@localhost ~]# cat /data/shizhi.txt I am studying linux. 方法二:使用Here Document功能 [root@localhost ~]# cat >>/data/shizhi.txt< I am studying linux too. #键盘输入 > EOF#键盘输入 [root@localhost ~]# cat /data/shizhi.txt I am studying linux.

相关文档
最新文档