小编Gab*_*是好人的帖子

非阻塞I/O真的比多线程阻塞I/O快吗?怎么样?

我在网上搜索了一些关于阻止I/O和非阻塞I/O的技术细节,我发现有几个人说非阻塞I/O比阻塞I/O更快.例如,在本文档中.

如果我使用阻塞I/O,那么当然阻塞的线程当然不会做任何其他事情......因为它被阻止了.但是一旦线程开始被阻塞,操作系统就可以切换到另一个线程而不会切换回来,直到阻塞的线程有事情要做.因此,只要系统上有另一个需要CPU并且没有被阻塞的线程,与基于事件的非阻塞方法相比,不应该有更多的CPU空闲时间,是吗?

除了减少CPU空闲时间之外,我还看到了另外一个选项,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程所带来的开销.但是怎么做呢?并且开销是否足以显示可衡量的影响?以下是关于如何将其工作的想法:

  1. 要加载文件的内容,应用程序将此任务委托给基于事件的i/o框架,并传递回调函数和文件名
  2. 事件框架委托给操作系统,该操作系统编程硬盘的DMA控制器以将文件直接写入存储器
  3. 事件框架允许运行更多代码.
  4. 完成磁盘到存储器的复制后,DMA控制器会产生中断.
  5. 操作系统的中断处理程序通知基于事件的i/o框架有关文件被完全加载到内存中的信息.它是如何做到的?使用信号??
  6. 当前在事件I/O框架内运行的代码完成.
  7. 基于事件的i/o框架检查其队列并从步骤5中查看操作系统的消息,并执行它在步骤1中获得的回调.

它是如何工作的?如果没有,它是如何工作的?这意味着事件系统可以在不需要显式触摸堆栈的情况下工作(例如需要备份堆栈并在切换线程时将另一个线程的堆栈复制到内存中的真实调度程序)?这实际节省了多少时间?还有更多吗?

io multithreading nonblocking blocking

111
推荐指数
4
解决办法
4万
查看次数

配置Maven为不同的J2SE版本使用不同的JDK?

我想配置Maven2使用sun-java6-jdk构建Java SE 1.6模块,并使用openjdk-7构建Java SE 1.7模块.可能吗?

然后Maven2应该自动选择正确的JDK来在一个命令中构建不同的模块.

例如,它应该是

$ mvn package
Run Code Online (Sandbox Code Playgroud)

代替

$ cd module1
$ update-alternatives ... jdk6 ...
$ mvn package
...
$ cd module2
$ update-alternatives ... jdk7 ...
$ mvn package
Run Code Online (Sandbox Code Playgroud)

PS这是一无所知的pom.xml文件,这些文件已经设置maven-compiler-plugin不同<source>,<target>价值观不同的模块.如果我选择使用openjdk-7,Maven2将生成1.6版本的类文件,但是使用openjdk-7而不是sun-java6-jdk.问题是如何配置Java SE配置文件.

maven-2

34
推荐指数
2
解决办法
6万
查看次数

Angularjs承诺拒绝链接

我需要创建链式承诺:

var deferred = $q.defer();
$timeout(function() {
    deferred.reject({result: 'errror'});
}, 3000);
deferred.promise.then(angular.noop, function errorHandler(result) {
    //some actions
    return result;
}).then(function successCallback(result) {
    console.log('what do I do here?');
    return result;
}, function errorCallback(result) {
   $scope.result= result;
   return result;
});
Run Code Online (Sandbox Code Playgroud)

如果我将errorCallback放入第一个then,则第二个then将被解析,并且将调用其successCallback.但如果我删除,errorHandler那么第二个承诺将被拒绝.

根据Angular JS文档,传播拒绝的唯一方法是返回$q.reject();并且看起来并不明显,特别是因为$q即使不需要也必须注入服务;

它也可以通过抛出异常来完成errorHandler,但它将异常跟踪写入控制台,这并不好.

还有另一种选择以明确的方式做到这一点吗?那是什么原因?为什么这样做?在这种情况下,当前的行为可能有用吗?

