理解Linux操作系统——Process和Memory

学习自《Linux性能分析》

Linux 进程管理


Process:an instance of execution that runs on a processor.

Linux操作系统通过进程描述符task_struct结构体管理进程。

process task_struct


Read more...

2015-04-20

Storm 基础知识

官方手册:Storm Manual

Storm Cluster 集群


节点:快速失败、无状态

  • master node: Nimbus,负责分发代码到集群中,为机器分配工作,监控异常。
  • worker node: Supervisor,监听Nimbus为其分配工作,运行工作进程。
  • Nimbus和Supervisor之间的交互通过Zookeeper集群协调,它们的状态都保存在Zookeeper或者本地磁盘上。

storm cluster


Read more...

2015-04-19

Keepalived避免无用的failover

通常情况下,当主挂掉时,从会自动切换为主。当主上的服务恢复时,则会再次抢占成为主,这里就发生了一次不必要的failover。

为了解决上述情况,可以在主的配置中vrrp_instance增加nopreempt。

实验


注意:确保实验机器防火墙不会过滤掉vrrp协议的数据包。


Read more...

2015-04-19

APUE学习笔记六——守护进程

守护进程没有控制终端,所以说它们是在后台运行的,其终端名设置为问号。

大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。

用户层守护进程的父进程是init进程。

编程规则


  1. 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0);
  2. 调用fork,然后使父进程exit。这样做实现了以下几点。第一,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。第二,虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。这是下面将要进行的setsid调用的先决条件。
  3. 调用setsid创建一个新会话。发生:a、成为新会话的首进程b、成为一个新进程组的组长进程c、没有控制终端。
  4. 将当前工作目录更改为根目录或某个合适的位置。
  5. 关闭不需要的文件描述符。
  6. 某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样,任何一个试图读标准输入、写标准输出或标准错误输出的操作都不会产生任何效果。

Read more...

2014-09-04 Linux系统编程

APUE学习笔记五——线程

概念


每个线程都包含有表示执行环境所必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都时共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。

线程的标识和创建


  • pthread_equal():比较两个线程ID;
  • pthread_self():获得自身的线程ID;
  • pthread_create():创建线程,新线程继承调用线程的浮点环境和信号屏蔽字,但是该线程的挂起信号集(尚未递送的信号)会被清除。

线程的终止


  1. 线程可以简单地从启动例程中返回,返回值是线程的退出码;
  2. 线程可以被同一进程中的其他线程取消;
  3. 线程调用pthread_exit。

pthread_jon将阻塞等待指定线程终止。

线程可以通过调用pthread_cancel函数请求取消同一进程中的其他线程。

在默认情况下,线程的终止状态会保存直到对该线程调用pthread_join。如果线程已经被分离,线程的底层存储资源可以在线程终止时立即被收回。调用pthread_detach分离线程。


Read more...

2014-08-30 Linux系统编程

APUE学习笔记四——信号

信号的处理


  1. 忽略此信号。有两种信号不能忽略,它们是SIGKILL和SIGSTOP,原因是:它们向内核和超级用户提供了使进程终止或停止的可靠方法。
  2. 捕捉信号。不能捕捉SIGKILL和SIGSTOP信号。
  3. 执行系统默认动作。

exec函数会将原先设置为要捕捉的信号都更改为默认动作,其他信号的状态则不变,因为信号捕捉函数的地址很可能在所执行的新程序文件中已毫无意义。

函数


  • signal()函数的限制:不改变信号的处理方式就不能确定信号的处理方式。
  • sigaction()函数可以检查或修改一个信号的处理方式,而无需改变它。
  • kill()函数将信号发送给进程或进程组。
  • raise()函数则允许进程向自身发送信号。
  • laarm()函数可以设置一个定时器,在将来的某个时刻该定时器会超时,并产生SIGALRM信号。
  • pause()函数使调用进程挂起直至捕捉到一个信号。

Read more...

2014-08-26 Linux系统编程

APUE学习笔记三——进程

main函数


当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。

进程终止


正常终止: 1. 从main返回; 1. 调用exit; 1. 调用_exit或_Exit; 1. 最后一个线程从其启动例程返回; 1. 从最后一个线程调用pthread_exit。 异常终止: 1. 调用abort; 1. 接到一个信号; 1. 最后一个线程对取消请求做出响应。

退出函数


  • _exit()、_Exit()立即进入内核,exit()则先执行一些清理处理,然后返回内核。
  • 终止处理程序,通过atexit()登记,exit()自动调用,调用顺序与登记顺序相反,同一函数如若登记多次,也会被调用多次。

exit


Read more...

2014-08-23 Linux系统编程