c**y 发帖数: 172 | 1 1.给一个uint64_t的a和一个uint64_t的b,找到最小的一个数(比数a大),而且是b的
整数倍。注b一定大于0,而且是2的整数倍,例如2,4,8,16,32等等。a是任意。
例如,
如果 a = 4, b = 4, 那么返回4
a = 5, b = 8, 返回8
a = 9, b = 8, 返回16
2.在键入"ping www.google.com"后,ping的过程是如何发生的,越详细越好。
3.给一个随机的地址0x42EF86CA,C程序里对这个地址做了一个dereference,导致程序
crash,请解释这个derefence为何会导致程序crash。 |
p*****2 发帖数: 21240 | |
t*********h 发帖数: 941 | 3 for no.3: does dereference always come with data type? if so then maybe data
is not interpretable. another possible is that address points to system
data? i know little about c.
【在 c**y 的大作中提到】 : 1.给一个uint64_t的a和一个uint64_t的b,找到最小的一个数(比数a大),而且是b的 : 整数倍。注b一定大于0,而且是2的整数倍,例如2,4,8,16,32等等。a是任意。 : 例如, : 如果 a = 4, b = 4, 那么返回4 : a = 5, b = 8, 返回8 : a = 9, b = 8, 返回16 : 2.在键入"ping www.google.com"后,ping的过程是如何发生的,越详细越好。 : 3.给一个随机的地址0x42EF86CA,C程序里对这个地址做了一个dereference,导致程序 : crash,请解释这个derefence为何会导致程序crash。
|
r*******e 发帖数: 7583 | 4 跟是不是interpretable没关系
dereference random pointer导致segmentation fault
进程会收到SIGSEGV,对应的signal handle就是core dump & terminate
data
是b的
程序
【在 t*********h 的大作中提到】 : for no.3: does dereference always come with data type? if so then maybe data : is not interpretable. another possible is that address points to system : data? i know little about c.
|
c******3 发帖数: 296 | 5 第一题: ((a -1) / b + 1) * b |
l*********8 发帖数: 4642 | 6 第一题我感觉是这样:
((a-1)/b + 1) * b;
不过要注意一下overflow.
【在 p*****2 的大作中提到】 : 第一题binary search吧?
|
t*********h 发帖数: 941 | 7 为什么会有seg fault?
【在 r*******e 的大作中提到】 : 跟是不是interpretable没关系 : dereference random pointer导致segmentation fault : 进程会收到SIGSEGV,对应的signal handle就是core dump & terminate : : data : 是b的 : 程序
|
r*******e 发帖数: 7583 | 8 page table记录了哪些memory page是分配给哪些process的
一个process企图access没有被分配的page或者分配给其他process的page
就会seg fault
【在 t*********h 的大作中提到】 : 为什么会有seg fault?
|
f********y 发帖数: 120 | 9 第一题没考虑overflow的做法
int high = (~b + 1) & a;
int low = (b - 1) & a;
if (low > 0) {
low = b;
}
return high + low;
【在 c**y 的大作中提到】 : 1.给一个uint64_t的a和一个uint64_t的b,找到最小的一个数(比数a大),而且是b的 : 整数倍。注b一定大于0,而且是2的整数倍,例如2,4,8,16,32等等。a是任意。 : 例如, : 如果 a = 4, b = 4, 那么返回4 : a = 5, b = 8, 返回8 : a = 9, b = 8, 返回16 : 2.在键入"ping www.google.com"后,ping的过程是如何发生的,越详细越好。 : 3.给一个随机的地址0x42EF86CA,C程序里对这个地址做了一个dereference,导致程序 : crash,请解释这个derefence为何会导致程序crash。
|
s******c 发帖数: 1920 | 10 这是virtual memory address, 没法访问其他process的address space的
segfault 是因为企图访问被禁止访问的memory segment
【在 r*******e 的大作中提到】 : page table记录了哪些memory page是分配给哪些process的 : 一个process企图access没有被分配的page或者分配给其他process的page : 就会seg fault
|
|
|
s*****n 发帖数: 5488 | 11 应该是high + b吧
【在 f********y 的大作中提到】 : 第一题没考虑overflow的做法 : int high = (~b + 1) & a; : int low = (b - 1) & a; : if (low > 0) { : low = b; : } : return high + low;
|
s*****n 发帖数: 5488 | 12 跑个例子:
a = 00001110
b = 00000100
~b+1 = 11111100
c = (~b + 1) & a = 00001100
那么c比a小00000010
加上一个b是最小的b被整数
不过大牛的第一个式子很好。虽然我想到这题是x&(x-1)知识的变体,但是想第一个式
子还是花了10多分钟,多年不写c code, 老了,这题考我就挂了。看上去楼主面的是
网络组,都是很底层的东西。
【在 s*****n 的大作中提到】 : 应该是high + b吧
|
r*******e 发帖数: 7583 | 13 你说的没错
但是seg fault是个legacy concept
现在系统的memory protection是以page为单位的
invalid access to pages 也是产生SIGSEGV,但实际上是page fault的一种
只不过还是沿用原来的老叫法,叫seg fault
【在 s******c 的大作中提到】 : 这是virtual memory address, 没法访问其他process的address space的 : segfault 是因为企图访问被禁止访问的memory segment
|
p*****2 发帖数: 21240 | 14
process里不是应该是virtual memory space吗?怎么能访问到其他process的page?
【在 r*******e 的大作中提到】 : page table记录了哪些memory page是分配给哪些process的 : 一个process企图access没有被分配的page或者分配给其他process的page : 就会seg fault
|
p*****2 发帖数: 21240 | 15
大牛说的是
【在 l*********8 的大作中提到】 : 第一题我感觉是这样: : ((a-1)/b + 1) * b; : 不过要注意一下overflow.
|
S**I 发帖数: 15689 | 16 越界访问的时候对任何page提出访问请求都是有可能的。
【在 p*****2 的大作中提到】 : : 大牛说的是
|
p*****2 发帖数: 21240 | 17
什么算越界访问呢?我记得windows上process不会越界到其他process的memory space
呀。因为都是virtual的。
【在 S**I 的大作中提到】 : 越界访问的时候对任何page提出访问请求都是有可能的。
|
s********k 发帖数: 6180 | 18 比如user level的访问kernel?还有就是指向data的pointer访问到code或者const之类
的?
space
【在 p*****2 的大作中提到】 : : 什么算越界访问呢?我记得windows上process不会越界到其他process的memory space : 呀。因为都是virtual的。
|
q******r 发帖数: 9 | 19 可以解释一下吗?
a = 10, b = 3 结果好像不对。
【在 f********y 的大作中提到】 : 第一题没考虑overflow的做法 : int high = (~b + 1) & a; : int low = (b - 1) & a; : if (low > 0) { : low = b; : } : return high + low;
|
p*****2 发帖数: 21240 | 20
嗯。
【在 s********k 的大作中提到】 : 比如user level的访问kernel?还有就是指向data的pointer访问到code或者const之类 : 的? : : space
|
|
|
d***n 发帖数: 832 | 21 第一题可运行C# code,题目给出的test cases都过
不过我觉得我理解有误,因为b是2的整数倍这条信息没有用到
public static Int64 GetNumber(Int64 a, Int64 b)
{
if (a <= b) return b;
Int64 rem = b-a%b;
if((Int64.MaxValue - rem) < a)
{
throw new ArgumentOutOfRangeException();
}
return a + rem;
}
第三题在windows叫access violation。segmentation fault应该是unix的概念而且很
老了。 |
w***y 发帖数: 6251 | 22 没看懂第一题想考什么//汗
能不能详细解释一下啊 |
p*****2 发帖数: 21240 | 23
嗯。AV
【在 d***n 的大作中提到】 : 第一题可运行C# code,题目给出的test cases都过 : 不过我觉得我理解有误,因为b是2的整数倍这条信息没有用到 : public static Int64 GetNumber(Int64 a, Int64 b) : { : if (a <= b) return b; : Int64 rem = b-a%b; : if((Int64.MaxValue - rem) < a) : { : throw new ArgumentOutOfRangeException(); : }
|
s******o 发帖数: 78 | 24 第一题不能左移b,然后和a比大小?
c = b;
while (c
if (c >= 0x8000000000000000) return 0;
c = c<<1;
return c; |