javascript promise angularjs

29
推荐指数
2
解决办法
4万
查看次数

什么加载java系统类加载器?

我们知道我们可以用以下方式覆盖System 类加载器:

java -Djava.system.class.loader=com.test.MyClassLoader xxx
Run Code Online (Sandbox Code Playgroud)

那么,因为com.test.MyClassLoader它本身就是一个类,它是由谁加载的?

我们如何获得这个"meta"类加载器的类文件?

java classloader

27
推荐指数
3
解决办法
3万
查看次数

C++中字符串文字的数据类型是什么?

有人质疑C++中字符串文字的数据类型.

很多人都引用了这个标准:

窄字符串文字的类型为"n const char数组",其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)

我在main函数中写了以下语句:

  char cstring[]= "hellohellohellohellohellohello";
Run Code Online (Sandbox Code Playgroud)

但我找不到任何字符串文字作为静态数据存储在程序集中.事实上,程序集显示字符串被分解并直接"存储"在指令中.

    movl    $1819043176, -48(%rbp)
    movl    $1818585199, -44(%rbp)
    movl    $1701343084, -40(%rbp)
    movl    $1752132716, -36(%rbp)
    movl    $1869376613, -32(%rbp)
    movl    $1819043176, -28(%rbp)
    movl    $1818585199, -24(%rbp)
    movw    $28524, -20(%rbp)
    movb    $0, -18(%rbp)
Run Code Online (Sandbox Code Playgroud)

虽然全局范围中的类似语句因此将字符串存储为静态数据.

char cstring1[] = "hellohellohellohellohellohello";
Run Code Online (Sandbox Code Playgroud)

大会

cstring1:
    .string "hellohellohellohellohellohello"
Run Code Online (Sandbox Code Playgroud)

以上示例可在此处在线获取.

所以这似乎不符合引用的标准.也许这里引用的内容有一些例外情况?

c++ string type-conversion

16
推荐指数
2
解决办法
1764
查看次数

为什么我们在编译期间需要共享库

为什么在可执行文件的编译期间我们需要共享库的存在?我的理由是,由于共享库未包含在我的可执行文件中并在运行时加载,因此在编译期间不应该需要它.还是我错过了什么?

