进程和线程以及相关概念的理解

“进程是资源分配的最小单位,线程是CPU调度的最小单位”这样的回答是教科书上的回答,抽象且不易于真正的理解。
如果你这样去回答,相信你很难在广大人群中脱颖而出,想要让人印象深刻,就一定要有自己的见解,往往面试官想听到的不是网上一搜就能搜到的教科书答案,而是你对一个问题或者概念自己的理解。(莎士比亚有句话说的好,一千个读者眼中就会有一千个哈姆雷特
我认为书上的内容不应该靠死记硬背,背的迟早是会忘的,只有真正的理解,才能被深深的记在心里。

相关概念:分时操作系统、多道程序设计、CPU状态、内存空间、虚拟内存、进程、线程、程序、文件描述符、内存空间、重定向、管道

Linux 系统上所有运行的任务都可以是一个进程,每个用户任务、每个系统管理,都可以称之为进程,Linux 用分时管理的方法使所有的任务共同分享系统资源。

分时操作系统采用 CPU 调度和多道程序设计,为每个用户提供一小部分的分时计算机资源。引入多道程序设计的根本目的是为了提高CPU的利用率,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。。每个用户至少有一个程序在内存中。加载到内存并执行的程序,通常称为进程。当进程执行时,它通常在执行较短的一段时间后,要么完成,要么需要进行 I/O 操作。
对于分时系统,操作系统必须确保合理的响应时间。这有时可以通过交换来得到,交换可将进程从磁盘调入内存,也可将进程从内存调到磁盘。不过,虚拟内存是实现合理响应时间的更为常用的一种方法,虚拟内存允许一个执行作业不必完全在内存中。
分时操作系统典型的例子就是Unix和Linux的操作系统。其可以同时连接多个终端并且每隔一段时间重新扫描进程,重新分配进程的优先级,动态分配系统资源。

进程是资源(CPU、内存等)分配的基本单位,具有独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

CPU的工作状态分为系统态(或称管态)和用户态(或称目态)。引入这两个工作状态的原因是:为了避免用户程序错误地使用特权指令,保护操作系统不被用户程序破坏。具体规定为,当CPU处于用户态时,不允许执行特权指令;当CPU处于系统态时,可执行包括特权指令在内的一切机器指令。

进程:
程序=文件(静态的可执行文件)
进程=执行中的程序=程序+执行状态
进程执行需要的资源:
内存:保存代码和数据
cpu:执行指令

进程分为系统进程和用户进程。

结构上进程的组成部分包括程序、数据、进程控制块。
进程控制块(PCB)为了管理和控制进程,系统在创建每个进程时,都为其开辟一个专用的存储区,用以记录它在系统中的动态特性。系统根据存储区的信息对进程实施控制管理。进程任务完成后,系统收回该存储区,进程随之消亡,这一存储区就是进程控制块。PCB随着进程的创建而建立,撤销而消亡。PCB在不同的语言中,可能用不同的数据结构表示。系统根据PCB感知一个进程的存在,PCB是进程存在的唯一物理标识
PCB内容:
1 进程标识符
进程标识符用于唯一地标识一个进程。
一个进程通常有两种标识符:
内部标识符:在所有的操作系统中,都为每一个进程赋予了一个惟一的数字标识符,它通常是一个进程的序号。设置内部标识符主要是为了方便系统使用。
外部标识符:它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。为了描述进程的家族关系,还应设置父进程标识及子进程标识。此外,还可设置用户标识,以指示拥有该进程的用户。
2 处理机状态
处理机状态信息主要是由处理机的各种寄存器中的内容组成的。
包括:① 通用寄存器;② 指令计数器;③ 程序状态字PSW;④ 用户栈指针。
这些信息显然和进程相关,因此,进程一旦被中断,就必须把这些信息保存在PCB中,以便在恢复运行时能完全恢复中断前的状态。
3 进程调度信息
在PCB中还存放一些与进程调度和进程对换有关的信息。
包括:
① 进程状态;
② 进程优先级;
③ 进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待CPU的时间总和、进程已执行的时间总和等;
④ 事件,指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
4 进程控制信息
进程控制信息包括:
① 程序和数据的地址;
② 进程同步和通信机制,指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分地放在PCB中;
③ 资源清单,即一张列出了除CPU以外的、进程所需的全部资源及已经分配到该进程的资源的清单;
④ 链接指针,它给出了本进程(PCB)所在队列中的下一个进程的PCB的首地址。
PCB组织方式:
1.链接方式:把具有同一状态的PCB,用其中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。就绪队列常按进程优先级的高低排列,把优先级高的进程的PCB排在队列前面。根据阻塞原因的不同把处于阻塞状态的进程的PCB排成等待I/O操作完成的队列和等待分配内存的队列等。
2.索引方式:系统根据所有进程的状态建立几张索引表。例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。

进程地址空间:
4GB的进程地址空间会被分成两个部分:用户空间与内核空间。用户地址空间是从0到3GB(0xc0000000),内核地址空间占据3GB到4GB。用户进程在通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程使用系统调用(代表用户进程在内核态执行)时可以访问到内核空间。每当进程切换时,用户空间就会跟着变化;而内核空间由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。
地址低到高:用户空间(text段,data段,bss段,堆区,共享区,栈区,命令行参数环境变量),内核空间。

进程上下文切换的开销大约在2.5-5.5us,系统调用的开销大约在200-300ns左右。(lmbench测试工具

程序转换为进程过程:
1)内核将程序代码和数据读入内存,为程序分配内存空间。
2)内核为进程分配PCB和其他资源。
3)内核为进程保存PID以及相应的状态信息,把进程放到运行队列中等待执行,程序转化为进程后就可被系统的调度程序调度执行。
内存空间:包括用户空间、内核空间。
用户空间装着用户进程需要使用的资源;内核空间存放内核进程需要加载的系统资源,这一些资源一般是不允许用户访问的。但是注意有的用户进程会共享一些内核空间的资源,比如一些动态链接库等等。

文件描述符
files,它是一个文件指针数组。一般来说,一个进程会从files[0]读取输入,将输出写入files[1],将错误信息写入files[2]
每个进程被创建时,files的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。我们常说的「文件描述符」就是指这个文件指针数组的索引,所以程序的文件描述符默认情况下 0 是输入,1 是输出,2 是错误。
Linux 中一切都被抽象成文件,设备也是文件,可以进行读和写。

重定向:输入重定向就是把files[0]指向一个文件,输出重定向就是把files[1]指向一个文件,错误重定向就是把files[2]指向一个文件。

管道符:把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递

Linux 中一切皆文件」设计思路的高明:不管是设备、另一个进程、socket 套接字还是真正的文件,全部都可以读写,统一装进一个简单的files数组,进程通过简单的文件描述符访问相应资源,具体细节交于操作系统,有效解耦,优美高效。

对于操作系统而言,进程就是一个数据结构。
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

只有 Linux 系统将线程看做共享数据的进程,不对其做特殊看待,其他的很多操作系统是对线程和进程区别对待的,线程有其特有的数据结构,我个人认为不如 Linux 的这种设计简洁,增加了系统的复杂度。


全部评论

相关推荐

投递腾讯云智研发等公司9个岗位
点赞 评论 收藏
转发
点赞 2 评论
分享
牛客网
牛客企业服务