第五十八讲——什么是进程、线程 本文共有18940个字,关键词: 现在的操作系统都是由内核,和运行在内核之上的众多进程来实现。 启动起来的程序其实位于内存当中。简单基于物理内存来管理同时运行多个程序是非常不方便的,任何一个程序的BUG都有可能覆盖其他程序的数据,所以,为了避免这一情况出现,引入了内存地址的概念。内存地址由虚拟内存(线性内存)和物理内存的概念。 进程是逻辑上的概念。 内核在内部维护有一个数据结构(task structure任务结构)。 每一个进程的结构: PPID:副进程号 PID:进程号 NAME:名称 使用了多少内存页 内核会为每个进程保存它的数据结构,这个数据结构中保存了进程的终端信息,内核通过这个数据结构判断下一进程是谁,从哪儿开始(状态信息)。 对计算机来讲,只有CPU和内存。 CPU上一次只能执行一个程序,CPU划分时间片,内存划分为时间片,内存划分为页面,分配给多个程序。 CPU中有缓存、寄存器,会将终端程序的信息载入,当装在过程完成表示线程已经恢复,这是恢复现场的过程,终端断为保留现场。 在80286CPU以后就引入了线性地址空间(虚拟地址),以32位为例(最大支持4G内存空间2^32) CPU将除内核外的内存划分为许许多多的页面,这些页面为固定大小的存储单元,假设为4K。 当一个程序运行需要使用10K的时候,则需要向内核申请10K的内存空间,即三个4K页面(页框),这三个页框在物理上很有可能不是连续的,但是在程序自身看起来寺连续的,并且只有程序本身和内核运行在内存上。内存页面的信息保存在数据结构中,除了内核占用的空间,其余的空间都是这个进程所有,且这些空间都是连续的,但实际上这个程序是按需占用的。 这些页面的数据是存储在物理内存上的,有内核负责管理哪个页面上存了些什么数据,于是为了分清楚这些数据之间的关系,内核需要维护一张表,这个表中定义了每一个页面的数据和存储的具体页框的对应关系。每一个进程的进程地址空间由这样的几段组成: user stack 栈,通常用于存储本地变量(函数中的变量) 栈和共享库的可变空间 共享库,映射的是库页面的数据(对进程占用空间的有两种计算结果,一个是将共享库算进去,一个不。) runtime 堆内存(需要不停的动态申请内存空间),常用于载入文件 uninitialised(拼写可能有误) data(.bss)没能初始化的数据 program text(text)文本段(指令)只读段 forbidden 不允许进程使用,内核的腾挪空间。 VSZ:虚拟内存级,在逻辑上占用的大小(算上共享库的内存占用) RSS:常驻内存级(resident size)位于物理内存且不能被交换出去的。指令、变量等核心数据是不能被交换的。 在多核心的CPU上,我们可以让所有的进程平均分配到每个核心上,以提高工作效率。如果一个复杂的过程能够同时运行在多个核心上,那么执行的效率就会提高很多。 一般而言,一个进程只有一个执行流,从上而下是不动的,一步一步执行。 但是在某些并行编程模型下,可以实现将一个进程内部划分为多个小的执行实体,每个执行实体都有自己的指令加数据,这样就分成多个执行流了。根据功能的不同,这些执行流彼此之间是不能够互相交叉的,是比进程更小的单位,都可以被CPU单独执行,这个小单位我们称之为线程。 线程:thread 线程比进程更加节省空间,有些资源是可以共享的。 一是多进程模型 二是多线程模型:在内部生成线程,单进程多线程模型。 进程的状态: stoped,停止,不在被CPU调度,事假外力才能运行 read,就绪,在等待队列中 executing,正在运行中。 正在运行中需要其它内容转入睡眠状态: sleep:uninterruptible,不可中断的睡眠 sleep:interruptible,可中断的睡眠 为什么会睡眠? 当进程在执行的过程中突然需要打开一个文件,产生一个I/O请求,将硬盘中的数据载入内存,这个过程是需要消耗时间的,而对于CPU来讲就是浪费时间,I/O速度比CPU和内存慢得多,这时候进程会转入睡眠状态,让出CPU的使用权。 uninterrupible:不可中断的睡眠 当一个进程在CPU上运行时,因打开一个文件或者一个I/O操作而进入睡眠,并且在文件没有完全载入内存中时,就算再次唤醒该进程,也不会有执行动作,这类进程我们称为不可中断的睡眠。 interrupible:可中断的睡眠 一个进程执行完命令后,进入睡眠,等待下一次的唤醒,他不是等待外部I/O而睡眠的,这类进程我们称为可中断的睡眠,事实上用户的请求也是I/O,但是在此处不坐严格的区分。 zombie僵尸进程(僵死态) 指正常运行了,并且也结束了,但是其占用的内存空间就是不释放。 一个进程在CPU上运行结束后,内存应当会被释放,内核也会将逾期对应的那张维护的表删除(task structure) 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2017-01-27 评论 1657 次浏览