#include<stdio.h>
int addNumbers(int, int); //prototype should be enough, no? 
int main(int argc, char* argv[]){
  int sum = addNumbers(1,2);
  printf("sum is %d\n", sum);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有libfoo.so我当前的目录,但我改名libfar.so,发现在编译时需要共享库,或者它不能编译.

gcc -o main main.c -L. -lfoomain.c:(.text+0x28): undefiend reference to 'addNumber'

我认为只有共享库的名称才足够.不需要共享库本身,因为它在LD_LIBRARY_PATH中找到并在运行时动态加载.除了共享库的名称之外还需要其他东西吗?

c gcc compilation shared-libraries dynamic-linking

12
推荐指数
1
解决办法
1970
查看次数

子文件夹允许的最大深度是多少?

起初我想问"Windows操作系统允许的最大子文件夹是什么"

但后来我想也许我的网络托管服务提供商不是在Windows上,而是在Linux或其他东西上.所以我想问一下,网络托管服务提供商通常会使用的所有主要操作系统的最大允许子文件夹是什么.(说Linux,Mac或Windows会安全吗?)

然后,根据您的经验,网站托管网站是否限制了我们可以制作的子文件夹数量?

(为什么会这样?因为我希望每个用户都有自己的文件夹,以便轻松访问他们的图像.这样可以吗?或者这是不好的做法?编程还是新手.)

linux windows directory macos subdirectory

8
推荐指数
2
解决办法
2万
查看次数

Java中的字符串初始化

  1. String str1;
  2. String str2 = null;
  3. String str3 = "";
  4. String str4 = new String();
  5. String str5 = new String("");

我知道对于上面的第三次初始化,字符串对象在字符串池中初始化,第四次与字符串池无关.

1.和2.有什么区别?如果我将其str1视为指针变量,它存储的是一个从未被JVM或OS使用的特定内存地址?

4和5之间有区别吗?

当我打印str1str2直接通过System.out.println(str1)System.out.println(str2),因为str1,我甚至无法传递编译.因为str2,编译是正常的,我得到"null"和控制台窗口中的输出.为什么?

在@aioobe回答之后编辑:更多问题:

我想更多地了解"null".因为str2(引用变量)就像一个指针变量,所以它应该有一些东西(0/1位)(在这个指针变量占用的内存中).当它被初始化为null时,它是全0位还是null的字节码全为零?另一个问题是,如果我调用toString()方法上str2str2.toString(),我得到了在运行时一个空指针错误.那么JVM是否检查引用变量是否为空?JVM如何知道它是null?JVM检查位str2

大约一个问题在Java中: 空的级联和字符串文字

java string

8
推荐指数
1
解决办法
1万
查看次数

Maven选择间接依赖的不一致版本:为什么,以及如何预防?

我们遇到了Maven选择间接依赖的不一致版本的情况,我想了解为什么以及如何在将来防止这种情况.

我们的pom.xml文件具有以下依赖项:

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-jpa</artifactId>
  <version>1.1.0.RELEASE</version>
</dependency> 
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但没有直接依赖于spring-core.

两者都依赖于spring-core:spring-web 3.1.2.RELEASE依赖于spring-core 3.1.2.RELEASE(参见其pom-file),而spring-data-jpa 1.1.0.RELEASE依赖于任意3. x版本的spring-core(准确[3.0.7.RELEASE,4.0.0.RELEASE],请参阅其pom文件).

结合两者,我希望Maven选择spring-core版本3.1.2.RELEASE.但事实并非如此.相反,它选择范围[3.0.7.RELEASE,4.0.0.RELEASE)中的最高值,目前为3.2.0.RELEASE.

(复制场景:将上面的pom.xml文件(gist)放在它自己的目录中,然后运行mvn dependency:tree -Dverbose=true:对我来说结果就是这个树(gist).我在Linux和Maven 3.0上得到了相同的结果. 4在Windows上.)

这似乎是错误的,因为它是不一致的:使用spring-web的pom文件不允许的spring-core版本.

(当spring-core 3.2.0.RC1可用时,我们就会发生这种情况:在下一次更新中它突然被选中,我们很幸运,由于spring-core 3.1和3.2之间的不兼容变化,我们遇到了构建错误.但是下次我们可能没有那么幸运,并且有很难追查的运行时错误.)

Urghh:我刚刚注意到的顺序<dependency>报关事宜:如果我把弹簧网,然后再弹簧核心3.1.2.RELEASE 选中.是什么赋予了?

问题:我们如何让Maven选择间接依赖的一致版本,或者至少警告它是否做出与pom文件中指定的版本相反的选择?

更新:我在这里要求一般解决方案.对于这个特定的情况,我知道我可以通过添加依赖项来获得正确的行为<dependencyManagement>,指定我总是想要spring-core 3.1.2.RELEASE.但是,我希望Maven在没有这些具体声明的情况下做Right Thing(TM).

dependency-management maven

5
推荐指数
1
解决办法
892
查看次数

null String对象和字符串文字的串联

这是关于Java中字符串初始化的一些先前问题的后续问题.

经过Java的一些小测试,我面临以下问题:

为什么我可以执行此语句

String concatenated = str2 + " a_literal_string";
Run Code Online (Sandbox Code Playgroud)

str2一个String初始化对象null(String str2 = null;),但我不能调用方法toString()str2?那么Java如何进行空String对象和字符串文字的连接

顺便说一下,我还尝试将一个初始化为null的字符串"a_literal_string"和字符串文字连接起来,我"null a_literal_string"在控制台中也有同样的东西.那么无论哪种null都给出同样的东西?

PS:System.out.println(concatenated);空a_literal_string作为控制台输出.

java string null

5
推荐指数
1
解决办法
196
查看次数