精华内容
下载资源
问答
  • 但由于killyouNB.exe完全执行完对批处理窗口全面隐藏后,已经没有用了,但其还运行,占用内存,所要要结束它. 7、“一次性执行.bat” 就是只终止一次当前现有的后台进程情况,不使用循环模式,同时可作为退出...
  • 10、增加进程调用的部分日志显示框,主要是调试方便,日志超过30行自动清屏,保存,可修改代码关掉或不显示,evertlog目录下多余的日志关掉了,仍然有小部分日志,,如有必要自行代码中关掉即可。 11、底部增加...
  • 421 服务就绪,关闭传输信道(当必须关闭,此应答可以作为对任何命令的响应) 250 要求的邮件操作完成 251 用户非本地,将转发向 450 要求的邮件操作完成,邮箱不可用(例如,邮箱忙) 550 要求的邮件操作...
  • 并发专项练习

    2019-03-28 22:54:15
    共享内存并提供同步机制,也就是说,第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以这个函数执行...

    有n个进程,共享的同类资源数为m,则避免死锁的最少资源数是n(m-1)+1

    时间片轮转多用在分时

    共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。

    一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;可重入函数对全局变量才需要互斥量保护。

    并行是同时发生的多个并发事件,并发事件之间一定要同一时刻发生

    多线程调用时要进行保护时,主要是针对全局变量和静态变量的,函数内的局部变量不会受到影响。

     

    展开全文
  • grpc Q&A问答

    2020-09-22 15:52:47
    gRPC Metadata 是通过什么传输? 调用 grpc.Dial 会真正的去连接服务端吗?...会,除非你的客户端不是常驻进程,那么应用结束时会被动地回收资源。但如果是常驻进程,你又真的忘记执行 Close语句,会造成的泄露。如

    gRPC Metadata 是通过什么传输?

    在这里插入图片描述

    调用 grpc.Dial 会真正的去连接服务端吗?

    会,但是是异步连接的,连接状态为正在连接。但如果你设置了 grpc.WithBlock 选项,就会阻塞等待(等待握手成功)。另外你需要注意,当未设置 grpc.WithBlock 时,ctx 超时控制对其无任何效果。

    调用 ClientConn 不 Close 会导致泄露吗?

    会,除非你的客户端不是常驻进程,那么在应用结束时会被动地回收资源。但如果是常驻进程,你又真的忘记执行 Close语句,会造成的泄露。如下图:

    1. client
      在这里插入图片描述
    2. server
      在这里插入图片描述
    3. tcp
      在这里插入图片描述

    不控制超时调用的话,会出现什么问题?

    短时间内不会出现问题,但是会不断积蓄泄露,积蓄到最后当然就是服务无法提供响应了。如下图:
    在这里插入图片描述

    为什么默认的拦截器不可以传多个?

    func chainUnaryClientInterceptors(cc *ClientConn) {
    	interceptors := cc.dopts.chainUnaryInts
    	if cc.dopts.unaryInt != nil {
    		interceptors = append([]UnaryClientInterceptor{cc.dopts.unaryInt}, interceptors...)
    	}
    	var chainedInt UnaryClientInterceptor
    	if len(interceptors) == 0 {
    		chainedInt = nil
    	} else if len(interceptors) == 1 {
    		chainedInt = interceptors[0]
    	} else {
    		chainedInt = func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error {
    			return interceptors[0](ctx, method, req, reply, cc, getChainUnaryInvoker(interceptors, 0, invoker), opts...)
    		}
    	}
    	cc.dopts.unaryInt = chainedInt
    }
    

    当存在多个拦截器时,取的就是第一个拦截器。因此结论是允许传多个,但并没有用。

    真的需要用到多个拦截器的话,怎么办?

    可以使用 go-grpc-middleware 提供的 grpc.UnaryInterceptor 和 grpc.StreamInterceptor 链式方法,方便快捷省心。

    单单会用还不行,我们再深剖一下,看看它是怎么实现的。核心代码如下:

    func ChainUnaryClient(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor {
    	n := len(interceptors)
    	if n > 1 {
    		lastI := n - 1
    		return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
    			var (
    				chainHandler grpc.UnaryInvoker
    				curI         int
    			)
    
    			chainHandler = func(currentCtx context.Context, currentMethod string, currentReq, currentRepl interface{}, currentConn *grpc.ClientConn, currentOpts ...grpc.CallOption) error {
    				if curI == lastI {
    					return invoker(currentCtx, currentMethod, currentReq, currentRepl, currentConn, currentOpts...)
    				}
    				curI++
    				err := interceptors[curI](currentCtx, currentMethod, currentReq, currentRepl, currentConn, chainHandler, currentOpts...)
    				curI--
    				return err
    			}
    
    			return interceptors[0](ctx, method, req, reply, cc, chainHandler, opts...)
    		}
    	}
        ...
    }
    

    当拦截器数量大于 1 时,从 interceptors[1] 开始递归,每一个递归的拦截器 interceptors[i] 会不断地执行,最后才真正的去执行 handler 方法。同时也经常有人会问拦截器的执行顺序是什么,通过这段代码你得出结论了吗?

    频繁创建 ClientConn 有什么问题?

    这个问题我们可以反向验证一下,假设不公用 ClientConn 看看会怎么样?如下:

    func BenchmarkSearch(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		conn, err := GetClientConn()
    		if err != nil {
    			b.Errorf("GetClientConn err: %v", err)
    		}
    		_, err = Search(context.Background(), conn)
    		if err != nil {
    			b.Errorf("Search err: %v", err)
    		}
    	}
    }
    

    输出结果:

        ... connection error: desc = "transport: Error while dialing dial tcp :10001: socket: too many open files"
        ... connection error: desc = "transport: Error while dialing dial tcp :10001: socket: too many open files"
        ... connection error: desc = "transport: Error while dialing dial tcp :10001: socket: too many open files"
        ... connection error: desc = "transport: Error while dialing dial tcp :10001: socket: too many open files"
    FAIL
    exit status 1
    

    当你的应用场景是存在高频次同时生成/调用 ClientConn 时,可能会导致系统的文件句柄占用过多。这种情况下你可以变更应用程序生成/调用 ClientConn 的模式,又或是池化它,这块可以参考 grpc-go-pool 项目。

    客户端请求失败后会默认重试吗?

    会不断地进行重试,直到上下文取消。而重试时间方面采用 backoff 算法作为的重连机制,默认的最大重试时间间隔是 120s。

    为什么要用 HTTP/2 作为传输协议?

    许多客户端要通过 HTTP 代理来访问网络,gRPC 全部用 HTTP/2 实现,等到代理开始支持 HTTP/2 就能透明转发 gRPC 的数据。不光如此,负责负载均衡、访问控制等等的反向代理都能无缝兼容 gRPC,比起自己设计 wire protocol 的 Thrift,这样做科学不少。

    在 Kubernetes 中 gRPC 负载均衡有问题?

    gRPC 的 RPC 协议是基于 HTTP/2 标准实现的,HTTP/2 的一大特性就是不需要像 HTTP/1.1 一样,每次发出请求都要重新建立一个新连接,而是会复用原有的连接。

    所以这将导致 kube-proxy 只有在连接建立时才会做负载均衡,而在这之后的每一次 RPC 请求都会利用原本的连接,那么实际上后续的每一次的 RPC 请求都跑到了同一个地方。

    注:使用 k8s service 做负载均衡的情况下

    总结

    1. gRPC 基于 HTTP/2 + Protobuf。
    2. gRPC 有四种调用方式,分别是一元、服务端/客户端流式、双向流式。
    3. gRPC 的附加信息都会体现在 HEADERS 帧,数据在 DATA 帧上。
    4. Client 请求若使用 grpc.Dial 默认是异步建立连接,当时状态为 Connecting。
    5. Client 请求若需要同步则调用 WithBlock(),完成状态为 Ready。
    6. Server 监听是循环等待连接,若没有则休眠,最大休眠时间 1s;若接收到新请求则起一个新的 goroutine 去处理。
    7. grpc.ClientConn 不关闭连接,会导致 goroutine 和 Memory 等泄露。
    8. 任何内/外调用如果不加超时控制,会出现泄漏和客户端不断重试。
    9. 特定场景下,如果不对 grpc.ClientConn 加以调控,会影响调用。
    10. 拦截器如果不用 go-grpc-middleware 链式处理,会覆盖。
    11. 在选择 gRPC 的负载均衡模式时,需要谨慎。
    展开全文
  • nodejs--process

    2016-07-22 15:35:57
    之前的Nodejs概述中有提到,process指的是当前的进程,是个全局的变量,在任何地方都可以调用它,而不需要ruqire来加载 1.退出码 当进程结束的时候,会返回一个整数值,表示退出的状态。一下是常用的退出码: ...

    在之前的Nodejs概述中有提到,process指的是当前的进程,是个全局的变量,在任何地方都可以调用它,而不需要ruqire来加载
    1.退出码
    当进程结束的时候,会返回一个整数值,表示退出时的状态。一下是常用的退出码:

    • 0,正常退出
    • 1,发生未捕获错误
    • 5,V8执行错误
    • 8,不正确的参数
    • 128 + 信号值,如果Node接受到退出信号(比如SIGKILL或SIGHUP),它的退出码就是128加上信号值。由于128的二进制形式是10000000, 所以退出码的后七位就是信号值

    2.常用属性

    • process.argv:返回当前进程的命令行参数数组
    • process.env:返回一个对象,成员为当前Shell的环境变量,比如process.env.HOME
    • process.installPrefix:node的安装路径的前缀,比如/usr/local,则node的执行文件目录为/usr/local/bin/node
    • process.pid:当前进程的进程号
    • process.platform:当前系统平台,比如Linux
    • process.title:默认值为“node”,可以自定义该值
    • process.version:Node的版本,比如v0.10.18

    3.process.env
    十分非常超级重要的属性,

    • 在Confige中,一般设置端口的时候会用port: process.env.PORT || 9178来设置默认端口或者当前进程的端口号
    • 在Config中,在设置当前的环境变量的时候,同样会用process.env.NODE_ENV这样可以确定当前所处的开发阶段。生产阶段设为production,开发阶段设为develop或staging,然后在脚本中读取process.env.NODE_ENV即可

    4.process的一些自带方法
    1. process.chdir():切换工作目录到指定目录。
    2. process.cwd():返回运行当前脚本的工作目录的路径。
    3. process.exit():退出当前进程。
    4. process.getgid():返回当前进程的组ID(数值)。
    5. process.getuid():返回当前进程的用户ID(数值)。
    6. process.nextTick():指定回调函数在当前执行栈的尾部、下一次Event Loop之前执行。
    7. process.on():监听事件。
    8. process.setgid():指定当前进程的组,可以使用数字ID,也可以使用字符串ID。
    9. process.setuid():指定当前进程的用户,可以使用数字ID,也可以使用字符串ID。

    5.process.cwd(),process.chdir()
    cwd方法返回的是当前目录(绝对路径),chdir方法用来切换目录
    来一段代码看看吧:
    process.cwd()
    /home/aaa

    process.chdir(‘/home/bbb’)
    process.cwd()
    /home/bbb’

    6.process.nextTick()
    将任务放在当前一轮事件循环(Event loop)的最后面
    process.nextTick(function(){
    console.log(”)
    })
    当然,我们大部分所见的代码都是利用setTimeout(function(){
    console.log(”)
    },0)
    虽然nextTick的效率更高,因为系统不会检查设定的指定时间,但是据我所见,用的更多的还是setTimeout方法

    7.process.on()
    监听当前进程的各种事件,并制定回调函数

    process.on('SIGINT', function () {
    console.log('Got a SIGINT. Goodbye cruel world');
    process.exit(0);
    });

    process支持的时间有两个种类

    1. data事件:数据输出输入时触发
    2. SIGINT事件:接收到系统信号时触发
    展开全文
  • 键盘钩子Hook技术

    2013-12-02 23:40:05
    关闭QQ,钩子自动卸载并结束进程。 但是由于是使用的键盘钩子,所以只能简单的抓取键盘所键入的内容,如果是汉字的话则无法显示。 由于使用了Hook技术,并对注册表进行了修改,使用前请关闭360等防火墙软件,并...
  • 任何线程里exit导致进程退出,其他线程工作结束,主控线程退出不能return或exit。 另注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能线程函数的栈上分配,...
  • windows编程资料大全

    2008-10-26 13:55:44
    编写程序的过程中,我遇到了这样的需求:基于Windows ...所以,大家编写的侯,一定要注意参数,因为线程的执行别的进程中,一个普通权限的应用程序是无法跨越进程来调试其他进程的。包括VC,也无法调试我们...
  • 桌面提醒程序Ontime

    2009-10-16 14:05:44
    421 服务就绪,关闭传输信道(当必须关闭,此应答可以作为对任何命令的响应) 250 要求的邮件操作完成 251 用户非本地,将转发向 450 要求的邮件操作完成,邮箱不可用(例如,邮箱忙) 550 要求的邮件操作...
  • Excel VBA实用技巧大全 附书源码

    热门讨论 2010-10-08 18:59:24
    01075执行菜单栏和工具栏的命令按钮 01076改变工作表单元格的快捷菜单 01077工作表的任意位置快速显示快捷菜单 01078单元格中输入公式 01079单元格中输入数字 01080单元格中输入文本 01081单元格区域引用 ...
  •  0205 命令子树中的进程没有信号句柄。  0206 文件名或扩展名太长。  0207 环 2 堆栈正在使用中。  0208 输入的全局文件名字符 * 或 ? 不正确,或指定的全局文件名字符太多。  0209 所发送的信号不...
  • 说明: 确定查询是否获取表级的读取锁, 以防止包含该查询的事务处理被提交之前更新任何对象读取。这种操作模式提供可重复的读取, 并确保同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | ...
  • 995 0x000003E3 由于执行结束或应用程序要求,而异常终止 I/O 作业。 996 0x000003E4 重叠的 I/O 事件不是设定成通知状态。 997 0x000003E5 正在处理重叠的 I/O 作业。 998 0x000003E6 对内存位置的无效存取。 ...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    在本地路输入框后点击浏览可以更改网站所在文件位置,默认目录为:C:\Inetpub\wwwroot 在执行权限后面点击配置-调试-教本错误信息,选中:向客户端发送文本错误信息:处理 URL 服务器出错。请与系统管理员联系。...
  • SkyIAR_v0.5_Dev

    2019-04-19 23:30:30
    3、[新增] A55、A75、Hudson-D2、Hudson-M2关键字,提高对AMD FM1平台支持 4、[修正] Windows目录自动检测过程中,自动排除PE的Windows目录 5、[修正] 在未选中任何IAR驱动并单击执行后的报错问题 6、[修正] 重启...
  • 挂起功能允许您让占用资源的进程在以后的某个时间点继续操作,而不必终止该进程。它是Sysinternals 命令行工具不断完善的 PsTools 工具包的一部分。  BgInfo  在桌面上列表显示计算机软、硬件信息,包括CPU主频、...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    2.2 公用语言运行环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...
  • 适合patch尚未运行的加壳不加壳的可执行文件,需要补丁的数据较多建议使用这个,子程序中打补丁 .参数 文件名, 文本型, , 文件全路径 .参数 模块名, 文本型, , 如"user32.dll" .参数 API, 文本型, , 如...
  • C#微软培训资料

    2014-01-22 14:10:17
    2.2 公用语言运行环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...
  • 精易模块[源码] V5.15

    2015-03-21 22:03:37
    9、修正“进程_ID取进程名”64位系统不能获取名称的BUG,感谢易友【慕寒夜】反馈。 10、新增“进程_取线程数”通过进程ID或进程名获取指定进程线程数。 MD5:89AECEA5D0E513E7D586EA8396AD17CC 精易模块 V5.0 ...
  • RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化,用这个函数提供一种通知机制 RegOpenKey 打开一个现有的注册表项 RegOpenKeyEx 打开一个现有的项。win32下推荐使用这个函数 RegQueryInfoKey ...
  •  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和...
  • kill -F 进程名 加-F参数后强制结束进程(为系统的附加工具,默认是没有安装的,安装目录的Support/tools文件夹内) del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、...
  • McAfee 8.0 简体中文

    热门讨论 2006-02-16 11:06:30
    使用此功能可以在执行 JavaScript 和 VBScript 脚本之前对其进行 扫描。脚本扫描程序能够象真正的 Windows 脚本主机组件的代理组件一 样运行。它可以阻止脚本(例如 Internet Explorer 网页脚本)的执 行并对...
  • 1.形参变量只有被调用时才分配内存单元,调用结束时, 即刻释放所分配的内存单元。因此,形参只有函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数...
  • java-servlet-api.doc

    2009-10-13 19:34:17
    Servlet引擎解析并载入一个Servlet,这个过程可以发生引擎启动,需要一个Servlet去响应请求,以及此之间的任何时候。 Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统...
  • 调用之后,我们需要做的是诸如将它们标记为被使用的等事情,并且,调用 malloc ,我们要能够定位被使用的内存块。因此,malloc 返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 ...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

任何进程在执行未结束时