V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  CRVV  ›  全部回复第 12 页 / 共 28 页
回复总数  545
1 ... 8  9  10  11  12  13  14  15  16  17 ... 28  
2020-10-29 11:07:42 +08:00
回复了 v2410117 创建的主题 Python 请教如何使用 Python 直接对二进制文件进行修改
@v2410117

如果你连改文件内容都需要来发帖子问,改 ELF 然后还要能跑属于你不可能完成的事情,放弃吧。

https://blog.0patch.com/2017/11/did-microsoft-just-manually-patch-their.html
这是微软做过然后能上新闻的操作。
2020-10-29 10:53:49 +08:00
回复了 Yc1992 创建的主题 C++ c++ 有没有能够对标 golang 的 goroutine 的协程库啊?
@Yc1992
我本来想说的就是这一段。

When a coroutine blocks, such as by calling a blocking system call, the run-time automatically moves other coroutines on the same operating system thread to a different, runnable thread so they won't be blocked.

这里说的不是把多个 coroutine 放到同一个线程上来跑。是说如果有一个 coroutine 阻塞住了一个 thread,就把其它的 coroutine 放到别的线程上跑。

然后有一句话,The programmer sees none of this, which is the point. The result, which we call goroutines, ...

所以总结一下就是,有一个协程,它 block 住了(比如在 python 的 async function 里面写了一句 time.sleep ),这样其它的协程就不能跑了对吧,那我们写一个高级一点的 runtime,把能跑的协程放到其它 thread 上跑。
并且把这些过程都隐藏起来,什么 yield 之类的东西都没有了,都是 runtime 里面的事情。

所以说这是一个基于 coroutine 的想法,或者说是一个经过了大改的 coroutine,还专门说了这个东西叫 goroutine 不叫 coroutine 了。

所以还是上一条回复里面说的,它改完了就不是 coroutine 了。
2020-10-29 10:20:28 +08:00
回复了 Yc1992 创建的主题 C++ c++ 有没有能够对标 golang 的 goroutine 的协程库啊?
@Balthild
@hronro

https://en.wikipedia.org/wiki/Coroutine#Comparison_with_threads
协程,coroutine,co 是 cooperatively,合作协作的意思。
相对的概念是 preemptively,抢占

这是这个 coroutine 原本的意思。

在一个 stackful coroutine 的实现上加上抢占式调度,那当然可以做。
但做出来的东西就不叫 coroutine 了。
@v2webdev
用整数的话,32 位不够,那就要用 64 位的,占 8 bytes
那个字符串是 14 个数字,14 bytes

如果用定长的字符串,也就是不需要额外存长度,也不需要在结尾补一个 0,那就是差 6 bytes
2020-10-28 13:55:40 +08:00
回复了 Yc1992 创建的主题 C++ c++ 有没有能够对标 golang 的 goroutine 的协程库啊?
@Yc1992
如果你去看 Go 的官方文档,里面明确说了这东西不是 coroutine,当然它也不是 thread,所以才起了个新名字叫 goroutine

大家常说它是协程,是因为它和协程很像,在 io 上也用 epoll, kqueue, iocp 这些系统调用,并且它也确实在 io 操作上 yield 了,老版本上的调度器还不是抢占式的。

但首先新的调试器已经是抢占式的了,这就不符合协程的定义。然后你对比一下实现的细节,显然现在的 goroutine 和 thread 更接近。

别人怎么说并不重要,你得去看实际的东西。
本来就可以这么用,如果你要深究,就保存时间这件事情上,每个方法都会有缺点。

首先字符串就是任意长度的整数,没什么区别。

日期时间的存法很多,比如
1. 用 unix timestamp,缺点是人类不能一眼看出来那是哪天。
2. 用数据库内置的 datetime 类型,但 MySQL 的 datetime 有奇怪的行为还不能带时区。
3. 用楼主说的这种,存字符串类型。
4. 用楼主说的这种,存整数类型。

4 比 3 省 6 个 byte 的空间。
但是这个格式一定要从字符串转换过来,用的时候也必然要转回字符串,所以 3 比 4 节省一点 cpu 。

实际上 3 和 4 的差别是无关紧要的事情,没人在乎 6 个 byte,也没人在乎那一点点 cpu 。
但 1 和 2 的缺点是确实存在的。
2020-10-27 15:16:11 +08:00
回复了 Windsooon 创建的主题 程序员 收集了大厂面经出现的高频题
@Ipopker

新生代与年老代
这是 Generational garbage collection 里面才有的概念。
2020-10-27 14:32:19 +08:00
回复了 Windsooon 创建的主题 程序员 收集了大厂面经出现的高频题
> 简述 JVM 的内存模型 JVM 内存是如何对应到操作系统内存的?
> JVM 中内存模型是怎样的,简述新生代与年老代的区别?

你们说的 “内存模型” 是 Memory Model 么?
https://en.wikipedia.org/wiki/Java_memory_model

首先,这个东西和 GC 根本毫无关系。所以我完全不知道第二行的问题在问啥,还是说它其实是两个不相关的问题?

然后这个东西和操作系统也没什么关系,因为只是在说多个线程对内存的操作会产生什么样的效果。
所以第一行的问题也很奇怪,合理的问题应该是内存模型要怎么对应到编译器的优化上,以及什么地方要加 memory barrier 。这些事情只和 ISA 相关,和操作系统不相关。
2020-09-22 11:04:51 +08:00
回复了 786375312123 创建的主题 程序员 一个弱值的问题,读的成本比写低多少?
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=vmovdqu&techs=AVX&expand=5655,3418

