- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux系统分析之进程线程
1. 什么是进程 进程是处于执行期的程序以及它所包含的所有资源的总称,包括虚拟处理器,虚 拟空间,寄存器,堆栈,全局数据段等。 在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块 (ProcessControlBlock,简称PCB)。PCB中包含了很多重要的信息,供系统 调度和进程本身执行使用。所有进程的PCB都存放在内核空间中。PCB中最重要 的信息就 是进程PID,内核通过这个PID来唯一标识一个进程。PID可以循环使 用,最大值是32768。init进程的pid为1,其他进程都是init进程的 后代。 除了进程控制块(PCB)以外,每个进程都有独立的内核堆栈(8k),一个进程 描述符结构,这些数据都作为进程的控制信息储存在内核空间中;而进程的用户 空间主要存储代码和数据。 2) 进程的创建 进程是通过调用::fork(),::vfork()和::clone()系统调用创建新进程。在内核 中,它们都是调用do_fork实现的。传统 的fork函数直接把父进程的所有资源 复制给子进程。而Linux的::fork()使用写时拷贝页实现,也就是说,父进程和 子进程共享同一个资源拷贝, 只有当数据发生改变时,数据才会发生复制。通 常的情况,子进程创建后会立即调用exec(),这样就避免复制父进程的全部资 源。 三者的区别如下: ::fork():父进程的所有数据结构都会复制一份给子进程(写时拷贝页)。 ::vfork():只复制task_struct和内核堆栈,所以生成的只是父进程的一个线 程(无独立的用户空间)。 ::clone():功能强大,带了许多参数。::clone()可以让你有选择性的继承父进 程的资源,既可以选择像::vfork()一样和父进 程共享一个虚拟空间,从而使创 造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进 程不再是父子关系,而是兄弟关系。 3. 进程的撤销 进程通过调用exit()退出执行,这个函数会终结进程并释放所有的资源。父进 程可以通过wait4()查询子进程是否终结。进程退出执行后处于僵 死状态,直 到它的父进程调用wait()或者waitpid()为止。父进程退出时,内核会指定线程 组的其他进程或者init进程作为其子进程的新父进 程。当进程接收到一个不能 处理或忽视的信号时,或当在内核态产生一个不可恢复的CPU异常而内核此时正 代表该进程在运行,内核可以强迫进程终止。 4. 进程管理 内核把进程信息存放在叫做任务队列(task list)的双向循环链表中(内核空 间)。链表中的每一项都是类型为task_struct,称为进程描述符结构(process descriptor),包含了一个具体进程的所有信息,包括打开的文件,进程的地址 空间,挂起的信号,进程的状态等。 Linux通过slab分配器分配task_struct,这样能达到对象复用和缓存着色(通 过预先分配和重复使用task_struct,可以避免动态分配和释放所带来的资源消 耗)。 内核把所有处于TASK_RUNNING状态的进程组织成一个可运行双向循环队列。调 度函数通过扫描整个可运行队列,取得最值得执行的进程投入执行。避免扫描所 有进程,提高调度效率。 5. 进程的内核堆栈 Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数 据结构:thread_info和进程的内核堆栈。 进程处于内核态时使用不同于用户态堆栈,内核控制路径所用的堆栈很少,因此 对栈和描述符来说,8KB足够了。 什么是线程 Linux线程是一类特殊的进程,拥有各自的task_struct,内核并没有特别的调 度算法和数据结构来表征线程,而仅仅是作为一个普通的进程,只是和其他进程 共享进程空间。也就是说,如果程序运行于多线程环境,编写程序时必须检查一 下项目: • 是否使用了不可重入的系统函数,例如字符串分割函数::strtok(); • 是否已经对全局变量或静态变量进行了加锁; • 第三方库是否支持多线程。 注:想要从核心获取线程id,应当使用current-pid。在核心里pid对进程而 言是进程号,对于线程是线程号。同一进程的不同线程 的pid是不同的,但同 一进程的不同线程有统一的tgid,所以像getpid(),kill()等这种系统调用返 回的都是tgid的值。 线程的调度 如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能 把CPU运行时间划分成若干个时间片,再将时间片分配给各个线程执行,在一个 时间片
文档评论(0)