信号量的实现和应用

一、实验环境

​ 本次实验的操作环境还是一样的实验环境。环境文件如下:

image-20211104204808701

如果不清楚的话请参考往期博客。

二、实验目标与内容

1、目标:

  1. 加深对进程同步与互斥概念的认识;

  2. 掌握信号量的使用,并应用它解决生产者——消费者问题;

  3. 掌握信号量的实现原理。

2、内容:

本次实验的基本内容是:

  1. Ubuntu下编写程序,用信号量解决生产者——消费者问题;
  2. linux-0.11中实现信号量,用生产者—消费者程序检验之。

(1)用信号量解决生产者——消费者问题

Ubuntu上编写应用程序pc.c,解决经典的生产者—消费者问题,完成下面的功能:

  1. 建立一个生产者进程,N个消费者进程(N>1);
  2. 用文件建立一个共享缓冲区;
  3. 生产者进程依次向缓冲区写入整数0,1,2,…,M,M>=500;
  4. 消费者进程从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将本进程ID和数字输出到标准输出;
  5. 缓冲区同时最多只能保存10个数。

一种可能的输出效果是:

10: 0
10: 1
10: 2
10: 3
10: 4
11: 5
11: 6
12: 7
10: 8
12: 9
12: 10
12: 11
12: 12
……
11: 498
11: 499

其中ID的顺序会有较大变化,但冒号后的数字一定是从0开始递增加一的。

(2)实现信号量

Linux0.11版还没有实现信号量,Linus把这件富有挑战的工作留给了你。如果能实现一套山寨版的完全符合POSIX规范的信号量, 无疑是很有成就感的。但时间暂时不允许我们这么做,所以先弄一套缩水版的类POSIX信号量,它的函数原型和标准并不完全相同, 而且只包含如下系统调用:

