Linux 进程和线程 理解

  Linux 进程和线程

2011-10-16 8:43:00

了解Linux的进程与线程

 

    * 进程状态

 

TASK_RUNNING                   //运行

TASK_INTERRUPTIBLE                 //进程可接收OS信号。

TASK_UNINTERRUPTIBLE                   //此时进程不接收OS信号。

TASK_ZOMBIE                    //进程结束,资源释放,进程描述符还未释放。

TASK_STOPPED                   //进程停止运行

 

    * Kernel space and user space

 

Kernel space                            是供内核,设备驱动运行的内存区域。

user space                              是供普通应用程序运行的区域。

 

pmap -x <pid>                           查看进程的内存占用信息;

lsof -a -p <pid>                          查看进程打开的文件信息。

ps -Lf <pid>                             查看进程的线程数。

 

    * 进程创建

 

fork进程创建。创建后子进程和父进程指向同一内存区域,仅当子进程有write发生时候,才会把改动的区域copy到子进程新的地址空间。

 

    * Linux的线程实现

 

Linux线程是通过进程来实现。Linux kernel为进程创建提供一个clone()系统调用,clone的参数包括如 CLONE_VM, CLONE_FILES, CLONE_SIGHAND 等。通过clone()的参数,新创建的进程,也称为LWP(Lightweight process)与父进程共享内存空间,文件句柄,信号处理等,从而达到创建线程相同的目的。

 

Linux 2.6的线程库叫NPTL(Native POSIX Thread Library)。POSIX thread(pthread)是一个编程规范,通过此规范开发的多线程程序具有良好的跨平台特性。尽管是基于进程的实现,但新版的NPTL创建线程的效率非常高。在Linux 2.6之前,Linux kernel并没有真正的thread支持,一些thread library都是在clone()基础上的一些基于user space的封装,因此通常在信号处理、进程调度(每个进程需要一个额外的调度线程)及多线程之间同步共享资源等方面存在一定问题。NPTL的实现是在kernel增加了futex(fast userspace mutex)支持用于处理线程之间的sleep与wake。futex是一种高效的对共享资源互斥访问的算法。kernel在里面起仲裁作用,但通常都由进程自行完成。

 

NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单。而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体。(N<M),优点是线程切换快,但实现稍复杂。

    * 信号

进程接收信号有两种:同步和异步。同步信号比如SEGILL(非法访问), SIGSEGV(segmentation fault)等。发生此类信号之后,系统会立即转到内核陷阱处理程序

,因此同步信号也称为陷阱。异步信号如kill, lwp_kill, sigsend等调用产生的都是,异步信号也称为中断。

 

kill <pid> 调用的是 SIGTERM, 此信号可以被捕获和忽略。

kill -9 <pid> 调用的是 SIGKILL, 杀掉进程,不能被捕获和忽略。

SIGHUP是在终端被断开时候调用,如果信号没有被处理,进程会终止。这就是为什么突然断网刚通过远程终端启动的进程都终止的原因。防止的方法是在启动的命令前加上 nohup 命令来忽略 SIGHUP信号。如 nohup ./startup.sh &很多应用程序通常捕获SIGHUP用来实现一些自定义特性,比如通过控制台传递信号让正在运行的程序重新加载配置文件,避免重启带来的停止服务的副作用。可惜的是,在JAVA中没法直接使用这一功能,SUN JVM没有官方的signal支持,尽管它已经可以实现,详情可参看Singals and Java.

 

2、linux下查看进程和线程的命令

2.1 ps aux |less //显示当前里程快照 a表所有,u表用户,less表示分屏显示

2.2 ps aux | grep pid //列出某进程的详细信息

2.3 ps -m //查看系统中所有的线程

2.4 top -hknUMP //动态显示系统中的进程 h表帮助,k表杀死,n表进程数 U表按用户,M表按内存,P表按CPU

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaohua0877/article/details/6877283
想对作者说点什么? 我来说一句

linux unix下多线程进程

2011年04月08日 87KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