linux系统分析之进程线程.pdf

linux系统分析之进程线程.pdf

ID:51494916

大小:190.95 KB

页数:6页

时间:2020-03-25

linux系统分析之进程线程.pdf_第1页
linux系统分析之进程线程.pdf_第2页
linux系统分析之进程线程.pdf_第3页
linux系统分析之进程线程.pdf_第4页
linux系统分析之进程线程.pdf_第5页
资源描述:

《linux系统分析之进程线程.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、1.什么是进程进程是处于执行期的程序以及它所包含的所有资源的总称,包括虚拟处理器,虚拟空间,寄存器,堆栈,全局数据段等。在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(ProcessControlBlock,简称PCB)。PCB中包含了很多重要的信息,供系统调度和进程本身执行使用。所有进程的PCB都存放在内核空间中。PCB中最重要的信息就是进程PID,内核通过这个PID来唯一标识一个进程。PID可以循环使用,最大值是32768。init进程的pid为1,其他进程都是init进程的后代。除了进程

2、控制块(PCB)以外,每个进程都有独立的内核堆栈(8k),一个进程描述符结构,这些数据都作为进程的控制信息储存在内核空间中;而进程的用户空间主要存储代码和数据。2)进程的创建进程是通过调用::fork(),::vfork()和::clone()系统调用创建新进程。在内核中,它们都是调用do_fork实现的。传统的fork函数直接把父进程的所有资源复制给子进程。而Linux的::fork()使用写时拷贝页实现,也就是说,父进程和子进程共享同一个资源拷贝,只有当数据发生改变时,数据才会发生复制。通常的情况,子进程创建后会

3、立即调用exec(),这样就避免复制父进程的全部资源。三者的区别如下:::fork():父进程的所有数据结构都会复制一份给子进程(写时拷贝页)。::vfork():只复制task_struct和内核堆栈,所以生成的只是父进程的一个线程(无独立的用户空间)。::clone():功能强大,带了许多参数。::clone()可以让你有选择性的继承父进程的资源,既可以选择像::vfork()一样和父进程共享一个虚拟空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系

4、。3.进程的撤销进程通过调用exit()退出执行,这个函数会终结进程并释放所有的资源。父进程可以通过wait4()查询子进程是否终结。进程退出执行后处于僵死状态,直到它的父进程调用wait()或者waitpid()为止。父进程退出时,内核会指定线程组的其他进程或者init进程作为其子进程的新父进程。当进程接收到一个不能处理或忽视的信号时,或当在内核态产生一个不可恢复的CPU异常而内核此时正代表该进程在运行,内核可以强迫进程终止。4.进程管理内核把进程信息存放在叫做任务队列(tasklist)的双向循环链表中(内核空间

5、)。链表中的每一项都是类型为task_struct,称为进程描述符结构(processdescriptor),包含了一个具体进程的所有信息,包括打开的文件,进程的地址空间,挂起的信号,进程的状态等。Linux通过slab分配器分配task_struct,这样能达到对象复用和缓存着色(通过预先分配和重复使用task_struct,可以避免动态分配和释放所带来的资源消耗)。内核把所有处于TASK_RUNNING状态的进程组织成一个可运行双向循环队列。调度函数通过扫描整个可运行队列,取得最值得执行的进程投入执行。避免扫描所

6、有进程,提高调度效率。5.进程的内核堆栈Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:thread_info和进程的内核堆栈。进程处于内核态时使用不同于用户态堆栈,内核控制路径所用的堆栈很少,因此对栈和描述符来说,8KB足够了。什么是线程Linux线程是一类特殊的进程,拥有各自的task_struct,内核并没有特别的调度算法和数据结构来表征线程,而仅仅是作为一个普通的进程,只是和其他进程共享进程空间。也就是说,如果程序运行于多线程环境,编写程序时必须检查一下项目:•是否使用了不

7、可重入的系统函数,例如字符串分割函数::strtok();•是否已经对全局变量或静态变量进行了加锁;•第三方库是否支持多线程。注:想要从核心获取线程id,应当使用current->pid。在核心里pid对进程而言是进程号,对于线程是线程号。同一进程的不同线程的pid是不同的,但同一进程的不同线程有统一的tgid,所以像getpid(),kill()等这种系统调用返回的都是tgid的值。线程的调度如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间片,再将时间片分配给

8、各个线程执行,在一个时间片的线程代码运行时,其它线程处于挂起状态,这种方式称之为并发(Concurrent)。因为I/O操作速度远远慢于CPU处理速度,键鼠输入、硬盘读写、网络传输等速度远慢于内存读写速度,而内存速度又远慢于CPU缓存速度,所以有效的利用I/O操作间隙时的CPU,成为早期单核并发机制的来由。在并发环境下,CPU以”挂起->执行-

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。