sem_t *sem_open(const char *name, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_unlink(const char *name);

kernel 目录下新建 sem.c 文件实现如上功能。然后将 pc.cUbuntu 移植到0.11 下,测试自己实现的信号量。

三、实验原理

1、进程同步与互斥

(1)什么是进程同步

在多道批处理系统中,多个进程是可以并发执行的,但由于系统的资源有限,进程的执行不是一贯到底的, 而是走走停停,以不可预知的速度向前推进,这就是进程的**「异步性」**。

那么,「进程的异步性会带来什么问题呢」?举个例子,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。那么写数据应该发生在读数据之前。而实际上,由于异步性的存在,可能会发生先读后写的情况,而此时由于缓冲区还没有被写入数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。

image-20211104211006667

进程同步(synchronization)就是用来解决这个问题的。从上面的例子我们能看出,一个进程的执行可能影响到另一个进程的执行,「所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执行次序、传递信号或消息」

举个生活中的进程同步的例子,你想要喝热水,于是你打了一壶水开始烧,在这壶水烧开之前,你只能一直等着,水烧开之后水壶自然会发生响声提醒你来喝水,于是你就可以喝水了。就是说**「水烧开这个事情必须发生在你喝水之前」**。

注意不要把进程同步和进程调度搞混了:

  • 进程调度是为了最大程度的利用 CPU 资源,选用合适的算法调度就绪队列中的进程。
  • 进程同步是为了协调一些进程以完成某个任务,比如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执行次序使得某个任务能够顺利完成。
(2)什么是进程互斥

同样的,也是因为进程的并发性,并发执行的线程不可避免地需要共享一些系统资源,比如内存、打印机、摄像头等。举个例子:我们去学校打印店打印论文,你按下了 WPS 的 “打印” 选项,于是打印机开始工作。你的论文打印到一半时,另一位同学按下了 Word 的 “打印” 按钮,开始打印他自己的论文。想象一下如果两个进程可以随意的、并发的共享打印机资源,会发生什么情况?

显然,两个进程并发运行,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论文的内容混杂在一起了。

进程互斥(mutual exclusion)就是用来解决这个问题的。当某个进程 A 在访问打印机时,如果另一个进程 B 也想要访问打印机,它就必须等待,直到 A 进程访问结束并释放打印机资源后,B 进程才能去访问。

实际上,像上述的打印机这种**「在一个时间段内只允许一个进程使用的资源」(这也就是互斥的意思),我们将其称为「临界资源」,对临界资源进行访问的那段代码称为「临界区」**。

image-20211104211312345

通俗的对比一下进程互斥和进程同步:

  • 进程同步:进程 A 应在进程 B 之前执行
  • 进程互斥:进程 A 和进程 B 不能在同一时刻执行

从上不难看出,「进程互斥是一种特殊的进程同步」,即逐次使用临界资源,也是对进程使用资源的先后执行次序的一种协调。

2、信号量

信号量,英文为semaphore,最早由荷兰科学家、图灵奖获得者E. W. Dijkstra设计,任何操作系统教科书的“进程同步”部分都会有详细叙述。

Linux的信号量秉承POSIX规范,用man sem_overview可以查看相关信息。本次实验涉及到的信号量系统调用包括:sem_open()sem_wait()sem_post()sem_unlink()

sem_t *sem_open(const char *name, unsigned int value);//创建或打开信号量
int sem_wait(sem_t *sem);//P操作
int sem_post(sem_t *sem);//V操作
int sem_unlink(const char *name);//删除信号量
  • sem_open() 的功能是创建一个信号量,或打开一个已经存在的信号量。

    • sem_t 是信号量类型,根据实现的需要自定义。
    • name 是信号量的名字。不同的进程可以通过提供同样的 name 而共享同一个信号量。如果该信号量不存在,就创建新的名为 name 的信号量;如果存在,就打开已经存在的名为 name 的信号量。
    • value 是信号量的初值,仅当新建信号量时,此参数才有效,其余情况下它被忽略。当成功时,返回值是该信号量的唯一标识(比如,在内核的地址、ID 等),由另两个系统调用使用。如失败,返回值是 NULL
  • sem_wait() 就是信号量的 P 原子操作。如果继续运行的条件不满足,则令调用进程等待在信号量 sem 上。返回 0 表示成功,返回 -1 表示失败。

  • sem_post() 就是信号量的 V 原子操作。如果有等待 sem 的进程,它会唤醒其中的一个。返回 0 表示成功,返回 -1 表示失败。

  • sem_unlink() 的功能是删除名为 name 的信号量。返回 0 表示成功,返回 -1 表示失败。

3、生产者—消费者问题

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

生产者—消费者问题的解法几乎在所有操作系统教科书上都有,其基本结构为:

Producer()
{// 生产一个产品 item;// 空闲缓存资源P(Empty);// 互斥信号量P(Mutex);// 将item放到空闲缓存中;V(Mutex);// 产品资源V(Full);
}Consumer()
{P(Full);P(Mutex);//从缓存区取出一个赋值给item;V(Mutex);// 消费产品item;V(Empty);
}

显然在演示这一过程时需要创建两类进程,一类执行函数 Producer(),另一类执行函数 Consumer()

4、总结

本实验的总体思路就是,分别实现sem_open()、sem_wait()、sem_post()和sem_unlink()系统调用,在pc.c程序中调用4个函数完成PV操作,解决生产者——消费者问题。

四、实验步骤

1、信号量的实现

因为在Linux0.11中没有信号量的定义,所有我们要自己写一个信号量的头文件(也就是库)sem.h,运用数据结构的知识,我们可以写出以下代码:

#ifndef _SEM_H
#define _SEM_H#include <linux/sched.h>#define SEMTABLE_LEN    20
#define SEM_NAME_LEN    20typedef struct semaphore{char name[SEM_NAME_LEN];int value;struct task_struct *queue;
} sem_t;
extern sem_t semtable[SEMTABLE_LEN];#endif

有了信号量的头文件之后,就可以实现信号量的代码。sem.c

