kill -9不管用
Linux环境下很多时候需要杀死一个进程,一般kill -9 pid发送SIGKILL信号给该进程即可,该信号的默认行为就是终止进程,而且不可能捕获这个信号,
但是有些时候这个发了这个命令还是没有杀死进程,到底有哪些情况呢?
Hope I can study from bits to qubits.
Linux环境下很多时候需要杀死一个进程,一般kill -9 pid发送SIGKILL信号给该进程即可,该信号的默认行为就是终止进程,而且不可能捕获这个信号,
但是有些时候这个发了这个命令还是没有杀死进程,到底有哪些情况呢?
调试是编程的必备技能,工作两个月来主要就是学习如何调试内核,定位bug。
内核调试的一种方式是利用printk()函数打印信息来调试,该函数提供了不同的日志级别,定义在linux/kern_levels.h
linux提供syslog方便用户空间查看日志信息,通过klogd和syslogd守护进程工作,相关文件:/proc/kmsg、/var/log/messages,通过/etc/syslog.conf可以指定日志输出文件,通过dmesg命令可以查看相关日志。
文件/proc/kallsyms存放了内核镜像中符号与对应地址的映射关系,和System.map类似,但是/proc/kallsyms是当前正在运行的内核的符号,还包含动态加载的模块的符号,但是要注意编译时开启CONFIG_KALLSYMS、CONFIG_KALLSYMS_ALL选项。
拓展阅读:
Linux是一个可移植性非常好的操作系统。
Linux支持很多体系结构:List of Linux-supported computer architectures
在所有类Unix系统中设备也被当做文件对待,称作设备文件。而且成了几类:块设备、字符设备、网络设备、伪设备等。
页高速缓存为了减少对磁盘的I/O操作,将磁盘数据缓存在物理内存中,提高访问速度。
页高速缓存由内存中的物理页面组成,对应磁盘上的物理块。
Linux采用虚拟化内存技术,系统中所有的进程之间以虚拟方式共享内存。通过虚拟化技术一个进程看起来可以拥有整个物理内存,拥有比物理内存大的地址空间,
进程地址空间指进程可寻址的虚拟内存组成的虚拟地址空间。每个进程都有一个32位或64位的Flat 地址空间,flat指地址空间范围是一个独立连续的空间。
内存地址是一个给定的值,它要在地址空间范围内,一个进程的可寻址空间为4G(32位机器),但是进程只能访问有效的内存区域内的内存地址,一个进程的地址空间被分成了各种内存区域,如代码段、数据段、堆栈段等。
Region-based memory management
系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的硬件设备称为块设备,这些固定大小的数据片就称作块,硬盘是最常见的块设备。
如果一个硬件设备是以字符流(顺序访问)的方式被访问,就归于字符设备;如果一个设备是随机访问的,它就属于块设备。
块设备中最小可寻址单元是扇区,扇区的大小是设备的物理属性。
块是文件系统的一种抽象,物理磁盘寻址按照扇区进行,但内核执行的所有磁盘操作是按照块进行。因为扇区是设备的最小可寻址单元,所以块不能比扇区还小,只能数倍于扇区。内核要求块的大小是2的幂,不能超过一个页的大小。所以通常块大小为512字节、1KB、4KB,即扇区:块=1:N。
扇区称硬扇区或设备块;块有时称文件块或I/O块。
扩展阅读:Device file
虚拟文件系统是Linux内核为支持各种文件系统,在用户进程和文件系统实现之间引入的一个软件抽象层——Virtual File System,仅存在于内存中。
“一切皆文件”是Unix/Linux的设计哲学之一,Linux将普通文件、目录、字符设备、块设备、套接字等都看做文件,主要是他们的操作是一套统一的接口——知乎相关问题:如何理解「In UNIX, everything is a file」?
内核用struct page结构代表系统中的每个物理页:linux/mm_types.h
|
|
内核中大量函数是基于时间驱动的,如定期执行的函数,定时执行的函数。系统定时器是一种可编程硬件芯片,它能以固定频率产生中断——定时中断。
内核必须在硬件帮助下才能计算和管理时间,硬件为内核提供一个系统定时器用来计算流逝的时间,系统定时器以某种频率自行触发时钟中断,该频率可以编程预定,称作节拍率(tick rate),发生时钟中断时内核会调用特殊的中断处理程序。
节拍率可以编程控制,那么两次连续时钟中断的间隔也可以得到,这个间隔称为节拍(tick),等于1/(tick rate)秒。
内核靠这种已知时钟中断间隔计算实际时间和系统运行时间。
Linux内核提供了一组相当完备调度同步方法。
原子操作可以保证指令以原子方式执行——执行过程不被打断。
内核提供了两组原子操作接口:一组针对整数进行操作,一组针对单独的位进行操作。