进程与线程的区别与联系(基础篇)

如果用一句话来说明它的区别的话,那就是线程是系统执行(调度)的最小单元,进程是系统资源分配的最小单元

进程和线程是怎么来的?

在传统的进程模型中,有两个独立的概念:资源分配执行。所谓的执行的基本单位包括运行状态、优先级、寄存器等,而资源所有包括内存、程序代码、数据、文件等。既然这是两个独立的功能,那么将它们分开岂不是更好!于是就出现上面最先说到的关于线程的概念了。在这种模式下,系统调用的基本单元就是线程了,进程只是负责管理资源,这些资源被同一进程下的线程共享。

这样分开有以下好处:1、创建、终止、切换线程的开销要比进程小的多;2、由于共享地址空间,线程通信比进程通信高效得多。下图是进程和线程分别私有的内容

进程的创建与终止

有以下几种情况会导致进程的创建:1、系统初始化;2、执行了正在运行的进程所调用的进程创建系统调用;3、用户请求创建一个新的进程;4、一个批处理作业的初始化。

在Linux中,我们只能通过fork系统调用来创建新的进程,它会拷贝当前进程创建一个子进程。子进程和父进程的区别仅仅在于PID(每一个进程唯一)、PPID(父进程的进程号,子进程将其设置为被拷贝进程的PID)和某些资源及统计量(例如挂起的信号,它没有必要被继承)。而exec函数负责为被拷贝文件并将其载入地址空间开始运行。在Windows中,有一个CreateProcess的API来创建进程。

多数进程都是在完成其工作之后而终止。Linux中会调用exit,Windows中会调用ExitProcess。

注意,还有一种vfork()系统调用,它与fork()调用功能基本一样,除了不拷贝父进程的页表项。

进程的状态有哪些?

什么是写时拷贝(copy-on-write,COW)?

传统的fork()系统调用直接把所有的资源复制给创建的新进程,这种方式会造成效率的损失,比如拷贝的数据可能不共享。Linux中的fork()使用的是写时拷贝页实现。写时拷贝是一种推迟甚至免除拷贝数据的技术。内核此时并不复制整个个进程地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。

线程是如何实现的?

线程的实现分为用户空间和内核空间,而且它在Linux和Windows中的实现区别是非常大的。下面来一一解答。

在用户空间实现的线程会将整个线程包放在用户空间中,内核对其一无所知。对内核来说,还是按照单线程进程来管理。在用户空间管理线程时,每个进程需要有专门的进程表,用来跟踪该进程中线程,这些进程表记录着各个线程的属性,包括每个线程的程序计数器、堆栈指针、寄存器和状态等。

当在内核中实现线程时,在内核中有用来记录系统中所有线程的线程表,每个进程中没有了线程表。另外,内核中还维护了传统的进程表,以便跟踪进程的状态。由于在内核中创建和撤销线程的代价比较大,某些系统会回收其线程。当某个线程被撤销的时候,就把它标志为不可运行的,但是其内核数据结构没有受到影响。稍后,在必须创建一个新线程的时候,就重新启用某个旧线程,从而节约一些开销。

在Linux中,从内核的角度来说是没有进程这个概念的。Linux将所有的线程当作进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都有唯一隶属于自己的task_struct,所以在内核,它看起来就像是一个普通的进程。

线程是如何运行和调度的呢?

在我们学习汇编的时候,会接触一堆寄存器,线程的运行其实也可以用寄存器来表示,比如以下几个重要的:IP表示下一条要执行的指令相对于当前段的偏移量;CS表示当前代码段的信息;那么CS:IP就表示下一条指令的绝对地址;SS表示堆栈的基地址,通过它可以知道当前调用栈的情况;SP、BP分别表示栈的栈顶和栈基地址(其中BP我们也叫做帧指针),所有的临时变量都分配在栈上,通过它们组合可以访问栈中的数据。通过这些寄存器,我们就知道了整个运行过程及调用到什么了。

而调度就是将某个线程对应的寄存器换成另外一个线程的那套寄存器了。每个线程都对应这样一套寄存器,哪个线程的寄存器在CPU上,哪个线程就在运行,其他的都在等待,直到被调度,因此我们说运行和调度是指线程,进程只是给线程提供场地和资源。

参考资料

《Linux内核设计与实现》

《现代操作系统》

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值