#include <linux/sem.h>
#include <linux/sched.h>
#include <unistd.h>
#include <asm/segment.h>
#include <linux/tty.h>
#include <linux/kernel.h>
#include <linux/fdreg.h>
#include <asm/system.h>
#include <asm/io.h>
//#include <string.h>sem_t semtable[SEMTABLE_LEN];
//信号量的个数
int cnt = 0;
//创建一个信号量,或打开一个已经存在的信号量
sem_t *sys_sem_open(const char *name,unsigned int value)
{char kernelname[100]; int isExist = 0;int i=0;//信号量名字字符数int name_cnt=0;//获取信号量名字的字符数while( get_fs_byte(name+name_cnt) != '\0')name_cnt++;//如果字符数大于设定的字符数,返回空if(name_cnt>SEM_NAME_LEN)return NULL;//获得传入的信号量名for(i=0;i<name_cnt;i++)kernelname[i]=get_fs_byte(name+i);int name_len = strlen(kernelname);int sem_name_len =0;sem_t *p=NULL;//如果信号量已存在,找到并打开for(i=0;i<cnt;i++){sem_name_len = strlen(semtable[i].name);if(sem_name_len == name_len){if( !strcmp(kernelname,semtable[i].name) ){isExist = 1;break;}}}if(isExist == 1){p=(sem_t*)(&semtable[i]);//printk("find previous name!\n");}//如果信号量不存在,创建,信号量个数+1else{i=0;for(i=0;i<name_len;i++){semtable[cnt].name[i]=kernelname[i];}semtable[cnt].value = value;p=(sem_t*)(&semtable[cnt]);//printk("creat name!\n");cnt++;}return p;
}/*
cli()函数和sti()函数分别是关中断和开中断操作,保证P操作的原子性
*///P操作
int sys_sem_wait(sem_t *sem)
{cli();//如果信号量的值小于0,则休眠等待while( sem->value <= 0 )       sleep_on(&(sem->queue));    sem->value--;               sti();return 0;
}
//V操作
int sys_sem_post(sem_t *sem)
{cli();sem->value++;if( (sem->value) <= 1)wake_up(&(sem->queue));sti();return 0;
}
//删除信号量
//sys_sem_open代码同理
int sys_sem_unlink(const char *name)
{char kernelname[100];   int isExist = 0;int i=0;int name_cnt=0;while( get_fs_byte(name+name_cnt) != '\0')name_cnt++;if(name_cnt>SEM_NAME_LEN)return NULL;for(i=0;i<name_cnt;i++)kernelname[i]=get_fs_byte(name+i);int name_len = strlen(name);int sem_name_len =0;for(i=0;i<cnt;i++){sem_name_len = strlen(semtable[i].name);if(sem_name_len == name_len){if( !strcmp(kernelname,semtable[i].name)){isExist = 1;break;}}}if(isExist == 1){int tmp=0;for(tmp=i;tmp<=cnt;tmp++){semtable[tmp]=semtable[tmp+1];}cnt = cnt-1;return 0;}elsereturn -1;
}

将写好的sem.c放在linux-0.11/kernel目录下:

image-20211104225344143

将写好的sem.h放在linux-0.11/include/linux目录下:

img

2、 实现信号量的系统调用

结合上一个实验的操作,很容易实现信号量的系统调用

(1)添加系统调用号

修改linux-0.11/include目录下的unistd.h文件,添加对应的系统调用号。

image-20211104232106061

由于是接着上一个实验,所以系统调用号从74开始。

#define __NR_sem_open 74
#define __NR_sem_wait 75
#define __NR_sem_post 76
#define __NR_sem_unlink 77

image-20211104232252144

(2)修改系统调用总数

修改linux-0.11/kernel目录下的system_call.s文件

image-20211104232826222

修改第61行的代码,改为78。(系统调用号从0开始)

image-20211104233726240

(3)在系统调用函数表中添加新的系统调用函数

修改linux-0.11/include/linux目录下的sys.h文件

image-20211104234205301

在代码末尾处按照相同的格式添加系统调用函数,在系统调用函数表中,也按照相同的顺序添加系统调用函数。

