xv6源码分析 011

xv6源码分析 011

今天我们结束proc.hproc.c这一块。


wakeup(void *chan)

这个函数用于唤醒所有在这个channel结构上睡眠的进程,类似于我们c++中的notify_all()

void
wakeup(void *chan)
{struct proc *p;for(p = proc; p < &proc[NPROC]; p++) {acquire(&p->lock);if(p->state == SLEEPING && p->chan == chan) {p->state = RUNNABLE;}release(&p->lock);}
}

wakeup1(struct proc *p)

唤醒指定的进程

static void
wakeup1(struct proc *p)
{if(!holding(&p->lock))panic("wakeup1");if(p->chan == p && p->state == SLEEPING) {p->state = RUNNABLE;}
}

为什么要先检查进程的进程锁是否已经被获取呢?我们上一集看过sleep的代码,在sleep中,进程首先获取进程锁,为了防止唤醒信号的丢失;然后释放 chan 对应的锁,并在这个chan上睡眠;这里检查进程锁是否被获取,看起来有点多余哈哈哈,而且是因为如果没有检测结果为false的化就会panic,这个在正常的系统中肯定是不被允许的。


kill(int pid)

我们看看注释:

受害者(victim,指被杀死的进程)并不会马上退出知道它尝试从内核态返回在用户态。

也就是说,进程不会在用户空间中接收到kill信号。也可以这样理解,kill的作用具有延迟性,在进程由于中断或者系统调用陷入内核时,kill才起作用。

