进程同步,信号量,互斥变量等说明

2023-11-12

0 前言

工作三年,敲了3年代码(PHP,C++,Java,C)等,开发过几种产品,非计算机科班出身,全部编程是自学最近闲来无事买了一本《计算机操作系统》第四版,学一下个人感觉对比较重要的章节,增加对编程的理解。

1 进程的描述

1.1 进程的定义和特征

1.进程控制块(PCB):为了使参与并发执行的每个程序(含数据)都能独立的运行,
            在操作系统中必须为之配置一个专门的数据结构。称之为进程控制块。
2.进程的定义:
    (1)进程是程序的一次执行。
    (2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  ★(3)进程是具有独立功能的程序在一个数据集合上的运行的过程,它是系统
        进行资源调度和分配的一个独立单位。
    (4)在引入进程实体之后,我们可以把传统OS中的进程定义为:
        ※进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
     进程 = PCB + 程序段 + 数据段
3.进程的特征:
    (1)动态性
    (2)并发性
    (3)独立性
    (4)异步性
4.进程与程序的区别和联系:
    进程:是程序的一次执行,是动态概念。一个进程可以同时包括多个程序;
          进程是暂时的,是动态的产生和消亡的。
    程序:是一组有序的静态指令,是静态概念。一个程序可以是多个进程的
          一部分;程序可以作为资料长期保存。


1.2 进程的基本状态及转换

        由于多个进程在并发执行时共享系统资源,致使他们在运行过程中呈现间断性的运行规律,所以进程在生命周期内可能具有不同状态。一般而言,每个进程至少应处于以下三种基本状态

  • 就绪(Ready)状态
    指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU就可以立即执行。如果有多个就绪状态的进程。
    通常按照一定的策略排成一个队列,称该队列为就绪队列
  • 执行(Running)状态
    指进程已经获得CPU,其程序正在执行的状态。在单处理机系统中,只有一个进程处于执行状态,而多处理机系统则有多个进程处于执行状态。
  • 阻塞(Block)状态
    指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,即进程的执行受到了阻塞。此时引起进程调度,OS把处理机分配给另一个就绪的进程,而让受阻进程处于暂停状态,一般将这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。
    通常系统将处于阻塞状态的进程也排成一个队列,称为阻塞队列。
  • 三种基本状态的转换
  1. 就绪--->执行 处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行 。
  2. 执行--->就绪 正在执行的进程如果因为分配给他的时间片用完而被剥夺处理机暂停执行,其状态就会变成就绪。
  3. 执行--->阻塞 如果因发生某事件,致使当前进程行为受阻(例如进程访问临界资源,而该资源正被其他进程访问时),则变成了阻塞。

1.3 创建状态和终止状态

        为了满足进程控制块对数据及操作的完整性要求以及增强管理的灵活性,通常在系统中有引入的两种状态:创建状态和终止状态;进程的五种状态及转化如下如所示:

 

1.4 进程的挂起与激活

  • 进程的挂起

检查进程状态,如果活动就绪改为静止就绪;如果活动阻塞改为静止阻塞。为了方便用户或父进程考察该进程的运行情况,把进程PCB复制到制定内存区域;最后若被挂起的进程正在执行,则扎ungxiangdiaodu程序重新调度。

  • 进程的激活状态

利用激活原语Active,把进程从外存调入内存,检查其状态,若静止就绪改为活动就绪;若静止阻塞改为活动阻塞。

  • 三种基本状态下加入挂起和激活的进程状态图:

  •  五种状态下加入挂起和激活的进程状态图:

1.5 进程管理中的数据结构

PCB的作用

1.作为独立运行的基本单位的标志;
系统创建一个新进程时,就为它建立一个PCB,进程结束时回收PCB,进程也随之消亡,系统通过感应PCB来感知进程的存在。事实上,PCB已成为进程存在于系统的唯一标志。
2.能实现间断性运行方式;
有了PCB后,当进程阻塞暂停运行时,系统可以将CPU现场信息保存在PCB中,当进程再次执行时使用PCB中的CPU现场信息,恢复CPU现场。
3.提供进程管理所需要的信息;
4.提供进程调度所需要的信息;
5.实现与其他进程的同步与通信;

PCB中的信息

1. 进程标识符
        用于唯一地标识一个进程,一个进程通常有两种标识符。
        内部标识符:操作系统为每一个进程设置的唯一的标识符;
        外部标识符:为了方便用户(进程)对进程的访问,由创建者提供的标识符。
2. 处理机状态;
        处理机上下文信息;
3. 进程调度信息
4. 进程控制信息
5. PCB的组织方式

1.线性方式
        把所有的PCB组织在一张线性表中,将该表的首地址放在内存的专用区域。访问时在指定区域找表的首地址,再通过访问表的首地址找到表的信息,最后查找到需要的PCB。

2.链接方式
        把具有相同状态进程的PCB分别通过PCB的链接字链接成为一个队列。

3.索引方式
        根据进程状态的不同,各自建立索引表,把索引表在内存的首地址存放在指定的区域。通过这些首地址查找需要的PCB;

2 进程的控制

2.1 OS内核

大多数操作系统内核包括两大方面的内容:

  • 支撑功能
  • 资源管理功能

通常将处理机的执行状态分为系统状态和用户状态两种。
    ①系统态:又称为管态,也称为内核态。
    ②用户态:又称为目态。
1.支撑功能:
    (1)中断处理
    (2)时钟管理
    (3)原语操作
2.资源管理功能:
    (1)进程管理
    (2)存储器管理
    (3)设备管理


2.2 进程的创建

进程的层次结构:
    通常,把创建进程的进程成为--父进程;把被创建进程的进程成为子进程。
    在UNIX中,进程与其子孙进程共同组成一个进程家族(组)。
    但在Windows中不存在任何进程层次结构的概念。
引起进程创建的事件:
    (1)用户登录
    (2)作业调度
    (3)提供服务
    (4)应用请求
进程的创建:
    (1)申请空白PCB为新进程申请获得唯一的数字表示符,并从PCB集合中索取一个空白PCB。
    (2)为新进程分配其运行所需的资源。
    (3)初始化进程控制块
    (4)如果程序就绪队列能够接纳新进程,便将新进程插入就绪队列。


2.3 进程的终止

引起进程终止的事件:

1、正常结束。
2、异常结束:
        ①越界错,这是指程序所访问的存储区,已越出该程序的区域。
        ②保护错,指进程试图去访问一个不允许访问的资源或文件。或者以不适当的方式进行访问。
        ③非法指令,指程序试图去执行一个不存在的指令。
        ④特权指令错,指用户进程试图去执行一条只允许OS执行的指令。
        ⑤运行超时,指进程的执行时间超过了指定的最大值。
        ⑥等待超时,指进程等待某事件的时间超过了规定的最大值。
        ⑦算术运算错,指进程试图去执行一个被禁止的运算。
3、外界干预:① ②③

进程终止的过程:

1、根据被终止进程的标识符,从PCB集合中j检索出该进程的PCB,从中读出该进程的状态。
2、若被终止的进程的处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
3、若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以方他们成为不可控的进程。
4、将被终止的进程所拥有的全部资源或者归还其父进程,或者归还给系统。
5、将被终止的进程(PCB)从所在的队列(或链表)中移除,等待其它程序来搜集信息。

2.4 进程的阻塞与唤醒

  • 引起进程阻塞和唤醒的事件
  • 进程阻塞过程
  • 进程唤醒过程

有下述几类事件会引起进程阻塞或被唤醒:
    (1)向系统请求共享资源失败。
    (2)等待某种操作的完成
    (3)新数据尚未到达
    (4)等待新任务的到达

2.5 进程的挂起与激活

  • 进程的挂起
  • 进程的激活过程

3 进程同步

进程同步是重点知识,需要深入理解,也是我在开发过程中经常会遇到的场景,进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的进程之间能够按照一定的规则共享系统资源,并且很好地相互合作,从而使程序的执行具有可再现性。

3.1 进程同步的基本概念

  • 两种形式的制约

        由于共享资源或者为完成某一任务相互合作,而产生制约关系;

        间接相互制约关系 :多个程序在并发执行时,由于共享系统资源导致这些并发执行程序之间形成的相互制约关系。例如打印机这些临界资源;

        直接相互制约关系 :通过合作而产生的制约关系。例如只有a执行过后,b才能执行。而两者都是为了完成某一个功能。

  • 临界资源

        只能一个进程访问的资源。进程之间采取互斥方式,实现对这种资源的共享。通过生产者---消费者问题(进程同步问题)可说明这一过程.(具体不再说明该问题) 。

  • 临界区

        每个进程中访问临界资源的那段代码称为临界区。可把一个访问临界资源的循环进程描述如下(剩余区是取出进入,临界,退出区的剩下的代码):

while(TRUE)
{
	进入区
	临界区
	退出区
	剩余区
}
  • 同步机制应遵循寻的规则        

        1.空闲让进
        2.忙则等待
        3.有限等待
        4.让权等待

3.2 硬件同步机制

1、关中断

        关中断就是一种中断信号,在单片机中的中断描述一种,这种统计机制就是针对多线程,多进程程序效率太低,频繁使用中断可能造成严重异常,不适用多CPU系统;

2、使用TEST-and-Set指令实现互斥

        简称TS指令,在许多计算机中都提供了这种指令,代码逻辑如下:

// lock=false时表示资源空闲
bool TS(bool *lock)
{
    bool old;
    old = *lock;
    *lock = true;
    return old
}
  
//用法示例如下
int main(void)
{
    do{
        //代码块
        while(TS(&lock)); //为true时进入循环,不出来
        //临界区处理代码
        *lock = false;    //处理完成后将锁置空闲
    }
    while(true);
}
  

3、利用Swap指令实现进程互斥

        该指令实现两个变量互换,在Intel 80x86中称为XCHAR指令,代码如下

void swap(bool *a, bool *b)
{
	bool temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
/*
使用说明:为每个临界资源设置一个全局的布尔变量lock,初始值为false
在每个进程中再利用一个局部变量key,利用swap进程临界资源操作,实现互斥
*/
int main()
{
	bool key,lock;
	while (1)
	{
		key = true;
		do{
			swap(&lock, &key);
		} while (key != false);
		//临界区操作
		lock = false;
		//剩余区操作
	}
}

3.2 信号量机制

1、整形信号量(P、V操作)

通过两个标准的原子操作wait(S)和signal(S)来访问;这两个操作有叫P,V操作;

int S = 1;			 //用整形变量表示信号量
void wait(int s)	 //进入区
{
	while(s <= 0);	 //资源不够一致循环,缺点一致不让权等待,就是瞎忙
	s--;			 //占用资源
}

void signal(int s)	 //退出区
{
	s++;			 //释放资源
}

//进程P0
int main()
{
	wait(S);				//进入区,申请资源
	//使用打印机资源			//临界区。。。
	signal(S);				//退出区,释放资源
	//剩余区
}

//进程P1
int main()
{
	wait(S);				//进入区,申请资源
	//使用打印机资源			//临界区。。。
	signal(S);				//退出区,释放资源
	//剩余区
}

//进程PN
int main()
{
	wait(S);				//进入区,申请资源
	//使用打印机资源			//临界区。。。
	signal(S);				//退出区,释放资源
	//剩余区
}

 2、记录型信号量

为了解决数字型信号量,瞎等问题;

/*
----解决瞎忙问题,添加到进程等待链表里面
*/
//记录型信号量的定义
typedef struct
{
	int value; //
	struct process *L;
}semaphore;

//申请资源
void wait(semaphore S)
{
	S.value--;
	if (S.value < 0)
	{
		/*若资源不够,
		*使用block原语使进程从运行态进入阻塞态
		*并把挂到信号量S的等待队列中
		* 该进程从阻塞态变为就绪状态*/
		block(S.L);
	}
}

//释放资源
void sigle(semaphore S)
{
	S.value++;
	if (S.value <= 0)
	{
		/*释放资源后,若有其他进程等到资源,
		 *使用wakeup唤醒等待队列中的进程
		 * 该进程从阻塞态变为就绪状态*/
		wakeup(S.L);  
	}
}

3、And型信号量

为了解决一个进程中多个临界资源的访问,解决死锁问题;
S1到Sn都表示所需资源,资源数都大于1,对每个资源进行--表示资源被占用,分配好资源之后跳出循环,wait操作结束。如果其中某个资源Si得不到满足,会执行else中的内容:把进程放进Si关联的阻塞队列中,然后程序计数器把指针移向wait操作开始。(wait操作是原语,遵循要执行都执行,执行不了就从头重新执行)

signal操作表示的是释放资源,把S1到Sn全部资源释放,并且把S1到Sn关联的阻塞队列全部置空,阻塞队列中的进程直接调度到就绪队列中。

缺点:AND型信号量满足了 “多种资源,数量为1”的使用情景,但是实际上还会有多种资源数量不固定的情景,AND型信号量显然处理不了这种情况的进程调度。为了解决多资源多数量的情况,出现了信号量集。

//出现的死锁情况如下,假设有两个进程A,B,分别访问共享数据D,E,
//分别设置互斥量Dmutex,Emutex
process A:            process B:  
wait(Dmutex);          wait(Emutex);
wait(Emutex);          wait(Dmutex);

//若下面执行则死锁:
process A:wait(Dmutex);
process B:wait(Emutex);
process A:wait(Emutex);   //死锁
process B:wait(Dmutex);   //死锁

//And型实现的代码如下;
//核心思想:每个进程都是一次性申请全部共享资源,

Swait(S1, S2, …, Sn)
{
	while(true)
	{
		if (S1 >= 1 and … and Sn >= 1){
			for (i = 1; i <= n; i++) Si--;
			break;
		}
		else{
			//将进程放入与Si<1的第一个Si相关联的等待队列中,
		}
	}
}


Ssignal(S1, S2, …, Sn){
	while (true){
		for (i = 1; i <= n; i++) {
			Si++;
			//将与Si关联的队列中等待的所有进程移除到就绪队列中
		}
	}
}

3、信号量集

     PV操作只能对互斥变量做加1减1访问,表明一个进程只能对共享资源中某个资源做一次操作,当需要操作多次时,会多次PV操作,会大大增加死锁概率,在有些情况下,必须对系统资源做强制分配,申请临界资源的数量大于下限值时,必须管制不予分配,所以在每次分配之前需要测试资源的数量,所以多And信号量机制做升级,提出了信号集的概念;

其实就是对每个进程申请每个资源的下限值放入到PV函数中,扩展PV函数,

Swait(S1,T1,D1,.....)
Ssignal(S1,T1,D1,.....)
进程对S的测试值不是1,而是T,当资源大于T时,才能分配资源;一旦分配资源进程对改资源的需求就是D,释放资源是是进行S=S-D操作;

//一般的信号量集有一下几种情况
1、Swait(S,d,d)   一个信号,每次申请d个资源,现有资源少于d个,不予分配
2、Swait(S,1,1)   退化成记录型信号量
3、Swait(S,1,0)   可控的开关,当S≥1时,允许多个进程进入特定区,S变为0时将阻止任何进程进入特定区

后续将学习计算机中进程调度问题,是以什么算法进行调度的?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程同步,信号量,互斥变量等说明 的相关文章

  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug

随机推荐

  • Kafka消费者详解

    一 Kafka消费者的消费模式 当生产者将消息发送到Kafka集群后 会转发给消费者进行消费 消息的消费模型有两种 推送模式 push 和拉取模式 pull 1 消息的推送模式 消息的推送模式需要记录消费者的消费状态 当把一条消息推送给消费
  • u盘刷新系统

    1 百度u盘制作将u盘进行刷成系统盘 点击添加系统 确认 关掉即可 到这里就制作完成了 u盘里也有系统了 下一步就是进入电脑的 bios 一般是f8 或者f2 或者esc 看你是什么电脑自己手机百度一下 当进入u盘系统时候会发现一键刷机工具
  • 【计算机网络】HTTP协议详解(八):HTTP网关

    HTTP网关 文章目录 HTTP网关 一 网关 Gateway 二 网关的分类 1 HTTP 服务器端网关 2 HTTP 客户端网关 3 HTTP HTTPS 服务器端安全网关 4 HTTPS HTTP 客户端安全加速器网关 5 资源网关
  • sshpass

    sshpass 安装 sshpass Linux 软件工具安装 源码安装 测试 sshpass 在使用 ssh scp 等命令进行远程操作的时候 必须手动输入密码 这就为自动化的执行造成困扰 sshpass 可以在命令行直接使用密码来进行远
  • Android Studio 常用快捷按键

    大小写转换 Cmd Shift U Ctrl Shift U 注释代码 Cmd Ctrl 注释代码 Cmd Option Ctrl Alt 格式化代码 Cmd Option L Ctrl Alt L 清除无效包引用 Option Contr
  • Python实现Mean Shift算法

    声明 代码的运行环境为Python3 Python3与Python2在一些细节上会有所不同 希望广大读者注意 本博客以代码为主 代码中会有详细的注释 相关文章将会发布在我的个人博客专栏 Python从入门到深度学习 欢迎大家关注 在K Me
  • 【PTA】 7-1 矩阵链相乘问题 (20 分)

    输入 5 30 35 15 5 10 20 输出 11875 代码 include
  • Python Numpy数组保存

    Numpy提供了几种数据保存的方法 以3 4数组a为例 1 a tofile filename bin 这种方法只能保存为二进制文件 且不能保存当前数据的行列信息 文件后缀不一定非要是bin 也可以为txt 但不影响保存格式 都是二进制 这
  • websocket没准备好如何解决_websocket没准备好点确定继续怎么解决,这事android? 爱问知识人...

    请采纳点赞 你可以把WebSocket看成是HTTP协议为了支持长连接所打的一个大补丁 它和HTTP有一些共性 是为了解决HTTP本身无法解决的某些问题而做出的一个改良设计 在以前HTTP协议中所谓的keep aliveconnection
  • RE整改实例——接口缝隙引起的EMC问题整改

    前言 背景 CT某一产品中的控制电路 在RE测试时候750MHz频点超过3dB 整改方法 经过近场测量分析 辐射来源于接口缝隙 经公式计算 750MHz频率引起的对应波长 0 4m 在EMC允许缝隙的长度选择中建议小于二十分之一波长 则 2
  • 只等你来!OpenAtom XuperChain 开发者夏季论坛来啦

    OpenAtom XuperChain 开源两周年之际 我们将于 6 月 25 日在上海浦东新区举办 OpenAtom XuperChain 开发者夏季论坛 特邀研究机构 企业等开源生态合作伙伴 共同探讨区块链技术发展路径和落地方向 本次论
  • solr6.6.0部署到tomcat

    准备工作 solr 6 6 0 apache tomcat 8 jdk1 8 0 131 部署 首先把solr 6 6 0 server solr webapp中的webapp目录拷贝到apache tomcat 8 5 15下的webap
  • 数据结构与算法-基础排序算法及TopK问题(Python)

    排序 基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序 经典问题 TopK 堆排序 快速排序 基础排序算法 如果在面试中遇到排序算法 先问清楚数据的特点 结合具体的业务场景 多和面试官交流 先陈述思路 得到面试官肯定以后再编码
  • Java8方法引用

    内容简介 方法引用Demo详解 通过5种语法使用方法引用 方法引用使用总结 1 在Java8中方法引用Demo详解 1 1 方法引用出现的背景 在使用Lambda表达式的时候 我们实际上传递进去的代码就是一种解决方案 拿什么参数做什么操作
  • Spring MVC中如何限制Controller为POST或GET方式接收参数呢?

    转自 Spring MVC中如何限制Controller为POST或GET方式接收参数呢 在Web页面开发中 最常用的接收参数值方式有 GET和POST方式 那么SpringMVC中如何定义参数的接收方式呢 实现思路 只需在注解的时 使用m
  • mark_as_advanced

    Mark cmake cached variables as advanced mark as advanced CLEAR FORCE VAR VAR2 Mark the named cached variables as advance
  • 什么是子查询?

    当一个查询结果是另一个查询的条件的时候 那么就称为子查询 子查询是在SQL语句内的另外一条SELECT语句 在SELECT INSERT UPDATE或DELETE命令中只要是表达式的地方都可以包含子查询 子查询甚至可以包含在另外一个子查询
  • 自动化测试-Appium-Desired Capabilities参数详解

    分类 定义与说明 General Capabilities 通用功能 Update settings Android Only UIAutomator 1 UIAutomator2 Only Espresso Only iOS Only i
  • 数据仓库灵魂30问之如何建设数据中台?一幅图说清中台。

    什么是中台 什么是数据中台 数据仓库实现了企业数据模型的构建 大数据平台解决了海量 实时数据的计算和存储问题 数据中台要解决什么呢 数据如何安全的 快速的 最小权限的 且能够溯源的被探测和快速应用的问题 数据中台不应该被过度的承载平台的计算
  • 进程同步,信号量,互斥变量等说明

    0 前言 工作三年 敲了3年代码 PHP C Java C 等 开发过几种产品 非计算机科班出身 全部编程是自学最近闲来无事买了一本 计算机操作系统 第四版 学一下个人感觉对比较重要的章节 增加对编程的理解 1 进程的描述 1 1 进程的定