extern int sys_sem_open();
extern int sys_sem_wait();
extern int sys_sem_post();
extern int sys_sem_unlink();
sys_sem_open,sys_sem_wait,sys_sem_post,sys_sem_unlink

image-20211104234516768

(4)修改Makefile

修改linux-0.11/kernel目录下的Makefile文件

image-20211104235345033

修改2处

第1处:在OBJS的末尾处添加sem.o

OBJS  = sched.o system_call.o traps.o asm.o fork.o \         panic.o printk.o vsprintf.o sys.o exit.o \         signal.o mktime.o who.o sem.o

image-20211104235523778

第2处:在Dependencies中添加相关依赖

sem.s sem.o: sem.c ../include/linux/sem.h ../include/unistd.h

image-20211104235824430

(5)编译内核

进入到linux-0.11目录下,输入make命令,进行编译。

image-20211105000200621

最后一行出现sync,说明编译成功。

image-20211105000405551

(6)挂载文件

oslab目录下使用./mount_hdc命令,运行mount_hdc文件。

image-20211105001030057

unistd.h文件放入到hdc/usr/include目录下

cp ./linux-0.11/include/unistd.h ./hdc/usr/include/

sys.h文件和sem.h文件放入到hdc/usr/include/kernel目录下

cp ./linux-0.11/include/linux/sys.h ./hdc/usr/include/linux/

cp ./linux-0.11/include/linux/sem.h ./hdc/usr/include/linux/

3、解决生产者——消费者问题

(1)编写pc.c

hdc/uer/root目录下新建pc.c文件。代码如下:

#define __LIBRARY__
#include <unistd.h>
#include <linux/sem.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/sched.h>_syscall2(sem_t *,sem_open,const char *,name,unsigned int,value)
_syscall1(int,sem_wait,sem_t *,sem)
_syscall1(int,sem_post,sem_t *,sem)
_syscall1(int,sem_unlink,const char *,name)const char *FILENAME = "/usr/root/buffer_file";    /* 消费生产的产品存放的缓冲文件的路径 */
const int NR_CONSUMERS = 5;                        /* 消费者的数量 */
const int NR_ITEMS = 50;                        /* 产品的最大量 */
const int BUFFER_SIZE = 10;                        /* 缓冲区大小,表示可同时存在的产品数量 */
sem_t *metux, *full, *empty;                    /* 3个信号量 */
unsigned int item_pro, item_used;                /* 刚生产的产品号;刚消费的产品号 */
int fi, fo;                                        /* 供生产者写入或消费者读取的缓冲文件的句柄 */int main(int argc, char *argv[])
{char *filename;int pid;int i;filename = argc > 1 ? argv[1] : FILENAME;/* O_TRUNC 表示:当文件以只读或只写打开时,若文件存在,则将其长度截为0(即清空文件)* 0222 和 0444 分别表示文件只写和只读(前面的0是八进制标识)*/fi = open(filename, O_CREAT| O_TRUNC| O_WRONLY, 0222);    /* 以只写方式打开文件给生产者写入产品编号 */fo = open(filename, O_TRUNC| O_RDONLY, 0444);            /* 以只读方式打开文件给消费者读出产品编号 */metux = sem_open("METUX", 1);    /* 互斥信号量,防止生产消费同时进行 */full = sem_open("FULL", 0);        /* 产品剩余信号量,大于0则可消费 */empty = sem_open("EMPTY", BUFFER_SIZE);    /* 空信号量,它与产品剩余信号量此消彼长,大于0时生产者才能继续生产 */item_pro = 0;if ((pid = fork()))    /* 父进程用来执行消费者动作 */{printf("pid %d:\tproducer created....\n", pid);/* printf()输出的信息会先保存到输出缓冲区,并没有马上输出到标准输出(通常为终端控制台)。* 为避免偶然因素的影响,我们每次printf()都调用一下stdio.h中的fflush(stdout)* 来确保将输出立刻输出到标准输出。*/fflush(stdout);while (item_pro <= NR_ITEMS)    /* 生产完所需产品 */{sem_wait(empty);sem_wait(metux);/* 生产完一轮产品(文件缓冲区只能容纳BUFFER_SIZE个产品编号)后* 将缓冲文件的位置指针重新定位到文件首部。*/if(!(item_pro % BUFFER_SIZE))lseek(fi, 0, 0);write(fi, (char *) &item_pro, sizeof(item_pro));        /* 写入产品编号 */printf("pid %d:\tproduces item %d\n", pid, item_pro);fflush(stdout);item_pro++;sem_post(full);        /* 唤醒消费者进程 */sem_post(metux);}}else    /* 子进程来创建消费者 */{i = NR_CONSUMERS;while(i--){if(!(pid=fork()))    /* 创建i个消费者进程 */{pid = getpid();printf("pid %d:\tconsumer %d created....\n", pid, NR_CONSUMERS-i);fflush(stdout);while(1){sem_wait(full);sem_wait(metux);/* read()读到文件末尾时返回0,将文件的位置指针重新定位到文件首部 */if(!read(fo, (char *)&item_used, sizeof(item_used))){lseek(fo, 0, 0);read(fo, (char *)&item_used, sizeof(item_used));}printf("pid %d:\tconsumer %d consumes item %d\n", pid, NR_CONSUMERS-i+1, item_used);fflush(stdout);sem_post(empty);    /* 唤醒生产者进程 */sem_post(metux);if(item_used == NR_ITEMS)    /* 如果已经消费完最后一个商品,则结束 */goto OK;}}}}
OK:close(fi);close(fo);return 0;
}