int
kill(int pid)
{struct proc *p;for(p = proc; p < &proc[NPROC]; p++){acquire(&p->lock);if(p->pid == pid){p->killed = 1;if(p->state == SLEEPING){// Wake process from sleep().p->state = RUNNABLE;}release(&p->lock);return 0;}release(&p->lock);}return -1;
}

然后是两个copy函数,比较简单

int
either_copyout(int user_dst, uint64 dst, void *src, uint64 len)
{struct proc *p = myproc();if(user_dst){return copyout(p->pagetable, dst, src, len);} else {memmove((char *)dst, src, len);return 0;}
}int
either_copyin(void *dst, int user_src, uint64 src, uint64 len)
{struct proc *p = myproc();if(user_src){return copyin(p->pagetable, dst, src, len);} else {memmove(dst, (char*)src, len);return 0;}
}

最后提供了一个进程监控函数,看名字就知道了

procdump(void)

void
procdump(void)
{static char *states[] = {[UNUSED]    "unused",[SLEEPING]  "sleep ",[RUNNABLE]  "runble",[RUNNING]   "run   ",[ZOMBIE]    "zombie"};struct proc *p;char *state;printf("\n");for(p = proc; p < &proc[NPROC]; p++){if(p->state == UNUSED)continue;if(p->state >= 0 && p->state < NELEM(states) && states[p->state])state = states[p->state];elsestate = "???";printf("%d %s %s", p->pid, state, p->name);printf("\n");}
}

OK,proc.c和proc.h的讲解到此结束啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟LinkedList实现的链表(无哨兵)

1.前言 我们将LinkdList视作链表, 底层设计了内部类Node类, 我这里依然没有用到泛型, 其实加上泛型依然很简单, 即将Node节点的数据域的类型由Int转换为E(<E>), 我在此不做赘述.同时实现了增删查改, 遍历等操作. 2.链表(无哨兵)的代码实现 public class LinkListTest …

基于Promise + XHR 封装myAxios函数

在JavaScript中&#xff0c;你可以使用Promise和XMLHttpRequest&#xff08;XHR&#xff09;来封装一个名为myAxios的函数&#xff0c;用于执行HTTP请求。下面是一个简单的示例&#xff0c;它封装了GET和POST请求的基本功能&#xff1a; function myAxios(url, method GET, da…

matlab回归学习

前言 所谓回归学习即预测&#xff0c;便是由已知的数据推测未知的数据&#xff0c;利用转速与转矩来推测电流。 1、数据准备 下面虚拟一组转速转矩以及电流数据。 speed [100 220 330 440 550 660]; torque [200 300 400 500 700 900]; I [400 500 603 739 821 912]; arr …

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

文章目录 前言&#xff1a;1、ARP协议详解2、ARP工作机制 二、ARP_RX模块设计三、ARP_TX模块设计四、ARP_table模块5、仿真5.1、发送端5.2、接收端5.3、缓存表 总结 前言&#xff1a; 1、ARP协议详解 ARP数据格式&#xff1a; 硬件类型:表示硬件地址的类型。它的值为1表示以太…

ocr文字识别软件是干什么的?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识别软件是一种能够将图像或者扫描的文档中的文字内容转换为可编辑的文本格式的软件。它的主要功能包括&#xff1a; 1. **文字提取&#xff1a;**识别图像中的文字并提取出来&#xff0…

Android Radio实战——获取音频补丁(二十)

音频补丁是一种音频处理技术,主要通过在音频信号中加入特定的噪声或信号,来掩盖或弥补原始音频中的缺陷或不足。这种技术广泛应用于音频制作、音乐处理、语音识别等领域,旨在提高音频的质量和听感。 一、获取流程 在 Radio 开发中获取音频补丁的操作通常在 openSession 之…

spring的扩展接口

spring的扩展接口 spring提供了一些扩展接口来对spring进行定制化功能&#xff0c;可以选择如下一些扩展点&#xff1a; BeanFactoryPostProcessor beanFactory后置处理器&#xff0c;存在于容器启动阶段&#xff0c;支持在bean factory标准初始化完成后&#xff0c;对bean fac…

VMware虚拟机ens33没有IP的解决办法

1.关闭NetworkManager服务 2.systemctl stop NetworkManager 3.systemctl restart network.service 4.service network restart [rootlocalhost network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 …

MAVEN的安装与配置

MAVEN的安装与配置 1 简介 1.1 什么是MAVEN? Maven是一个项目构建及管理工具&#xff0c;开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c; Maven 使用了一个标准的目录结构在不同开发工具中也能实现项目结构的统一。Maven提供了清理&#xff0c;编…

Lambda表达式特点

Lambda 表达式是 Java 8 引入的一项重要特性&#xff0c;它们提供了一种更简洁的方式来表达匿名函数。Lambda 表达式允许你将一段代码传递给方法&#xff0c;而不是显式创建一个实现了接口的匿名内部类。Lambda 表达式通常用于实现单个抽象方法的接口&#xff08;即函数式接口&…

C# 预处理器指令详解与示例

前言 在软件开发中&#xff0c;我们常常需要编写可移植和可配置的代码。C# 预处理器指令为我们提供了这样的能力&#xff0c;它允许我们在编译代码之前进行条件编译和文本替换。在本篇文章中&#xff0c;我们将详细介绍C#预处理器指令的定义、语法格式、功能以及在实际编程中的…

javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…

超级好看动态视频官网源码

源码介绍 超级好看动态视频引导页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 超级好看动态…

Android IPC | Android多进程模式

前 言 关于Android的进程间通信&#xff08;即IPC&#xff09;有很多种方式&#xff0c;比如我们常用的AIDL、Socket等&#xff0c;而其中最重要而且最需要掌握的就是AIDL的使用和原理&#xff0c;简单来说它是通过Binder实现的。 关于Binder的知识点非常多&#xff0c;当我们…

三角函数与其他复杂函数在C语言中的实现:CORDIC算法、泰勒公式、查表法与math库详解

在C语言中实现三角函数&#xff0c;通常有四种主要方法&#xff1a;CORDIC算法、泰勒公式展开、查表法以及直接调用C语言的标准数学库。接下来我们将详细介绍这四种方法&#xff0c;并探讨其他可能的补充实现手段。 1. CORDIC算法 CORDIC&#xff08;Coordinate Rotation Dig…

MySQL数据库触发器

用途&#xff1a;订单表table01&#xff0c;运单表table02。 首先有订单表有记录/但是刚开始只有订单号/没有运单号&#xff1b; INSERT INTO testdb.table01 (id, orderid, transportid) VALUES(4, order04, ); 然后运单表有记录/记录有运单号。 INSERT INTO testdb.table…

【2024中高级向】22道前端面试题附答案

以下是问题总览&#xff1a;不会的点击右侧目录对应的问题即可跳转到答案 webpack 中 chunkHash 与 contentHash 区别&#xff1b;写过 webpack 的 loader 和 plugin 么&#xff1b;webpack 处理 image 是用哪个 loader&#xff0c;限制成 image 大小的是哪个&#xff1f;webp…

你如何看待AIGC技术?

你如何看待AIGC技术&#xff1f; AIGC技术&#xff08;Artificial Intelligence Generated Content&#xff09;是指由人工智能生成的内容。它在许多领域都有应用&#xff0c;包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力&#xff0c;但也需要注…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…