单纯回答这个问题的话,随便找一对 load 和 store 指令看文档就好了
所以不同的处理器上不一样,Intel 架构上 load store 指令有一大堆,估计这个数字还会各不相同。
上面链接里的这一对指令,在 Icelake 上是 store 的开销比 load 小

当然,以上回答其实没有意义,因为如一楼所说这个数字没有用。

不过,如果你要做的是一个并发的系统,可能是 cpu core 并行工作,也可能是你部署了一个集群来处理请求。
那么, 在很多情况下,最后系统的瓶颈是在对同一个位置的写操作上。
比如 atomic counter,不论是 cpu 上实现的还是 Redis 实现的,这个写操作都不可能被无限扩展,在 cpu core 足够多或者并发请求足够多的时候就会成为瓶颈。

所以,通常情况下,设计架构 /算法时,会让写操作少一些。
2020-09-17 13:07:52 +08:00
回复了 Ikhi 创建的主题 酷工作 [小年糕] 远程办公不打卡, go 语言开发算法测试内推
第一次到要求把工作年限写到邮件标题上的,这么关注工作年限的话,你和普通的 HR 就是一回事呗,还搞什么内推
2020-09-06 22:48:39 +08:00
回复了 amiwrong123 创建的主题 MySQL mysql 必知必会的多表联结问题?
SQL 是声明式语言而不是命令式语言,也就是你把自己需要什么数据告诉数据库,然后数据库把数据取出来,至于是怎么取的,那是数据库内部的事情,不是用 SQL 写出来的。
写 SQL 的点在于用精确简洁的方式描述清楚你到底要什么数据,比如前一种写法就很好了。

虽然这么说,当然存在换一个写法能让查询变快的方法,但是这种事情并不那么常见。
如果真要做优化,你把两句分别跑一下,如果变快了就是更好了。
2020-09-03 19:50:12 +08:00
回复了 TheWalkingDead 创建的主题 程序员 刚听闻一老家亲戚可能得癌症后,对 X 漂一族的思考。
只要是不太好治的病,在北上广的大医院治比在小地方(包括很多大的省会城市)医院治好的概率大得多。
在上一行里说的大的省会城市的医院里治,也比更小的什么县城医院里治好的概率大得多。
2020-08-31 21:17:16 +08:00
回复了 JasonLaw 创建的主题 Java 关于 StackOverflowError 和 OutOfMemoryError 的疑惑
从回复来看,这个书只是翻译了 Java 文档而已。

然后这个文档是 Java Virtual Machine Specifications,它是定义 JVM 的文档,而不是描述 Oracle JVM 工作方式的文档。
这个文档当然没有写错,但它确实写成了一个不太好懂的方式。当然了这个文档有 600 多页,也不是给初学者看的。

把有疑问的内容都粘过来,是这样的

This specification permits Java Virtual Machine stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of Java Virtual Machine stacks, as well as, in the case of dynamically expanding or contracting Java Virtual Machine stacks, control over the maximum and minimum sizes.

The following exceptional conditions are associated with Java Virtual Machine stacks:

If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError.

If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.


所以,
这里有两种情况,分别是 fixed sized 的栈和可以 dynamically expanding 的栈。
maximum depth of the java call stack
对 fixed 的栈来说,那显然是它的初始大小,因为它不能变。
对 dynamical 的栈来说,那显然是它的 maximum size,在第二段里提到了。

后面那个 OutOfMemoryError 的前提是 dynamical 的栈,所以就是 expand stack 的时候,内存不够了报的错。

Oracle JVM 的栈是 fixed sized,-Xss 是在设定栈的大小,也就是第二段里说的 initial size of Java Virtual Machine stacks,它和这个 OutOfMemoryError 毫无关系。
2020-08-25 13:47:59 +08:00
回复了 solxnp 创建的主题 Go 编程语言 请教下反射后类型转换的问题
https://golang.org/pkg/reflect/#Value.Interface

f := Value.Interface().(func())
f()

也许能用,我没试
2020-08-25 13:29:06 +08:00
回复了 adoula 创建的主题 程序员 有人知道在深圳买车怎么上老家牌吗,需要把车开回去吗
@z775781
@Wongz

我印象中通常不会把车开走的,来路不正的车要销脏也不容易。
主要的风险是路上出事,比如撞死了人,这个赔偿可能需要车主来付。
@wizardoz

struct 里面的 field 都会 self-align,把 int b 放到 char a 前面,char c 就不会 align 到 4 bytes 上了。
只取最大的一条可以不用 JOIN

SELECT Persons.LastName, Persons.FirstName,
(SELECT max(OrderNo) FROM Orders WHERE Orders.Id_P = Persons.Id_P) AS OrderNo
FROM Persons;

如果要取最大的两条,就得用 2 楼的方法

也可以用 window function,MySQL 8 支持了
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

fwrite 的第一个参数明明是 const void* 类型

直接
uint32_t x;
fwrite(&x, 4, ...)
应该就能用

另外,没有理解楼主说的 对齐 是指什么,如果从头开始写,每次写 4 bytes,那当然是对齐到 4 bytes 上的
1 ... 8  9  10  11  12  13  14  15  16  17 ... 28  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 33ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
Developed with CodeLauncher
♥ Do have faith in what you're doing.