Linux

linux 之信号signal处理机制

最近同事的程序设计过程中用到了Linux的signal机制,从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。

个进程都会采用一个进程控制块对其进行描述,进程控制块中设计了一个signal的位图信息,其中的每位与具体的signal相对应,这与中断机制是保持一致的。当系统中一个进程A通过signal系统调用向进程B发送signal时,设置进程B的对应signal位图,类似于触发了signal对应中断。发送signal只是“中断”触发的一个过程,具体执行会在两个阶段发生:

1、  system call返回。进程B由于调用了system call后,从内核返回用户态时需要检查他拥有的signal位图信息表,此时是一个执行点。

2、  中断返回。进程被系统中断打断之后,系统将CPU交给进程时,需要检查即将执行进程所拥有的signal位图信息表,此时也是一个执行点。

 

综上所述,signal的执行点可以理解成从内核态返回用户态时,在返回时,如果发现待执行进程存在被触发的signal,那么在离开内核态之后(也就是将CPU切换到用户模式),执行用户进程为该signal绑定的signal处理函数,从这一点上看,signal处理函数是在用户进程上下文中执行的。当执行完signal处理函数之后,再返回到用户进程被中断或者system call(软中断或者指令陷阱)打断的地方。

 

Signal机制实现的比较灵活,用户进程由于中断或者system call陷入内核之后,将断点信息都保存到了堆栈中,在内核返回用户态时,如果存在被触发的signal,那么直接将待执行的signal处理函数push到堆栈中,在CPU切换到用户模式之后,直接pop堆栈就可以执行signal处理函数并且返回到用户进程了。Signal处理函数应用了进程上下文,并且应用实际的中断模拟了进程的软中断过程。

 

最近写程序,各种bug各种错,有一回程序莫名退出,没报错,也没产生日志和core文件,貌似正常退出一样。

但又不是在程序全部走完后退出,中途莫名退出,这就叫我想到了signal,应该是某些函数错误后发送kill信号给主进程,然后退出。

现在总结下signal各种类型:

Signal
Description
SIGABRT
由调用abort函数产生,进程非正常退出
SIGALRM
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS
某种特定的硬件异常,通常由内存访问引起
SIGCANCEL
由Solaris Thread Library内部使用,通常不会使用
SIGCHLD
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT
当被stop的进程恢复运行的时候,自动发送
SIGEMT
和实现相关的硬件异常
SIGFPE

Win7 + Ubuntu 18.04 LTS (Bionic Beaver)双系统安装方法

这里介绍在win7的基础上,安装ubuntu 18.04 LTS,实现双系统启动。

首先,假设你已安装了windows 7系统。

一. 制作ubuntu U盘启动盘。

方法见http://blog.p2hp.com/archives/4123

ubuntu 安装文件下载地址 http://releases.ubuntu.com/bionic/ubuntu-18.04-desktop-amd64.iso

二. 把U盘插入电脑,重启电脑。(记得进入BIOS设置,把U盘选为第一启动设备)。…

Linux内核参数调整方法

Linux内核参数调整方法

ulimit设置

ulimit -n 要调整为100000甚至更大。 命令行下执行 ulimit -n 100000即可修改。如果不能修改,需要设置 /etc/security/limits.conf,加入

* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard 

一个小技巧提速你的UBUNTU

我们知道,Windows下有一个叫做虚拟内存的文件,用以弥补物理内存之不足。Linux下则是一个swap分区,叫做交换分区,其功能相当于Windows下的虚拟内存,但是效率更高。

显然,虚拟内存是从硬盘上划分一部分空间作为内存,其速度必然比物理内存慢。或许很多朋友都认为Linux系统一定是优先使用物理内存,物理内存不够时,再启用swap。实则不然,尽管物理内存仍然充裕,Linux也不时地使用虚拟内存。这个设计对于服务器而言是非常有用的,但对于Linux桌面用户而言,却使得物理内存未被充分利用,是导致系统速度变慢的原因之一。…

多快好省:10个技巧加速你的LinuxMint/Ubuntu

之前写过一篇关于使用Prelink加速LinuxMint/Ubuntu软件启动速度的文章–《未雨绸缪:如何加快Linux软件启动速度》

近日,在国外Linuxer的博客上看到一篇关于加速LinuxMint/Ubuntu的文章,觉得挺有帮助的,特加以整理,并经过实操检验,分享予大家。不过,大家在修改自己的系统配置文件前,最好先做好备份。

1.使用Preload预加载
Prelink类似,Preload是一个运行于后台的监护程序,探测那些常用的软件,并将其放入缓存,以起到加速的作用。在LinuxMint/Ubuntu下安装Preload很简单:
sudo apt-get install preload
Preload默认的配置对于普通用户而言已经不错了,一般不需要修改。如果有进一步掌控其的欲望,可以打开其配置文件进行修改:
sudo gedit /etc/preload.conf

2.清理APT缓存
apt应该算是LinuxMint/Ubuntu系统中使用率最高的命令了,无论安装、卸载软件,还是更新软件源缓存及相关维护,都离不开它。使用逾久,apt缓存也就变得较为臃肿,有必要清理:
sudo apt-get autoclean

3.禁用不必要的启动项
在“启动应用程序”中,根据自身实际,取消不必要的启动项,如欢迎程序、检测新硬件、蓝牙(如果本机没有蓝牙)、桌面共享等。

4.调整交换分区参数
详见《一个小技巧提速你的LinuxMint》

5.禁用休眠/挂起功能(务必慎重)
如果你不需要电脑的休眠/挂起功能,可以手动禁用它(笔记本电脑最好不要禁用休眠/挂起功能)。以管理员身份编辑配置文件:
sudo gedit /etc/initramfs-tools/conf.d/resume
将RESUME=UUID=****这行注释掉(行首加#):

6.修改grub2等待时间
无论你的电脑是否有2个或更多的操作系统,只要安装了LinuxMint/Ubuntu,就必然会安装grub2作为引导管理器。grub2启动时,会在默认的启动项上停留数秒(默认10秒),等待用户选择。我们可以把这个时间改的更短。如果是LinuxMint/Ubuntu单系统,可以直接改为0,即直接进入,无需等待。
以管理员身份编辑grub配置文件,修改GRUB_TIMEOUT项后的数字。
sudo gedit /etc/default/grub

7.使用ZRAM提高内存性能
如果你的电脑内存不太充裕(1G以下),可以使用ZRAM软件来提高内存性能。ZRAM能在系统中创建一个压缩的块设备,用于模拟一个交换分区,减少因内存不足而多硬盘的蹂躏频次。可以使用如下PPA安装ZRAM:

网卡中断设置

密集网络IO的服务器,需要设置网卡中断来解决性能瓶颈。通过使用top观察每个核的si是否很高。如果处理网络中断的CPU达到瓶颈,将会影响网卡收发包,严重的情况下会出现大量丢包。通过下面的脚本,可以将软中断平均到CPU的每个核上,解决网卡中断瓶颈问题。

ffffff 这里是根据CPU核数进行计算的

#!/bin/bash
# Enable RPS (Receive Packet Steering)

rfc=4096
cc=$(grep -c processor /proc/cpuinfo)
rsfe=$(echo $cc*$rfc | bc)
sysctl -w net.core.rps_sock_flow_entries=$rsfe
for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
do
    echo ffffff > $fileRps
done

for fileRfc in 
第 1 页,共 12 页12345...10...最旧 »