操作系统导论读书笔记——虚拟化CPU之进程、线程、协程概念原理

本文深入探讨了操作系统中的进程、线程和协程概念,详细阐述了进程管理,包括进程创建、状态、控制块和API,特别讨论了fork、vfork和exec系统调用。同时,介绍了线程的创建、标识和终止,强调了Linux中线程的实现机制和API。
摘要由CSDN通过智能技术生成

1.进程、线程、协程

进程就是处于执行期的程序,但进程并不仅仅局限于一段可执行代码。通常进程还包括其他资源(地址空间(代码段,数据段),打开的文件等)。

线程是在进程中活动的对象,内核的调度对象。每一个线程都有一个独立的程序计数器、进程栈和一组进程寄存器。

协程(一种轻量级用户态线程),仅在用户态空间运行。线程的调度是由操作系统负责,协程的调度由开发者决定。
在这里插入图片描述

2.进程管理

为了抽象出进程,操作系统会提供以下的操作:创建、销毁、等待、状态、其他控制(比如暂停运行)。

2.1进程创建

程序最初是以可执行文件的形式存储在磁盘上的,运行程序第一件事就是从磁盘加载可执行文件到内存中。然后给程序的堆和栈空间分配内存。接着执行一些其他初始化任务(比如打开3个文件描述符:标准输入、标准输出、错误)。最后:启动程序,调转到mian函数,OS将CPU控制权交给新创建的进程,从而程序开始执行。

2.2进程状态

进程可以处于以下3种状态:
运行:占有CPU,正在执行指令;
就绪:准备执行,由于某些原因,在等待CPU资源,具备直接执行的条件;
阻塞:正在等待某些条件,不具备直接执行的条件;
进程状态转换示意图

2.3进程控制块

储存关于进程信息的个体结构称为进程控制块(Process Control Block,PCB)。在linux内核中定义为task_struct。包含进程状态、打开的文件、进程的地址空间、挂起的信号、寄存器上下文等内容;

2.4进程API

2.4.1进程标识PID

每一个进程都有一个非负整型表示的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证器唯一性。

pid_t getpid(void);

2.4.2创建进程fork与exec

通过fork系统调用创建进程,exec执行新程序,还可以通过wait等待创建的子进程执行完成。

pid_t fork(void);
pid_t vfork(void);
fork()与vfork()系统调用

子进程返回0,父进程返回值大于0;

fork()与 写实拷贝

传统的fork系统调用直接把所有资源复制给新创建的进程,这种方式简单但很低效。如果一个新进程打算立即执行一个镜像,那么所有的拷贝都将前功尽弃。
linux的fork使用写时拷贝页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。资源的复制只有在需要写入的时候进行,在此之前,只是以只读方式共享。读共享写隔离;这个优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)。子进程和符进程同时执行,不保证顺序。

vfork()
除了不拷贝父进程的页表项外,vfork系统调用和fork功能相同。子进程作为
父进程的一个单独线程在它的空间运行,父进程此时阻塞,直到子进程执行exec或exit退出。读写共享。

区别

  1. fork对于数据段读共享写隔离(写时复制);vfork读写共享数据段。
  2. fork父子进程同时执行,不保证执行顺序;vfork父进程阻塞,等待子进程退出或执行exec(执行新程序)。
exec()

exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。具体如下:

execl(const char* filepath,const char* arg1,char*arg2.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值