image-20211105003800147

(2)编译pc.c

使用./run命令进入到pc.c虚拟机

image-20211105004031807

image-20211105004256617

使用gcc -o pc pc.c命令编译pc.c

编译之后,会出现2个警告,不会对编译产生影响。

image-20211105004840630

(3)查看结果

不知是Linux 0.11还是bochs的bug,如果向终端输出的信息较多,bochs的虚拟屏幕会产生混乱。此时按ctrl+L可以重新初始化一下屏幕,但输出信息一多,还是会混乱。建议把输出信息重定向到一个文件,然后用vi、more等工具按屏查看这个文件,可以基本解决此问题。

使用./pc > out 命令,把结果输入到out文件当中,并使用vi命令查看。

image-20211105010212524

结果

image-20211105010304368

可以看出是从0开始,按照依次顺序正常生产消费。

实验结束。

五、参考文档

  1. 哈尔滨工业大学《操作系统》实验指导书

  2. 操作系统实验六 信号量的实现和应用(哈工大李治军)

  3. 操作系统实验(4: 信号量的实现和应用)

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

相关文章

  1. 【高并发应用场景】QOS策略

    文章目录Qos知识简介...

    2024/5/1 12:41:19
  2. 坐地日行八万里&#xff0c;巡天遥看一千河。 七律二首送瘟神其一 毛泽东 绿水青山枉自多&#xff0c;华佗无奈小虫何&#xff01; 千村薜荔人遗矢&#xff0c;万户萧疏鬼唱歌。 坐地日行八万里&#xff0c;巡天遥看一千河。 牛郎欲问瘟神事&#xff0c;一样悲欢逐逝波。 读了…...

    2024/5/1 9:25:19
  3. 第一个博客

    测试 #mermaid-svg-wyTSfQawSLo4tcKj .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-wyTSfQawSLo4tcKj .label text{fill:#333}#mermaid-svg-wyTSfQawSLo4tcKj .node rect,#mermaid-svg-wyTSfQa…...

    2024/5/1 12:22:46
  4. 【D-OJ刷题日记】使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    思路&#xff1a; 【理解prim算法本质——让一棵小树逐渐长大】 Prim算法生成树用的是MST性质&#xff08;Minnum Spanning Tree&#xff09;。设集合N是一个连通图&#xff0c; N{V&#xff0c;E}&#xff0c;V表示图中所有顶点的集合&#xff0c;V {v0&#xff0c;v1&…...

    2024/5/1 13:15:25
  5. Intel: k8s: 隔离出CPU,单独做其他重要的任务

    文章目录参考背景隔离好理解pin 这里就是一个比喻CMK提供了一个多用使用的命令参考 https://builders.intel.com/docs/networkbuilders/cpu-pin-and-isolation-in-kubernetes-app-note.pdf#:~:textCPU%20pinning%20and%20isolation%20is%20part%20of%20a,decisions%20resultin…...

    2024/5/1 8:22:48
  6. 孤尽T31之技术选型

    技术选型 技术选型是一件很重要的事情。技术选型的原因 降低开发成本提高开发效率 编程语言排行 今天9月份推出的jdk17版本了。 2.微服务架构产生 架构的历史包括如下几个时代 第一代单体应用把所有的应用都打包为一个war包到tomcat下运行&#xff0c;这种模式叫做巨石因公 …...

    2024/5/1 7:55:37
  7. 【复习笔记】电分-第四章-电力系统有功功率和频率调整

    电分-第四章-电力系统有功功率和频率调整 ● 第1节 电力系统中的有功功率平衡 &#xff08;有功功率与频率相关&#xff09; ● 1.1 有功负荷变动和调整控制 ● &#xff08;1&#xff09;有功负荷变动 ● 定义&#xff1a;系统负荷可分成具有3种不同变化规律的变动负荷 ● 特点…...

    2024/4/15 1:51:15
  8. MS SQL2005修改系统表(不允许对系统目录进行即席更新)

    我以前看到网上经常会有人说不能修改MS SQL2005的系统表,我是用这种方法来修改的,不知道和你们说的是否是一个意思呢。 看看是否能解决你们的“不允许对系统目录进行即席更新”的问题。 select * from sysconfiguresselect * from sysconfigures where config=1539--0 1539 m…...

    2024/4/5 6:05:11
  9. JavaScript零基础入门 | day2:JavaScript数据类型

    &#x1f345; Java学习路线总结&#xff1a;搬砖工逆袭Java架构师 &#x1f345; Java经典面试题大全&#xff1a;10万字208道Java经典面试题总结(附答案) &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、CSDN哪吒公众号作者✌ 、Java架构师奋斗者&#x1f…...

    2024/4/15 1:50:44
  10. 98. 验证二叉搜索树——记录(C++)

    class Solution { public:vector<int>v;void x(TreeNode* r){if(r){x(r->left);v.push_back(r->val);x(r->right);}}bool isValidBST(TreeNode* root) {x(root);for(int i0;i<v.size()-1;i){if(v[i]>v[i1]){return 0;}}return 1;} }; 这题与上一题解题类似…...

    2024/4/17 22:21:01
  11. android动态创建多个按钮并添加监听事件

    本篇主要是批量生成按钮(圆形按钮)理解为主,坐标之类的个人进行微调即可,代码如下: //批量添加圆形按钮的方法 public void btnPiLiangCreate(int num,int witch,android.view.View.OnClickListener listener) { DisplayMetrics dm = new DisplayMetrics(); g…...

    2024/4/18 22:24:18
  12. 关于并发集合

    Vector和CopyOnWriteArryList是两个线程安全的List&#xff0c;Vector读写操作都用了同步&#xff0c;相对来说跟适合写多读少的场合&#xff0c;CopyOnWriteArrayList在写的时候会复制以个副本&#xff0c;对副本写&#xff0c;写完用副本替换原来的值&#xff0c;读的时候不需…...

    2024/4/15 1:50:44
  13. 每日一书|世界上代码量很少的经典算法是什么样的?

    杜甫诗云&#xff1a;“读书破万卷&#xff0c;下笔如有神”。开发者多读书、读好书&#xff0c;能打好基础、掌握实践、答疑解惑、拓展视野。正基于此&#xff0c;2021年11月1日起&#xff0c;CSDN、《新程序员》推出“每日一书”栏目&#xff0c;为你推荐精选好书&#xff0c…...

    2024/4/15 1:50:44
  14. 八.DBN深度置信网络

    BP神经网络是1968年由Rumelhart和Mcclelland为首的科学家提出的概念,是一种按照误差反向传播算法进行训练的多层前馈神经网络,是目前应用比较广泛的一种神经网络结构。BP网络神经网络由输入层、隐藏层和输出层三部分构成,无论隐藏层是一层还是多层,只要是按照误差反向传播算…...

    2024/4/19 21:51:13
  15. EJB3 QL中LEFT JOIN vs LEFT JOIN FETCH

    在EJB3 QL中,left join 与left join fetch都是用来join查询,但是它们不同之处在于 left join fetch可以用来把lazy装载的关联数据load到查询的对象中去。除此之外,还有其它需要注意的地方。如下面的例子: 实体类定义: @Entity(name="JobInfo") public class JobI…...

    2024/4/25 20:21:25
  16. 学习网站搭建之路

    小白一枚&#xff0c;最近想学习网站搭建&#xff0c;知识有限于是想先白嫖一个云主机练练手&#xff0c;发现了 。“免费 虚拟主机”“免费 云服务器”的字样深深吸引了我&#xff0c;通过教程成功申请了一台云主机&#xff0c;希望通过它能让我收获满满&#xff01;...

    2024/4/15 1:50:39
  17. 水果店的货源来自哪里,怎样做水果店找货源

    1、进货前自己要学会识货 水果批发市场&#xff0c;基本都是一件件拿的&#xff0c;有些多少件起批还会有要求&#xff0c;一般贵点的水果用小包装居多&#xff0c;十斤几斤一件都有&#xff0c;如葡萄、草莓、车厘子等&#xff0c;而柑橘、苹果等大果型的大件的一般四十斤到二…...

    2024/4/15 1:50:44
  18. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(填充色配置、半透明填充色、添加均值线)实战(density plot)

    R语言使用ggplot2包使用geom_density()函数绘制分组密度图(填充色配置、半透明填充色、添加均值线)实战(density plot) 目录 R语言使用ggplot2包使用ge...

    2024/4/15 1:50:24
  19. 少儿编程 电子学会python编程等级考试一级真题解析(判断题)2019-9

    二、判断题(共20题,每题2分,共40分) 31、print(Im ok.)因为有三个单引号,所以程序是错误的。 答案:正确 考点分析:考查print函数,输出用单引号()或者双引号("")都是成双成对的,如果要输出I和m中的单引号需要使用反斜杠(\)进行字符转义,如果就上面输出会…...

    2024/4/25 14:29:39
  20. 串的应用---字符串暴力匹配(C语言实现)

    串的应用—字符串暴力匹配(C语言实现) 文章目录串的应用---字符串暴力匹配(C语言实现)算法思想--举个例子代码实现测试算法思想–举个例子 ​ 来看个图就明白了&#xff1a; ​ 【匹配成功的情况】 ​ ①初始时&#xff1a; ​ ②第一个能匹配&#xff0c;指针后移&#xff…...

    2024/4/15 1:50:24

最新文章

  1. JavaScript基础(二)

    JS语法结构——引入方式 js很明显可以是一个后缀名为js的文件&#xff0c;js的引入方式和css一样&#xff0c;也有三种方式。 1.外部 使用script表现&#xff0c;只不过增加一个src属性&#xff0c;把js文件的路径src属性中。 <script src "js文件路径">&l…...

    2024/5/1 19:44:29
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 实景户外剧本杀小程序儿童亲子小程序开发搭建

    开发实景户外剧本杀小程序和儿童亲子小程序需要考虑到以下几个方面&#xff1a; 1. 需求分析&#xff1a;明确小程序的定位和目标用户&#xff0c;确定功能需求&#xff0c;如剧本杀游戏、亲子活动、在线交流、预约报名等。 2. 技术准备&#xff1a;选择适合的开发工具和技术…...

    2024/5/1 1:25:43
  4. dp小兰走迷宫

    昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 #incl…...

    2024/5/1 8:48:43
  5. 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…...

    2024/5/1 13:52:04
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57