linux小知识记录

原创 2013年12月03日 17:27:30

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

 

程序员知识点及工具汇总

技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,...
  • wave_1102
  • wave_1102
  • 2015年08月14日 23:17
  • 1724

linux设备驱动第一篇:基础知识点

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐...
  • lihui130135
  • lihui130135
  • 2015年03月29日 14:08
  • 884

Linux shell 知识记录

shell 命令编辑 常用命令 cat 文件名 输出文件内容到基本输出(屏幕 or 加>fileName 到另一个文件) cb 格式化源代码 chmod //change mode,改变文件的...
  • robomaster
  • robomaster
  • 2016年04月22日 17:07
  • 152

linux相关的知识记录

1、linux线程,有joinable和detachable两种,默认构造的时候就是第一种的。达到        如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都...
  • lizhangping
  • lizhangping
  • 2017年01月11日 20:39
  • 117

Linux的基本知识(1)

1、各寄存器的简介AX:累加器 BX:基址寄存器(存放存储器地址) CX:计数器 DX:数据寄存器(存放数据) SI:源变址寄存器(常保存存储单元地址) DI:目的变址寄存器(常保存存...
  • caoyahong114
  • caoyahong114
  • 2016年06月03日 11:18
  • 815

linux磁盘分区知识

摘抄自鸟哥的linux私房菜基础学习篇第三版 磁盘分区 学习的重点是为了要安装Linux,那Linux系统是安装在计算机组件的那个部分呢?就是磁盘啦!所以我们当然要来认识一下磁盘先。 我们知道一块磁...
  • jinyujianjie
  • jinyujianjie
  • 2013年11月24日 13:28
  • 769

Linux基础知识全面总结

学习Linux系统的重要性应该不用多说,下面我就对Linux的基础知识进行一个全面而又简单的总结。不过建议大家还是装个Linux系统多练习,平时最好只在Linux环境下编程,这样会大有提高。     ...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月09日 09:49
  • 8577

linux开机启动记录

Linux的开机启动配置随linux的版本不同,有一些不同之处。 网上说的那些配置文件如 inittab,rc.local,rc.d并不是都有的,这对初学者造成了困惑。 有没有什么是比较通用的方式呢,...
  • aazhoukeaa
  • aazhoukeaa
  • 2016年08月03日 13:51
  • 680

Linux驱动开发之 三 (那些必须要了解的硬件知识 之 存储器篇)

Linux驱动开发之 三 (那些必须要了解的硬件知识 之 存储器篇)本文重点学习存储器相关的基本知识,网络上对RAM,ROM,FLASH等有非常详细的介绍,老谢将这些知识点摘抄整理并加以注释如下。这个...
  • itxiebo
  • itxiebo
  • 2016年05月02日 13:40
  • 3047

linux记录系统中常用重要的log记录和用户的所有操作精确命令记录

常见的几个登录文件有: /var/log/secure:记录登入系统存取数据的文件,例如 pop3, ssh, telnet, ftp 等都会被记录; /var/log/wtmp:记录登入者的讯息数据...
  • langb2014
  • langb2014
  • 2015年08月22日 17:29
  • 20495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux小知识记录
举报原因:
原因补充:

(最多只允许输入30个字)