linux小知识记录

来源:互联网 发布:皮肤 微生物 知乎 编辑:程序博客网 时间:2024/05/17 01:12

1、linux的进程和线程

  • 进程创建

    进程创建通常调用fork实现。创建后子进程和父进程指向同一内存区域,仅当子进程有write发生时候,才会把改动的区域copy到子进程新的地址空间,这就是copy-on-write技术,它极大的提高了创建进程的速度。

  • 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创建线程的效率非常高。一些测试显示,基于NPTL的内核创建10万个线程只需要2秒,而没有NPTL支持的内核则需要长达15分钟。

    在Linux 2.6之前,Linux kernel并没有真正的thread支持,一些thread library都是在clone()基础上的一些基于user space的封装,因此通常在信号处理、进程调度(每个进程需要一个额外的调度线程)及多线程之间同步共享资源等方面存在一定问题。为了解决这些问题,当年IBM曾经开发一套NGPT(Next Generation POSIX Threads), 效率比 LinuxThreads有明显改进,但由于NPTL的推出,NGPT也完成了相关的历史使命并停止了开发。

    NPTL的实现是在kernel增加了futex(fast userspace mutex)支持用于处理线程之间的sleep与wake。futex是一种高效的对共享资源互斥访问的算法。kernel在里面起仲裁作用,但通常都由进程自行完成。

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

http://wenku.baidu.com/view/8c6e852ce2bd960590c67781.html 

 

2、僵尸进程

a、产生

在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid 退出状态 运行时间等)。这些保留的信息直到进程通过调用wait/waitpid时才会释放。这样就导致了一个问题,如果没有调用wait/waitpid的话,那么保留的信息就不会释放。比如进程号就会被一直占用了。但系统所能使用的进程号的有限的,如果产生大量的僵尸进程,将导致系统没有可用的进程号而导致系统不能创建进程。所以我们应该避免僵尸进程。(但如果子进程后结束,即父进程先结束了,因为每个进程结束时,系统都会扫描当前系统中运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果有,就由init来接管它,成为它的父进程。

b、避免产生僵尸进程的方法一般有:
1. fork两次,使得孙子进程的父亲为init,孙子进程去执行job;(第一次fork后子进程立即fork,子进程立即exit(被父进程wait),孙子进程执行job)
2. 制定自己的SIGCHLD信号处理函数,在这个信号处理函数中调用wait();
3. 通过sigaction系统调用指定信号SIGCHLD处理动作中的sa_flags为SA_NOCLDWAIT。

http://www.cnblogs.com/itech/archive/2012/09/01/2667212.html 

 

3、守护进程

进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组(会话组长是创建会话的进程)。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 

fork()一次即可,fork()两次更安全,防止重新获得终端(第一次fork,是会话组长不能调用setsid,所以先fork一次;第二次fork后父进程终止,子进程就不是会话组长,也就不可能再获得终端了)。

http://blog.csdn.net/hairetz/article/details/4195036

http://blog.csdn.net/russell_tao/article/details/7090033

 

原创粉丝点击